phpで複数の検索語を検索対象にしたい

このQ&Aのポイント
  • 半角や全角スペースの入った複数の検索語を検索対象にしたいです。
  • 現在のコードは検索フォームに入力されたキーワードを検索し、その結果の件数を表示しています。
  • 単語1つの場合では正しく動作しますが、複数のキーワードを含む場合は検索結果がゼロになってしまいます。希望は、複数のキーワードを含む検索を行いたいと考えています。
回答を見る
  • ベストアンサー

phpで複数の検索語を検索対象にしたい

環境:php+mysql やりたいこと: 半角や全角スペースの入った複数の検索語を検索対象にしたいです。 例:りんご みかん で検索されたキーワード 現在のコードは以下のとおりです。。 長くなるので、検索結果数だけの処理までを書いてます。 $sql の箇所で for文など使って繰り返し処理をさせればよいのかと思い google先生で検索しましたが、、どうにも該当しそうなサイトが見つからず アドバイスいただきたく質問させていただきました。 単語1つの場合だけ検索結果が正しく動きますが、 現在は、検索フォームに「りんご みかん」と入れると 検索結果ゼロになります。 これはこれで正しいのですが、、 希望は「りんご みかん」と入れると りんごとみかんを含む検索をしてほしい と考えてます。 <?php $keywords = $_GET["key"]; //検索キーワードのデータが何件あるか? $sql="select * from item where title like '%".$keywords."%' or Description like '%".$keywords."%' or category like '%".$keywords."%' "; $datas = mysql_query($sql , $db ); $num = mysql_num_rows($datas); echo "検索結果は "."<span style=\"font-size:30px;\">".$num."</span>"."件です。<br>"; } ?>

  • PHP
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
回答No.1
anan19
質問者

お礼

参考サイトありがとうございました。

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

こんな感じですね <?PHP if(isset($_GET["key"]) and $_GET["key"]!==""){ $sql="select count(*) as count from item where 0"; $pattern="/[  ]+/"; $keywords = preg_split($pattern,$_GET["key"]); foreach($keywords as $val){ $val=mysql_real_escape_string($val); $sql.=" or title like '%".$val."%'"; $sql.=" or Description like '%".$val."%'"; $sql.=" or category like '%".$val."%'"; } $res=mysql_query($sql); $data = mysql_fetch_array($res,MYSQL_ASSOC); echo "検索結果は ".$data["count"]."件です。<br>"; } ?> <form> <input type="text" name="key"> <input type="submit" value="search!"> </form>

anan19
質問者

お礼

記述いただき助かります! 実際のphpで試してみます。ご回答ありがとうございます。

  • singlecat
  • ベストアンサー率33% (139/418)
回答No.2

簡単に解説 半角又は全角空白毎に キーワードを配列に格納 半角又は全角空白が連続している場合を考慮しておく 配列に入れたキーワード分 Where文としてor連結する ※複数項目ある場合は、  項目を連結したものにlike文を  入れるか、書かれてるように  項目数分like文をorで連結

anan19
質問者

お礼

処理の考え方を教えていただきありがとうございます。 他の方が教えて頂いたサイトやサンプルにて考慮して作ってみます。

