ホームページ > データベース > mysql チュートリアル > PHP PDO プリペアド ステートメントが MySQL LIKE クエリで機能しないのはなぜですか?

PHP PDO プリペアド ステートメントが MySQL LIKE クエリで機能しないのはなぜですか?

Patricia Arquette
リリース: 2024-11-30 10:41:13
オリジナル
510 人が閲覧しました

Why Doesn't My PHP PDO Prepared Statement Work with MySQL LIKE Queries?

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

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート