web-dev-qa-db-ja.com

特定のDBフィールドの値を表示する

私はここで何が起こっているのかを理解しようとしています-RsTicketsProを使用していて、データベースのカスタムフィールドセクションから特定の値を取得しようとしています。私は彼らのサポートに連絡しました、そしてこれは彼らが推奨したものです:

$db = JFactory::getDBO();
$db->setQuery("SELECT `value` FROM #__rsticketspro_custom_fields_values WHERE `ticket_id`='".$item->id."' AND `custom_field_id`=7");
echo $db->loadResult();

わかりましたので、コードを調整して、これをテーブルの所定の場所にポップし、この特定の値を表示します。

<td align="center" class="rst_cell_assigned center">
<?php
$db = JFactory::getDBO();
$db->setQuery("SELECT 'value' FROM #__rsticketspro_custom_fields_values WHERE 'ticket_id'='".$item->id."' AND 'custom_field_id'=4");
echo $db->loadResult();
?>
</td>

データベースからプルしたい対応するフィールドと一致するようにカスタムフィールドID値を更新しましたが、フロントエンドで表示すると、空白のみが表示され、エラーメッセージも何も表示されません。

誰かが私が間違っていることを見つけましたか?

EDIT:CURRENT CODE IM WORKING WITH

<?php
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select(`value`);
$query->from($db->quoteName('#__rsticketspro_custom_fields_values'));
$query->where($db->quoteName(`ticket_id`)." = ".$db->quote('".$item->id."' AND `custom_field_id`=4"));
$db->setQuery($query);
$result = $db->loadResult();
echo $query;
echo $db->getErrorMsg();
?>

noteそのため、このページはもはやページをロードしません、ハハ。 #不合格

Table being used

1
Brandon

これが直接コピーペーストである場合、mysqlエラーが発生します。

_SELECT 'value' FROM #__rsticketspro_custom_fields_values WHERE 'ticket_id'='".$item->id."' AND 'custom_field_id'=4_

_'value'_および_'ticket_id'_は、引用符ではなくバックティックで囲む必要があります。

echo $db->getErrorMsg();の直後にecho $db->loadResult();を実行したとしたら、MySqlエラーがあることがわかります。

クエリラッパーを使用する2番目の部分で、_echo $query;_の出力を投稿できますか?

2
David Hayes

この問題の原因は、selectステートメントにquoteNameがないことと、whereステートメントの形式に誤りがあるためと考えられます。

また、チェーンを使用する必要があります(およびquoteのqnエイリアス、quoteのq)

これは、Joomlaクエリビルダー構文を使用してクエリを実行する正しい方法です。

$db = JFactory::getDbo();

$query = $db->getQuery(true);
$query->select($db->qn('value'))
      ->from($db->qn('#__rsticketspro_custom_fields_values'))
      ->where($db->qn('ticket_id') . " = " . $db->q($item->id))
      ->where($db->qn('custom_field_id') . " = " . $db->q(4));
$db->setQuery($query);

$result = $db->loadResult();
4
Walt Sorensen

ああ!わかった!!!元のコードに戻って、正しく機能させることができました。

<?php
$db = JFactory::getDBO();
$db->setQuery("SELECT `value` FROM #__rsticketspro_custom_fields_values WHERE `ticket_id`='".$item->id."' AND `custom_field_id`=4");
$result = $db->loadResult();
echo $db->loadResult();
?>
1
Brandon

JoomlaのPHPコーディング標準は言う:

テーブル名とテーブル列をエスケープするには、テーブル名とテーブル列名を常にquoteName()メソッドで囲む必要があります。クエリでチェックされるフィールド値は、値をデータベースに渡す前にエスケープするために、常にquote()メソッドで囲む必要があります。クエリでチェックされる整数フィールド値も(int)に型キャストする必要があります。

この行に近づきすぎると、コードを不必要に呼び出したり、醜い肥大したコードを作成したりすることがよくあります。

実際に引用する必要のあるテーブル名や列名はなく、整数変数をクエリに書き込む前に整数型としてキャストする必要があるため、これをお勧めします...

*注valueはMySQLキーワードですが、予約済みキーワードではないため、バックティックは必要ありません。 https://dev.mysql.com/doc/refman/5.5/en/keywords.html#keywords-5-5-detailed-V

_$db = JFactory::getDbo();
$query = $db->getQuery(true)
    ->select("value")
    ->from("#__rsticketspro_custom_fields_values")
    ->where([
        "ticket_id = " . (int)$item->id,
        "custom_field_id = 4"
    ]);
$db->setQuery($query);
$result = $db->loadResult();
_
  • wHERE句は条件の配列を受け取ります
  • メソッドチェーンはgetQuery()メソッドから開始して、各行の先頭に_$query_を記述しないようにすることができます
  • 静的な値を引用またはキャストしても意味がありません_4_

上記のスニペットは、Joomlaのクエリ構築メソッドを使用しているときに、不要な引用呼び出しなしで記述できるのと同じくらい安全です。

1
mickmackusa