• 締切済み
  • 困ってます

【PHP】複数語検索について

お世話になります。 PHPにて複数語検索を行いたいのですが、うまく検索できずに困っています。 テーブル名はinformation、 レコード名はnameとして、スペース区切りで検索します。 $st = $db->prepare("SELECT * FROM information"); $where = array(); if($arr['name']){ $name_ary = explode(" ", $name); $name_count = count($name_ary); $where = ""; for( $i = 0; $i < $name_count; $i++ ){ if( $i != 0 ){ $where = ($where . " or"); } $where = $where . " name LIKE '%{$name_ary[$i]}%'"; } } $query= sprintf("SELECT * FROM information WHERE $where"); $st = $db->prepare($query); どなたかご教授いただけないでしょうか? 他の質問など見て真似たり、下記サイトを参考にしたりしているのですが、 うまくいかず困っております。 http://blog.olivesystem.com/824.html 何卒宜しくお願い致します。

共感・応援の気持ちを伝えよう!

  • PHP
  • 回答数3
  • 閲覧数143
  • ありがとう数0

みんなの回答

  • 回答No.3
  • t_ohta
  • ベストアンサー率38% (4587/11802)

こんなかんじでしょうか... テストしてないのでデバッグはご自身で頑張って下さい。 でも、せっかくclass使ってオブジェクト指向にしてるのにグローバル変数は頂けませんねぇ・・・ class Searchinfo{ /*検索画面の照会*/ public static function findallrecord($arr = array()){ global $db; $query = "SELECT * FROM information"; $likekey = array(); $likeval = array(); if($arr['name']){ $name_ary = explode(" ", $arr['name']); for( $i = 0; $i < count($name_ary); $i++ ){ $tmp = ":namelike" . $i; $likekey[] = "name LIKE " . $tmp; $likeval[$tmp] = "%" . $name_ary[$i] . "%"; } $query .= " where " . implode(" or ", $likekey); } $st = $db->prepare($query); $st->execute($likeval); return array('datas' => $st->fetchAll(PDO::FETCH_CLASS, "Searchinfo")); } }

共感・感謝の気持ちを伝えよう!

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

OR検索の考え方はまず値がないときは検索結果は0件だということ つまりWHERE 0から始めます。 そこに ORで条件をたしていきます WHERE 0 OR name LIKE '%a%' OR name LIKE '%b%' OR name LIKE '%c%' これをforeachで回せばクエリーができます

共感・感謝の気持ちを伝えよう!

  • 回答No.1
  • t_ohta
  • ベストアンサー率38% (4587/11802)

