- ベストアンサー
php複数キーワード検索
いつもお世話になっております。 php+MySQLにて検索機能を作成しています。 キーワードが1つの場合には以下のスクリプトで正常に動作していますが、全角あるいは半角のスペースによって複数キーワードを入れた場合にも検索が行われるようにしたいと思っています。 現在のスクリプト $word=$_POST["seek"]; $word=stripslashes($word); $con_word=mb_convert_encoding($word,"EUC-JP","auto"); //データベース接続がここに入ります $sql="SELECT words,name,id FROM profile WHERE words like '%$con_word%'"; ここで、スペースを" AND "に置き換えるために、 $word=preg_replace('/\s+/',' ',$word); $word=preg_replace('/ /',' AND ',$word); あるいは $word=mb_convert_kana($word,"as","EUC-JP"); $word=preg_replace('/ /',' AND ',$word); などを試してみたのですがうまく動作しません。 どなたか問題点を具体的にご指摘いただけないでしょうか。 よろしくお願いいたします。 *環境 php mysql レンタルサーバ(ロリポップ)
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
よくよく考えたらAND条件ですね。なら正規表現ではなく条件の羅列です。 <? $word="a b c"; $whereWord=""; foreach (split(' ',$word) as $val){ if(!empty($val)) $whereWord.=($whereWord==""?"":" AND ")."`words` like '%{$val}%'"; } if(!empty($whereWord)) $whereWord="OR ({$whereWord})"; $sql="SELECT words,name,id FROM profile WHERE 0 {$whereWord}"; print $sql; ?> (1)基本的には検索語がない場合は値を返さないようにします WHERE 0 (2)そこに検索条件をORで繋ぎます。 (3)スペースが、検索語の先頭や最後にきたり連続したりする場合を 想定して、$valになにかデータが入っているかをチェックします。 if(!empty($val))
その他の回答 (3)
- yambejp
- ベストアンサー率51% (3827/7415)
とりあえず今回の件は#1のお礼でやっている方式は あまりよくないです。 #2で回答した正規表現でやるならこんな感じ $word=str_replace(' ','|',$word); $sql="SELECT words,name,id FROM profile WHERE words REGEXP'$word'"; まぁエスケープ処理が必要だったりで、このままだと多少 問題がありますが、総じてmysqlの正規表現で処理することができます。
- yambejp
- ベストアンサー率51% (3827/7415)
PHPはともかく・・・ SQLでLIKE '%hoge%'はインデックスきかないですけど・・・ ほんとにそんなのでよいのでしょうか? どうせ効率的でないなら正規表現にしてしまう方がよいかも http://dev.mysql.com/doc/refman/5.1/ja/regexp.html
お礼
回答ありがとうございます。 やや抽象的なご指摘のため、意図されるものが理解できませんでした。 質問内容の通り、まだまだ未熟ゆえご容赦いただきたいと思うのですが、参考URLに関しても理解できませんでした。 地道に数年間勉強すればいいのかもしれませんが、それだけの時間もなく、実際にwebを作ってゆく上で必要な技術を1つ1つ身につけているところですので、ご指摘の件に関しましては、将来的に必要になるであろうポイントとして心に留めておきたいと思います。 ありがとうございました。
- tkc2007
- ベストアンサー率50% (2/4)
とりあえず、うまく動作しない時の$sqlをecho なりprint なりで表示してみて下さい。 それと複数条件でのSELECT文を書いてみてください。 比べてみた時にPHPからのSELECT文は思った通りのSELECT文になってるでしょうか? WHERE以降は条件が1つなら WHERE words like '%aaa%'" でOKですが、複数の条件を指定したいのであれば WHERE words like '%aaa%' AND words like '%bbb%' のようになっていないといけないので、 スペースをANDに変換するだけではこの形にはならないですよね? なので、うまく動作しなかったんですね。 それと、スペースを変換するだけだと、ユーザーが検索文字の最後にスペースを入れてしまった場合にエラーになると思います。 その辺りの配慮も必要になりますね。
お礼
回答ありがとうございます。 ご指摘の 『WHERE words like '%aaa%' AND words like '%bbb%'』 この表現に思い至りませんでした。 以下のように変えたところ、意図したとおりに動作しました。 ありがとうございます。 また、ご指摘のように、キーワード間以外にスペースが入る場合についても考慮する必要は感じておりますが、現段階ではそこまで緻密でなくともよいので(仕事のwebではないため)、もう少しスキルアップしたら(gooで聞かなくてもいいくらいのレベルになったら)改変しようと思います。 重ね重ねありがとうございました。 $word=mb_convert_kana($word,"as","SJIS"); $word=preg_replace('/ /','%\' AND words like \'%',$word);
お礼
度重なるご回答に感謝いたします。 #1のお礼にて記入したスクリプトですが、ご想像どおり不完全なもので、入力内容によってはスクリプトエラーが出てしまい、実用に耐えるものではありませんでした。 未だにその原因も分からず、「条件の羅列」と「正規表現」の違いも理解できないのですが、いただいたスクリプトにて望みどおりの機能を実装することができました。 本当にありがとうございます。