dポイントプレゼントキャンペーン実施中!

like検索の複数キーワードで、プレースホルダを利用するやり方が分からないので教えてください

<やりたいこと>
・複数キーワード検索(東京 hoge)

<現状、出来ていること>
・1単語キーワード検索(東京)

<分からないこと>
・配列として処理すれば良いみたいなのですが、プレースホルダとの絡みでどうすればよいのか分かりません

<環境>
・MySQL
・PDO

<現状コード抜粋>
public function search($keyword)
 {
 $sql = "
  SELECT a.*
    FROM hoge a
     WHERE (honbun LIKE :keyword)
     ";
 $keyword ="%".$keyword."%";

A 回答 (1件)

プレースホルダを使うにしても使わないにしても、SQL文を組み立てる時点ではキーワードの数は既知のハズです(空白やカンマでexplodeするなどの前処理は終わっているハズです)。



なので、必要な数だけプレースホルダを生成すればいいと思います。

// キーワードの組み立て
$temp = explode(' ', $_POST['keyword']);
$keyword = array();
foreach ($temp as $val) {
if (trim($val) !== '') { $keyword[] = $val; }
}
if (count($keyword) === 0) { die('no keyword'); } // 適宜処理するww

$sql = 'select * from a';
$where = array();
$bind = array();
$i = 0;
foreach ($keyword as $val) {
$where[] = '(honbun like ?)';
$bind[] = '%' . $val . '%';
}
$sql .= ' where ' . implode('and', $where);
// デバッグ用ここから
print $sql . "<hr />";
print_r($bind);
exit;
// デバッグ用ここまで
$stmt = $dbh->prepare($sql);
$stmt->execute($bind);
    • good
    • 0
この回答へのお礼

回答ありがとうございました。おかげで完璧に動作するようになりました!

>foreach ($keyword as $val) {
>$where[] = '(honbun like ?)';
>$bind[] = '%' . $val . '%';
>}
>$sql .= ' where ' . implode('and', $where);
特に、ここら辺が参考になりましたー

お礼日時:2012/09/21 21:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!