5

PDO 準備済みステートメントを使用してキーワード検索を作成しようとしています。理想的には、LIKE 演算子を使用して、フィールド値内の部分文字列を検索したいと考えています。これが私のコードです:

$statement = $this->db->prepare("select * from whatever where title like ? or author like ?");
$statement->execute(array("%$titleKeyword%","%$authorKeyword%"));
$rows = $statement->fetchAll(PDO::FETCH_ASSOC);

残念ながら、これを試してみると $rows は常に空です。ただし、SQL を phpMyAdmin にコピーし、「%keyword%」をそれぞれの ? シンボル、それは正常に動作します(使用されたキーワードが存在する場合に結果が得られます)。

次のコードも試しました。

$statement = $this->db->prepare("select * from whatever where title like :titleKeyword or author like :authorKeyword");
$statement->bindValue(":titleKeyword",  '%'.$titleKeyword.'%',  PDO::PARAM_STR);
$statement->bindValue(":authorKeyword", '%'.$authorKeyword.'%', PDO::PARAM_STR);
$statement->execute();
$rows = $statement->fetchAll(PDO::FETCH_ASSOC);

SQL自体(事前に準備されたステートメント)ではなく、パラメーターをバインドするときに%を含めることになっている別の質問を読みましたが、それは機能しません。

(サニタイズを行った後) キーワードを SQL に直接挿入するという手段に頼ることもできますが、準備済みステートメントを使用したいと考えています。どんな助けでも大歓迎です。

4

2 に答える 2

3

これは実際に私にとってはうまくいきます:

$stmt = $pdo->prepare("select * from t where c like ?");
$stmt->execute(array("70%"));
print_r($stmt->fetchAll());

どのPHPバージョンを使用していますか?

于 2012-10-17T08:12:45.683 に答える
1

助けてくれたステファンとテリーに感謝します。

bindValue() の代わりに bindParam() に切り替えることで、自分で問題を解決することになりました。bindValue() でそれができなかった理由はわかりませんが、今は疲れすぎて気にすることができません。

于 2012-10-17T08:45:40.313 に答える