「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > PDO プリペアド ステートメントが LIKE クエリで結果を返せないのはなぜですか?

PDO プリペアド ステートメントが LIKE クエリで結果を返せないのはなぜですか?

2024 年 11 月 3 日に公開
ブラウズ:241

Why Does PDO Prepared Statement Fail to Return Results with LIKE Query?

PHP の PDO プリペアド ステートメント: MySQL LIKE クエリの問題

MySQL を使用した PHP の PDO クラスは、パラメータ化されたクエリを使用して SQL ステートメントを実行するメカニズムを提供します、セキュリティとパフォーマンスが向上します。ただし、LIKE クエリの使用時に問題が発生する可能性があります。

問題: PDO プリペアド ステートメントが LIKE クエリで結果を返さない

次のようなクエリを実行しようとすると、 PDO を使用:

SELECT *
FROM hs
WHERE hs_text LIKE "%searchTerm%"

結果が返されないことがわかります。

解決策: 正しいパラメータ化

問題は検索用語のパラメータ化が正しくありません。 PHP では、準備されたステートメントは名前付きプレースホルダーを使用するため、異なる構文が必要になります。 LIKE クエリの正しいパラメータ化は次のとおりです。

$prep = $dbh->prepare($sql);
$ret = $prep->execute(array(':searchTerm' => '%'.$searchTerm.'%'));

説明:

準備されたステートメントはデータをクエリから分離し、プレースホルダーを使用します。したがって、検索語を二重引用符で囲んだり、文字列の連結を実行したりする必要はありません。

その他のよくある間違い:

WHERE hs_text LIKE :searchTerm
$ret = $prep->execute(array(':searchTerm' => '"%'.$searchTerm.'%"'));  // Incorrect
  • このアプローチは不必要な二重引用符を追加するため間違っています。
WHERE hs_text LIKE CONCAT(\'%\', ?, \'%\')
$ret = $prep->execute(array($searchTerm));  // Incorrect
  • CONCAT を使用してクエリ内の検索語をラップすることは、パラメータ化には必要ありません。

正しいパラメータ化を使用すると、次を使用して LIKE クエリを正常に実行できます。 PDO は PHP でステートメントを準備しました。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3