###AND条件でDBに検索をかけたい
PHPで任意の文字列を含むレコードを検索するシステムを作っています。
文字列は半角スペースで分解して、2つ以上単語でAND検索をかけたい。
SQLには、プリペアドステートメントとして検索単語を一つづつ入れています。
###発生している問題・エラーメッセージ
しかし、検索条件をいくつ入力しても、一番うしろに記述した単語でしか検索できません。
(例)
"4645 6546"で検索 -> 結果は"6546"での検索結果のみ
多分プリペアドステートメントに同じ名前の変数を使いまわしてるからだと思いますが、解決策が見えません。
###該当のソースコード
sql
1 //基本のSQL 2 $sql = (" 3 SELECT DISTINCT * 4 FROM `".POST_TABLE."` 5 INNER JOIN `".CODE_TABLE."` 6 USING ( `post_id` ) 7 WHERE `date` >= :date1 8 AND `date` < :date2 9 ");
上記の$sqlに下記のWHERE部分を繋げます。
受け付けた検索ワードは、$sqldb['words'][]に配列として1つづつ入っています。
なので、検索単語の個数分(= count($sqldb['words']))ループして、WHERE条件を繋げます。
PHP
1//検索文字列の処理 2 $searchWordNum = count($sqldb['words']); 3 for($i=0; $searchWordNum > $i; $i++){ 4 $sql .= " AND ( 5 `number` LIKE :search${i} OR 6 `code` LIKE :search${i}) "; 7 }
プリペアドステートメントの発行(問題部分の抜粋)
PHP
1 for($i=0; $searchWordNum > $i; $i++){ 2 $searchWord = '%'.$sqldb['words'][$i].'%'; 3 $stmt-> bindParam(':search'.$i, $searchWord, PDO::PARAM_STR); 4 }
###試したこと
上のプリペアドステートメント部分を下のように書き換えると、うまく動きます。(検索単語の個数が2つのときだけ)
PHP
1 $searchWord0 = '%'.$sqldb['words'][0].'%'; 2 $stmt-> bindParam(':search0', $searchWord0, PDO::PARAM_STR); 3 4 $searchWord1 = '%'.$sqldb['words'][1].'%'; 5 $stmt-> bindParam(':search1', $searchWord1, PDO::PARAM_STR); 6
こうするとだめです。
PHP
1 $searchWord = '%'.$sqldb['words'][0].'%'; 2 $stmt-> bindParam(':search0', $searchWord, PDO::PARAM_STR); 3 4 $searchWord = '%'.$sqldb['words'][1].'%'; 5 $stmt-> bindParam(':search1', $searchWord, PDO::PARAM_STR); 6
よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/01 11:39 編集