関連するQ&A

  • phpで複数検索語をテーブル上の複数項目を対象

    php とmysqlの環境で作ってます。 以前、教えていただいた http://blog.olivesystem.com/824.html のサイトを参考に検索キーワードをテーブル上の複数の項目にまたがって検索したい と考え以下のように書いてみましたが、、エラーとなってしまうので、、、 アドバイスいただければと考えております。 ・実現したいこと 検索窓に 半角や全角で間を空けた入力キーワードをand検索とし テーブル上の複数の項目を参照して検索結果を得たい 例: 「バナナ りんご 千」で検索された場合 テーブルの内容 name setumei sanchi バナナ 長い 東京 りんご 丸い 青森 スイカ 丸い 千葉 このテーブルの3つの項目を参照して検索し、実現したいことが正しく動けば。。 検索結果数 3件 となる。 理由:nameに2件 sanchiに1件 該当キーワードが存在するため ・phpの内容 *getでキーワードを取得している状態以下を書いてます。 $keywd がGETで取得したキーワードが代入されます。 試しに2つ項目で動かないか?!書いてみた状態です。 $query = "SELECT * FROM item WHERE"; if($keywd){ $str = array(" "," ", " and ", " AND "); $keywd = str_replace($str, " ", $keywd); if(stristr($keywd, " ")){//複数キーワードでの検索 $ex = explode(" ", $keywd); $count = count($ex); for($i=0; $i<$count; $i++){ if($i!="0"){ $keyand = $keyand." and"; $keyor = $keyor." or"; } $keyand = $keyand." name LIKE '%{$ex[$i]}%'"; $keyor = $keyor." sanchi LIKE '%{$ex[$i]}%'"; $sql = $keyand.$keyor; echo $sql;//内容確認 } }else{//単体キーワードでの検索 $sql = " name LIKE '%{$keywd}%'"; } } $query1 = $query.$sql; $result = mysql_query($query1, $db ); $num = mysql_num_rows($result); echo "検索結果は "."<span style=\"font-size:30px;\">".$num."</span>"."件です。<br>"; ←ここがline111となります。 ・表示されたエラー Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/users/xxxx/result.php on line 111 ・echoで確認した内容 「ソーラ o」で検索した状態 name LIKE '%ソーラ%' Description LIKE '%ソーラ%' name LIKE '%ソーラ%' and name LIKE '%o%' Description LIKE '%ソーラ%' or Description LIKE '%o%' よろしくお願いします。

    • ベストアンサー
    • PHP
  • 検索においてフィールド名+likeを複数使いたい

    環境:php+mysql ■やりたこと イメージ <form method="get"action="result.php"> <p> 検索ワード:<input type="text" name="key" /> 好きな果物: <select name="cate"> <option VALUE="0"> <option VALUE="りんご">りんご <option VALUE="みかん">みかん </select> <input type="submit" value="送信" />  <input type="reset" value="取り消し" /> </p> </form> と検索フォームをした場合 入力された内容が  検索ワード=愛媛  好きな果物=みかん だとすると みかんのカテゴリに属するレコードで 且つ  みかんのキーワードを含むname またはDescriptionフィールドに該当する 結果数を取得したいです。 補足: $cate(formのプルダウンで VALUE="xx" のxxが入ってきて  これはDB上フィールドに入っている日本語です。) $a(これは検索キーワードが入ってきます。) ■現在書いているphp $sql="select * from item where category=$cate and name like '%".$a."%' or Description like '%".$a."%' "; $datas = mysql_query($sql , $db ); $num = mysql_num_rows($datas); ←75行目 エラー結果 Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/xxx/result.php on line 75 おそらく、73行目の命令文が間違っていると思うのですが、どう対応するのか 検索しても対象になりそうなものがみつからず、、質問させていただきました。 アドバイスのほどよろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPからのLIKE検索ができません。

    こんばんわ。お世話になります。 PHPからSQLを発行してLIKE検索をしようとしているのですがうまくいきません。(Xampp MySQL) $keyword = htmlspecialchars($_POST['keyword']); mysql_real_escape_string($keyword); $sql = "select * from master where name like '%{$keyword}%'"; テーブル内の name にマッチするはずの言葉があるのにマッチしません。 ちなみに echo $sql; とSQL文を表示させてPhpMyAdminでそれを実行すると、目的の検索結果が表示されます。 いろいろ検索してみたところ、LikeをLike Binary にする方法などがありましたが、どうにもうまくいきませんでした。文字コードはフォーム側、PHP・SQLともにUTF-8です。 '%{$keyword}%'あたりの書き方が悪いのでしょうか。 お手数おかけいたしますがアドバイスの程お願いいたします。

    • ベストアンサー
    • MySQL
  • 検索の際の濁点区別のかき方

    環境:mysql と php でプログラム作ってます。 実施したいこと: mysqlのカラム設定上は utf8_unicode_ci に設定してますが、これだと検索した際 濁点もヒットしてしまうので、 検索結果時に濁点判定を入れたいと考え 以下のプログラムを書いてます。 $sql="select * from テーブル名 where name like '%".$keyword."%' or tel like '%".$keyword."%' collate utf8_bin"; $sql .= "limit " .$page*10 . ", 10"; $datas = mysql_query($sql, $db); while($row=mysql_fetch_array($datas)){ $name = $row["name"]; しかし、実行すると $name = $row["name"]; で記述している箇所でエラーが出てしまいます。 エラーは、 mysql_fetch_array() expects parameter 1 to be resource, boolean given in となっており、 DBからデータを引っ張れていないと思われます。 検索時だけ、collate utf8_binを記述するのは間違っていたのでしょうか。。 アドバイスよろしくお願いいたします。

    • 締切済み
    • PHP
  • 検索結果件数を取りたいです。

    環境は、php + mysqlで作ってます。 DBのテーブルに格納されている文字列をセレクト文で取り出して 対象件数が何個あるか知りたいです。 DBのテーブルに格納されている文字列はURLの文字列が入ってます。 例えば http://www.yahoo.com/ 確認のため、予め $obj = "http://www.yahoo.com/"; として、DBに入っているデータを書いておいて以下を実行しました。 $sql="select * from geturl where url=".$obj; $datas = mysql_query($sql , $db ); $num = mysql_num_rows($datas); echo $num; 結果: Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/~~ といったエラーが出てしまいました。。。 今度は、予め数字を入れておいて実行してみました。 入れた文字は「123」です。 $obj = "123"; $sql="select * from geturl where url=".$obj; $datas = mysql_query($sql , $db ); $num = mysql_num_rows($datas); echo $num; 結果:正しく対象件数がブラウザに表示されてました。 数字だと正しく処理されて、英文字だとエラーになる原因がわかりません。。 アドバイスいただければ幸いです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 複数のフィールドにまたがる、ワード検索

    お世話になっております。 1つのテーブル内にある複数のフィールドを対象とした、DB内の検索スクリプトを以下の様に作っているのですが、半角などで区切り、いくつかのキーワードを入力すると、検索結果が返ってきません。 こちらの過去ログ等でも色々調べ、参考になりそうなものも数多くありましたが、スキルが乏しく解決に結びつける事が出来ずにいる次第です。 お忙しい中恐縮ですが、コードを記述するに当り、考え方などを踏まえた使用する関数などをご教授頂けたら幸いです。 ・・・結果的にお手数をお掛けしてしまう事となりますが、コードの丸投げだけは避けたいもので。。宜しくお願い致します。 mysql_connect('localhost','root','*******'); mysql_select_db('test'); //全てのカテゴリ if($category == 1){ if($ktype == 1){ $sql = "select * from member where nam like '%$nam%' or gyoushu like '%$nam%'…"; $result = mysql_query($sql); $rows = mysql_num_rows($result);

    • ベストアンサー
    • PHP
  • PHPからのLike検索について。

    初めまして。 ロリポップでPHPとMySQLを使ってHPを作成しているのですが Likeの条件を付け足すと結果が取得できなくなってしまいます。 ロリポップ上の【phpMyAdmin】で同じSQLを実行すると 結果を取得してくれるのですが PHP上でLike条件を付け足すと、上手く結果を取得してくれなくて困っています。 $key = "あ"; $LIKE = " where furigana Like '$key%'"; $SQL = "select count(*) from item_info" . $LIKE; $rst = mysql_query( $SQL, $con ); print $SQL; $col = @mysql_fetch_row($rst); $ret[0] = mb_convert_encoding($col[0],"SJIS","EUC-JP"); print "<br>"; print $ret[0]; このSQLで結果【1】が取得できるはずなのですが 表示すると必ず【0】となってしまいます。。 上記のコードに何か間違いがありますでしょうか? ご教授お願い致します。

    • 締切済み
    • PHP
  • PHPで絞り込み検索結果の件数を表示する

    同じ質問が数多くあるようですが、どうにもうまくいかない為恐縮ですが質問させて頂きました。 私はPHPとMYSQLを使ってホームページを作成しております。 やりたいことは、DBのTBに数百ある情報をPHPで幾つかの条件で絞り込み検索をかけることで、それ自体はできたのですが、何件の結果が抽出されたかを表示することができません。 例:○○件の検索結果が表示されました。 ←こんな感じにしたいのです。 他の質問を参考に以下のように記述をしたのですがどうにもうまくいきません。 $sql ="SELECT*FROM estate WHERE 価格 BETWEEN $price1 AND $price2'"; print 'sql_num_fields( $sql ) . "\n"件の検索結果が表示されました'; どのような点が問題なのか教えていただけますでしょうか? できればソースを教えていただけると助かります。

    • ベストアンサー
    • PHP
  • PDOを使って複数キーワード検索する方法について

    PDOでプリペアードステートメントを使って複数キーワードで検索する方法を教えて下さい。 プリペアードステートメントは「?」形式ではなく、$stmt->bindParam(':sample', $samle);の形を使った方法を知りたいです。 環境 PHP:5.1.6 MySQL:5.0.77 処理の流れを作ってみました。途中から不明な点があるので変数化しないで記載してあります。 /*--PDOのプリペアードステートメントのbindParamを用いた場合--*/ $dbh = new PDO($DSN , $DBUSER , $DBPASS); $query = 'SELECT * FROM table WHERE '; $keyword_str = 'キーワードA キーワードB キーワードC'; //全角スペースを半角スペースに変換する処理(省略) $keywords = split(' ',$keyword_str); for($a = 0; $a <$keywords_num; $a++) { $kw[]=' 列名 like :kw'.$a; } $query.= join('AND', $kw); //キーワードごとに「%キーワード%」の形を作る。 $kw0='%'.$keywords[0].'%'; $kw1='%'.$keywords[1].'%'; $kw2='%'.$keywords[2].'%'; $stmt = $dbh->prepare($query); $stmt->bindParam(':kw0', $kw0); $stmt->bindParam(':kw1', $kw1); $stmt->bindParam(':kw2', $kw2); $stmt->execute(); /*-----------------------------------------------------------*/ 上記ソースの後半部分、 (1) //キーワードごとに「%キーワード%」の形を作る。 のところを変数を使って実現しようと思うのですが、うまくいきません。 $keywords_num=count($keywords); でキーワードの数を取得して for($a = 0; $a <=$keywords_num; $a++) { //作りたいソース } の形にすることは予想がつくのですが。 (2) $stmt->bindParam(':kw0', $kw0); $stmt->bindParam(':kw1', $kw1); $stmt->bindParam(':kw2', $kw2); の部分も上記と同じ形を考えていますが $keywords_num=count($keywords); でキーワードの数を取得して for($a = 0; $a <=$keywords_num; $a++) { //作りたいソース } 「//作りたいソース」の部分がうまく作れません。 (1)(2)の作りたいソース部分の書き方を教えて下さい。 上記の考え方より良い(短い)ソースが作れる場合はそのソースを教えて下さい。

    • ベストアンサー
    • PHP
  • PHPの検索について

    現在html、PHP、MySQLを使い検索システムの作成を行っているのですが、検索をしてMySQLより所得した結果何件表示されました、という感じにしたいです。 yahooでPHPで検索すると約11,440,000,000件みたいに。 やり方が分からなく何か参考になるサイトなどがありましたら教えていただきたいです。 よろしくお願いします。

    • ベストアンサー
    • PHP