PHP の PDO クラス (MySQL ドライバー) を操作する場合、プリペアド ステートメントを使用して MySQL LIKE クエリを実行すると、複雑な作業になる可能性があります。一見単純な構文では、望ましい結果が得られないことがよくあります。
MySQL クライアントを使用してデータをシームレスに取得する次のクエリを考えてみましょう:
SELECT ... FROM hs ... WHERE hs.hs_text LIKE "%searchTerm%" LIMIT 25;
The Conundrum
ただし、このクエリを PHP に移植すると、何も返せないというイライラが生じるかもしれません。試みた構文に関係なく、結果が表示されます。以下のコードは、この問題を示しています。
$sql = 'SELECT ... FROM hs ... WHERE hs.hs_text LIKE :searchTerm LIMIT 25'; $prep = $dbh->prepare($sql); $ret = $prep->execute(array(':searchTerm' => '"%'.$searchTerm.'%"'));
検索語を CONCAT('%', ?, '%')、"%:searchTerm%"、または ":searchTerm" として指定しようとしますが、それに応じて実行行を変更しても無駄であることがわかります。
解決策
この難題を解決する鍵は、準備されたステートメントがデータをどのように処理するかを理解することにあります。これらはクエリとは別にデータを伝達するため、値を埋め込むときに引用符が必要なくなります。
したがって、正しい解決策は次のとおりです。
$prep = $dbh->prepare($sql); $ret = $prep->execute(array(':searchTerm' => '%'.$searchTerm.'%'));
検索語パラメーターから囲んでいる二重引用符を削除することによってを使用すると、プリペアド ステートメントの力を利用して、LIKE クエリを正常に実行できるようになります。
以上がPHP PDO プリペアド ステートメントが MySQL LIKE クエリで機能しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。