• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:複数のフィールドにまたがる、ワード検索)

複数のフィールドにまたがる、ワード検索

このQ&Aのポイント
  • 複数のフィールドを対象とした、DB内の検索スクリプトを作成しているが、検索結果が返ってこない
  • 検索スクリプトのコードを記述する際に使用する関数などを教えてほしい
  • mysql_connectとmysql_select_dbを使用してデータベースに接続している

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

$wherestrと言うのは、WHERE区の文字、という変数です。勝手につけた変数なので、$aでもなんでも良いです。 > $sql = "select * from menber where CONCAT($field) like '%$nam%'"; こんな凄い記述法があったんですか(笑。私はやった事がありませんでした。勉強になります。$fieldを結合してから検索すると。。。 この様な場合には(CONCATの使い方は検証してませんので確かめて下さい。) foreach($arr as $data){ $wherearr[] = " ( CONCAT($field) like '%$nam%')" ;//とりあえず配列に } $wherestr = implode(" OR ",$wherearr);// ORで挟みます。 $sql = "select * from menber where $wherstr"; 例えば、キーワード "春 夏"の場合 echo $sql; で、 select * from menber where ( CONCAT(nam,gyoushu,todoufuken,shikugun,…) like '%春%' ) OR ( CONCAT(nam,gyoushu,todoufuken,shikugun,…) like '%夏%' ) となれば良いと思います。 ちなみに、私の場合はCONCATを使った事がありませんので select * from member where ( nam like '%春%' ) OR (gyoshu like '%春%') OR ..... ( nam like '%夏%' ) OR (gyoshu like '%夏%') OR .... のようなながーいSQL文を作成していました。 もっとも、likeだけではなく一致やAND、なんてもの噛ませる場合はこれしか方法がなかったのですが。 おそらくパフォーマンス的には長いSQL分は×でしょうね。 では。

sadacha
質問者

お礼

taketan_mydns_jp様 こんばんは。有難う御座います! 「まずはご挨拶を…」とは思ったものの、何度か設定を繰り返し(この間2時間^^;)、やっと動かすことが出来ました! >例えば、キーワード "春 夏"の場合 >echo $sql; >で、 >select * from menber where ( CONCAT (nam,gyoushu,todoufuken,shikugun,…) like '%春%' ) OR ( CONCAT(nam,gyoushu,todoufuken,shikugun,…) like '%夏%' ) >となれば良いと思います。 などと、確認方法まで教えていただいて…(涙)。有難う御座います。 毎度ながらにも事細かな手解きに感謝しております。 本当、有難う御座いました。

sadacha
質問者

補足

追伸: >もっとも、likeだけではなく一致やAND、なんてもの噛ませる場合はこれしか方法がなかったのですが。 貴重なご意見有難う御座います。 今後に役立たせて頂きます。有難う御座いました。

その他の回答 (2)

回答No.2

> 半角スペースだけとは限らず、全角スペースであったり多くのキーワードを入力して検索することも想定しなければ 理想はそうですが、現実的ではない場合もあります。 恐らく、ほとんどの場合は1ワードで解決すると思いますし。 最初にきちんとポリシーを持って設計をした方が良いと思いますよ。理想だけではいつになっても完結しません(私の場合は特に、後から後からこんな機能があったら、などと湧いてきてしまうので)。 例えば、キーワード数を3つ、と限定する場合なら、 <input type="text" name="key[]" /> <input type="checkbox" name="andor[]" value="1" /> <input type="text" name="key[]" /> <input type="checkbox" name="andor[]" value="1" /> <input type="text" name="key[]" /> のようにして、間にAND/ORのチェックボックスをもうける、と言うような事も出来ます。 インターフェイス的には誰にでも分かるんじゃないかと思います。 スペース区切りでOR検索とする場合でも、 $keywords = mb_convert_kana($_POST[keywords],"s"); のようにして全角スペースを全て半角スペースに変換してやれば前述のようにexplodeで区切る事が可能です。 A OR ( B AND C ) のような検索式でキーワード検索する事も確かに可能ですが。。。実際の使用頻度を考えて絞り込んで設計するのも一つの手だと思います。 また、ドドッと検索された場合に対象カラムでソート(ORDER BY name DESC,gyoushu のような)出来るようにしておけばそれほど不便を感じないものです。 以上、蛇足でした。 一つだけ気づいた事ですが、 > mysql_connect('localhost','root','*******'); とあります。rootユーザ名での接続はあまりオススメできないですね。出来るだけ一般ユーザ、しかも権限を絞った形で接続した方が事故が少ないと思いますよ。念のため。

sadacha
質問者

お礼

taketan_mydns_jp様 すみません!只今、先ほど回答していただいた補足欄へ追加質問をしてしまいました…。ご親切にも新たに回答していただいて居るとは思わず、先ほどアドバイスしていただいたページを開いたまま色々と動作確認をしていたもので…。新たな投函に気付かず失礼いたしました。 以上、長文にての貴重なアドバイスを有難う御座います。こちらも踏まえて流れを考えてみたいと思います。 …とはいえ、先ほどの補足欄からの質問もアドバイスいただけたら大変有難いのですが。。宜しくお願い致します。 追伸:ユーザ名のご指摘、有難う御座います。現在、あくまで大袈裟ではありますが開発段階(勉強段階)なので、これをそのままネット上に公開する予定はないので、とりあえずはこのままでも良いかな?なんて思いながら、そのままになっている状態です。とは言ってもネット上に公開する事を前提で開発すべきなのでしょうか…このような事さえ分からない素人です。。すみません。

回答No.1

半角で区切って複数文字で検索したいと言う事ですか? 提示スクリプトで言えば、半角で区切った文字列そのものが完全一致しないと検索されないのは当たり前です。 aaa bbb とすると nam like '%aaa bbb%' となりますので。 もし、複数文字列を半角で区切ってそれぞれの検索をしたいのなら、 $arr = explode(" ",$search);//半角文字で区切る foreach($arr as $data){ $wherestr .= "( nam like '%{$data}%' )"; $wherestr .= " OR ";//半角スペースならOR、+ならANDとか条件は設定すべき } として、WHERE区に回数分付け加える必要があります。 対象フィールドが2つで、キーワードが3つなら、" xxxx like '%keyword%' " というのがORをはさんで6ツ並ぶわけです。

sadacha
質問者

お礼

taketan_mydns_jp様 こんばんは。いつも貴重なアドバイスを有難う御座います! 言葉足らずではありましたが、検索する際、半角スペースだけとは限らず、全角スペースであったり多くのキーワードを入力して検索することも想定しなければ、、と思ってます。 自身のスキル不足を痛感し、昨日2冊の本を購入し、現在今回の件と平行しながら学び直しているところです。 話が横道それましたが、taketan_mydns_jp様の貴重なアドバイスをヒントに出来ればと考えております。 ご報告も兼ねて、改めてお礼をさせて頂きますので、引き続きご指導賜りたく思います。 いつも有難う御座います。

sadacha
質問者

補足

taketan_mydns_jp様 こんばんは。お世話になっております。 只今、検索スクリプトとしてではなく、動作の確認をしているところなのですが、下記のように全角スペースを半角に直すところまでは出来ました。 ・・・フォームへ入力した文字をechoで出力表示して動作確認しています。 $nam = mb_convert_encoding($nam, 'EUC-JP', 'auto'); $nam = mb_ereg_replace(" ", " ", $nam); $arr = explode(" ",$nam);//半角文字で区切る  ・  ・ そこで、お教え頂いた中に、$wherestrというコードがありますが、これはどういったものなのでしょうか?私の質問にある、where句と同じ意味を指すのでしょうか?初めて見るコード・・しかも調べても同じものが見当たらないもので・・・。 また、同じく質問の中で、複数のフィールドを参照したいという事で、 $sql = "select * from member where nam like '%$nam%' or gyoushu like '%$nam%'…"; と記載いたしましたが、 $field = "nam,gyoushu,todoufuken,shikugun,…"; $sql = "select * from menber where CONCAT($field) like '%$nam%'"; と、した方がスマートに記述出来るかな?と思うのですが(一応、1つのキーワードでは動作確認済み)、このようなスクリプトを利用した場合、 foreach($arr as $data){ 以降、どのような記述になってくるのでしょうか? 段々と理解出来て来たところですが、ポイントが曖昧になってしまって居るもので・・・上記、自分の$field = …の件も含めて、ご指摘頂ければと思い、補足欄ではありますが質問させて頂きました。 お手数お掛けいたしますが、宜しくお願い申し上げます。

関連するQ&A