突っ込みどころ満載なんですが (^^; まず if($arr['name']){ の $arr がどこにも定義されていないので if文 の中(TRUEの処理)が行われませんので、$query= sprintf("SELECT * FROM information WHERE $where"); の時の $where は空の配列です。 もし if($arr['name']){ が if($name){ もしくは $name_ary = explode(" ", $name); が $name_ary = explode(" ", $arr['name']); なのだとして、事前に定義されているとすると、if文の中(TRUEの処理)が行われますが、$query= sprintf("SELECT * FROM information WHERE $where"); の構文が間違っているためエラーになります。(sprintf の使い方が無茶苦茶です) $db->prepare を使っていますがPDOでしょうか。 表示されている範囲では使い方が無茶苦茶ですので、DBからデータが取り出せていません。 ちゃんとしたリファレンスを一度読まれた方がいいと思います。

共感・感謝の気持ちを伝えよう!

質問者からの補足

>突っ込みどころ満載なんですが (^^; ご指摘恐れ入ります。。。すいません。。。 まだ、phpの勉強を始めて、間もないもので(>_<) どの部分をどう書いていいものかわからず、このような書き方になってしまいました。 htmlのフォームから、search.controller.phpへ値を送って、 下記のように定義しています。 class SearchController{ public function handleRequest(){ $db_array = array(); if($_GET['name']){ $db_array['name'] = $_GET['name']; } $retval = Searchinfo::findallrecord($db_array); } } そして、search.model.php で検索を処理しています。 class Searchinfo{ /* 検索画面の照会 */ public static function findallrecord($arr = array()){ global $db; if(!count($arr)){ $st = $db->prepare("SELECT * FROM information"); }else{ $where = array(); if($arr['name']){ ・・・ } $query= sprintf("SELECT * FROM information WHERE $where"); $st = $db->prepare($query); } $st->execute($arr); return array('datas' => $st->fetchAll(PDO::FETCH_CLASS, "Searchinfo")); } } といった内容で書いています。 いろいろ至らず、すいません。 もっと勉強いたします。。。

関連するQ&A

  • phpからsqliteにselect抽出

    phpからsqliteにselect抽出しています。 $sql = "select * from Table where C=?" $st = $db->prepare($sql); $st->bindParam(1, $key, PDO::PARAM_STR); $st->execute(); while ($row = $st->fetch(PDO::FETCH_ASSOC)) { *** *** } でエラーにはなりませんが、データがとれません。 updateやinsertで?(インジェクション)はうまくいくのですが、Selectでなぜ取得できないのでしょうか? bindParamをarrayにしたりprepare をqueryにしたりしましたが、 データが1件しか取れなかったりします。

    • ベストアンサー
    • PHP
  • 自作の検索エンジンを作成しました。AND検索 or 検索の方法をご教授いただきたい。

    こんにちは。 複数のキーワードの検索が出来ません。 ゲーム 無料 等のキーワードで検索した場合のwhere句とのコラボ組み合わせが出来ません。 $keyword=$_POST[1]; $rs=$DB->$query("SELECT * FROM data WHERE"; if($keyword){ $str = array(" ", " and ", " AND "); $keyword = str_replace($str, " ", $keyword); if(stristr($keyword, " ")){//複数キーワードの検索 $ex = explode(" ", $keyword); $count = count($exkey); for($i=0; $i<$count; $i++){ if($i!="0"){ $sql = $sql." and"; } $sql = $sql." keyword LIKE '%{$ex[$i]}%'"); } }else{//単体キーワードの検索 $sql = " keyword LIKE '%{$keyword}%'"); } } $query = $query.$sql; $result = mysql_query($query); ...結果表示 これ今のソースですけど for のあたりに何か必要ない文字とか入っていますか。 色々しているうちに無駄に複雑にしてしまっているのではと言う感じもします。

    • ベストアンサー
    • PHP
  • phpでmysql操作について

    ↓DB id name 1 a 2 ab 3 abc ↓php $a = mysql_query("select name from information where name = 'abc'"); DBにabcがあったかなかったかを $aに返してほしいのですが、 これの$aが常に0です。 どこか間違っているのか、それともそういう 動きをしないものなのでしょうか? あれば1またはtrue なければ0またはfalse みたいな動きをする関数はありませんか?

    • ベストアンサー
    • PHP
  • 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
  • PHPの検索システムについてご教授下さい

    こんにちは。現在PHPで検索システムを実装しようとしておるのですが、どうしても条件絞り込みを行うことができず(全件表示されてしまう)困っております。PHP初心者で、無知なため先輩方ご教授頂けますと幸いです。PHPのソースは以下となります。 <?php $debug = fales; //DB接続 mysql_connect('db_host','db_user','db_pass') or die(mysql_error()); mysql_select_db('db_name') or die(mysql_error()); if($debug) print_r($_POST); //エラーチェック //リクエストメソッドチェック if($_SERVER["REQUEST_METHOD"] != "POST"){ // ブラウザからHTMLページを要求された場合 }else{ // フォームからPOSTによって要求された場合 } $query = "SELECT * FROM search "; if(!empty($name)) { $name = addslashes($name); $where = "name = '$name' "; } if(!empty($tel)) { $tel = addslashes($tel); $where .= "tel '$tel' "; } if(!empty($sex)) { $sex = addslashes($sex); $where .= "sex = '$sex' "; } if(!empty($where)) { $where = substr($where, 0, -4); $where = "WHERE" . $where; } $query .= '$where'; $result = mysql_query($query . implode(" AND ", $where)); $num_rows = mysql_num_rows($result); if($num_rows == 0) $message = "該当するデータはありませんでした"; else $message = $num_rows . "件ヒットしました"; ?> 検索結果<br> <?=$message?> <table border=1> <tr><td>名前</td><td>電話番号</td><td>性別</td></tr> <? while($row = mysql_fetch_assoc($result)): ?> <tr><td><?=$row['name']?></td><td><?=$row['tel']?></td><td><?=$row['sex']?></td></tr> <? endwhile; ?> </table> <a href="input.html">再検索</a> 現在データベースにはサンプルとして10件入れておりますが、どの条件で検索を行なっても10件全てが検索結果として表示されてしまいます。どこを触れば良いのでしょうか…? お忙しいところ大変恐れ入りますが何卒、よろしくお願い申し上げます。

    • 締切済み
    • PHP
  • PHPの複数条件検索フォーム

    http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1134440526 の回答者の方のコードを参考にしたのですが、下記の通りにすると Parse error: syntax error, unexpected '{' in C:\Program Files\Apache\Apache24\htdocs\sample\kensaku20.php on line 19 と出ます、カッコの数がおかしいのでしょうか? 19行目前後を見てもおかしな所はないと思われるのです(秀丸を使っていてカーソルを合わせると色が変わる部分を見ました) やりたいこととしてはid名か商品名のどちらか・或いは両方とも入力したらDBより検索、表示させる事です。 HTML部 <form action ="http://localhost/sample/kensaku20.php" method="post"> id名:<input type="text" name="id"> 商品名:<input type="text" name="name"> <input type="submit" name="exec" value="検索"> </form> php部 中略 $ary_whr = array(); $ary_dat = array(); if (!empty($_POST['exec'])) __{ $ary_whr[] = 'name LIKE ? '; $ary_dat[] = '%'.$_POST['exec'].'%';} if (!empty($_POST['id'])) __{ $ary_whr[] = 'id LIKE ? '; $ary_dat[] = '%'.$_POST['id'].'%';} if (!empty($_POST['name'])) __{ $ary_whr[] = 'name LIKE ? '; $ary_dat[] = '%'.$_POST['name'].'%';} $where = ' WHERE ' . implode(' AND ', $ary_whr); 中略

    • ベストアンサー
    • PHP
  • phpとmysqlで「あいまい検索」をしたいです。

    phpとmysqlで「あいまい検索」をしようと思い、下記サイトを参考にしましたが、 http://d.hatena.ne.jp/akihito_sado/20120602/p1 PDOを使ってlikeデータを抜き出したい場合、bindParamを使うらしいですが、 http://rasukaru55.sitemix.jp/or_kensaku.php 下記の場合どう書き直すべきでしょうか? 打ち方が悪いのか、うまく作動しません。 教えてください。 ※bindParamを使えばSQLインジェクション対策になっていると言う事でしょうか? <html> <head></head> <body> <?php //POST送信されたデータを$text1へ $text1 =@$_POST["text1"]; //SQL(テーブルから列を抽出する $sql ="SELECT 列名 FROM 表名 "; //キーワードが入力されているときはwhere以下を組み立てる if (strlen($text1)>0){ //受け取ったキーワードの全角スペースを半角スペースに変換する $text2 = str_replace(" ", " ", $text1); //キーワードを空白で分割する $array = explode(" ",$text2); //分割された個々のキーワードをSQLの条件where句に反映する $where = "WHERE "; for($i = 0; $i <count($array);$i++){ $where .= "(列名 LIKE '%$array[$i]%')"; if ($i <count($array) -1){ $where .= " AND "; } } //別カラムも同じ検索したい $where2 = " OR "; for($i = 0; $i <count($array);$i++){ $where2 .= "(2列名 LIKE '%$array[$i]%')"; if ($i <count($array) -1){ $where2 .= " AND "; } } } ?> <form method="POST" action="<?php echo $_SERVER["PHP_SELF"]?>"> <table> <tr> <td><input type="text" name="text1"></td> <td><input type="submit" value="検索" name="sub1"></td> </tr> </table> </form> <?php //組み立てたSQL分を表示する echo "<p>組み立てたSQL分: ".$sql.@$where.@$where2; ?> </body> </html>

    • ベストアンサー
    • PHP
  • 検索結果の分割表示時のSQLエラー

    PHP, MySQLで検索システムを作り、検索結果の分割表示をしようとしています。 その際、SQL文にエラーが生じるのですが、原因が調べてみてもわかりません。 検索条件のSQL文内のNUM_SHOPSという部分を数値に変えると1ページ目はきちんと分割表示されますが2ページ目以降が全件表示されてしまいます。 そして、NUM_SHOPSの部分をそのままにすると、SQLがエラーを起こします。var_dumpで$queryを確認すると、SQL文が二重に入ってしまっているのですが、どうしてこのような現象が起きるのかがいまいちわかりません。 アドバイス、ご指摘等いただけないでしょうか。 よろしくお願い致します。 以下に該当箇所のコードを記載します。 【result.php】 <?php require_once('config.php'); require_once('functions.php'); connectDb(); if (preg_match('/^[1-9][0-9]*$/', $_GET['page'])) { $page = (int)$_GET['page']; } else { $page = 1; } $offset = NUM_SHOPS * ($page - 1); //クエリ生成 $query = "SELECT * FROM テーブル名"; //検索条件抽出 $where = array(); if (isset($_GET['area'])and($_GET['area'] !== '')) { $where[] = sprintf("(area='%s')", mysql_real_escape_string($_GET['area'])); } if (count($where) <> 0) { $query .= ' where ' . implode(' and ', $where) . ' ORDER BY id DESC '; } if (count($where) <> 0) { $query .= "limit " . $offset . ", NUM_SHOPS" ; } var_dump($query); //Result $result = mysql_query($query) or die($query . '<br />' . mysql_error() . '<hr />'); //検索結果件数カウント $query = "SELECT COUNT(id) FROM テーブル名"; $where = array(); if (isset($_GET['area'])and($_GET['area'] !== '')) { $where[] = sprintf("(area='%s')", mysql_real_escape_string($_GET['area'])); } if (count($where) <> 0) { $query .= ' where ' . implode(' and ', $where) . ' ORDER BY id DESC'; } $total = mysql_result(mysql_query($query), 0); $from = $offset + 1; $to = ($offset + NUM_SHOPS) < $total ? ($offset + NUM_SHOPS) : $total; ?> 【config.php】 <?php define('DB_HOST', '*************'); define('DB_USER', '*************'); define('DB_PASSWORD', '*************'); define('DB_NAME', '*************'); //ページごとのショップ数 define('NUM_SHOPS', 10); //エラー表示 error_reporting(E_ALL & ~E_NOTICE); 【functions.php】 <?php function connectDb() { mysql_connect(DB_HOST, DB_USER, DB_PASSWORD) or die("can not connect to DB:".mysql_error()); mysql_select_db(DB_NAME) or die("can not select DB: ".mysql_error()); } function h($s) { return htmlspecialchars($s); }

    • ベストアンサー
    • PHP
  • php5+Mysql5による条件検索とその表示方法が上手く動作しないのでどなたかご指摘をお願いします。

    phpにて条件検索を行っているのですが、『where』以下を$変数にすると動かなくなってしまいます。記述部分で何が間違っているのでしょうか? 以下記述↓ <? $link = db_con(); //←DB接続 $sql = "select * from tbl where id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ?> ここまで↑ を下記のように『where』以下を$変数にして代入 $変数した場合↓ <? $where .= "id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' "; $link = db_con(); //←DB接続 $sql = "select * from tbl where $where "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ?> ここまで↑ どなたかご指摘をお願いします。

  • 複数(2つ)のテーブルで検索を行いたい

    MySQL 3.23です。 select count(*) as hit from freedata where (A=10 or B=10); という構文と select count(*) as hit from sharedata where A=10; という構文を一行にしたOR検索を行いたいのですが、方法はありますか? 要は、同一のキーワードで、二つのテーブルを検索対象にしたいのです。ご教授よろしくお願い致します。

    • ベストアンサー
    • MySQL