11

こういうことをしようと...

WHERE username LIKE '%$str%'

...しかし、バインドされたパラメーターを PDO の準備済みステートメントに使用しています。例えば:

$query = $db->prepare("select * from comments where comment like :search");
$query->bindParam(':search', $str);
$query->execute();

一重引用符と % 記号のさまざまな順列を試しましたが、うまくいきません。

以前のある時点でこれと格闘したことを覚えているようですが、参照が見つかりません。名前付きパラメーターを使用してPDOでこれをうまく行う方法を知っている人はいますか?

4

2 に答える 2

15

ああ。答えを思い出させるphp.netのコメントを見つけました。bindParam が評価される前に値をワイルドカードする必要があります。値を引用する心配はありません。たとえば、これはうまくいきます:

$str = "%$str%";
$query = $db->prepare("select * from comments where comment like :search");
$query->bindParam(':search', $str);
$query->execute();
于 2008-09-13T19:21:09.240 に答える
4

5 年後、他の誰かがこれに出くわした場合に備えて、別の方法を発見しました。受け入れられた解決策は、私の状況では実際には実現可能ではありませんでしたが、この方法でも仕事ができるようです:

$query = $db->prepare("select * FROM table WHERE field LIKE CONCAT('%',:search,'%')");
$query->bindParam(':search', $str);
$query->execute();

関数呼び出しのオーバーヘッドが原因でパフォーマンスが低下するかどうかはわかりませんが、CONCATこれをオプションとして渡したいと思いました。うまくいけば、それは誰かを助けるでしょう。

于 2013-03-13T05:21:57.127 に答える