PHPのsqlでキーワード検索

このQ&Aのポイント
  • データベースからデータを表示するPHPの「list.php」と検索してlist.phpに渡す「top.php」について質問です。
  • 地域指定とエリア指定がない場合に、キーワード検索のみにする方法について知りたいです。
  • 地域指定とエリア指定を削除するとキーワード検索が働かなくなりますが、どのように修正すればよいのでしょうか。
回答を見る
  • ベストアンサー

【続】PHPのsqlでキーワード検索【急】

前回、前々回の質問で解決しなかったので質問を変えて改めて質問させて下さい。 ※php、データベース共に初心者ですので専門用語での指摘には対応出来ませんので宜しくお願いします。 前々回http://oshiete1.goo.ne.jp/qa3220932.html 前回http://oshiete1.goo.ne.jp/qa3234825.html データベースからデータを表示するPHP、「list.php」と 検索してlist.phpに渡す「top.php」があります。 現在list.phpに if($fn == "sr"){//サーチ $mainimage="navisearch.jpg"; $table_tmp = ""; $query_tmp = ""; if($munic != 9999){//地域指定があるとき if($munic == 1){//1の時 if($area != 9999){ //1でエリア指定があるとき $table_tmp = ",Town_table"; $query_tmp ="and To_id = St_town and To_area = ".$area; }else{//1でエリア指定が無いとき $query_tmp ="and St_munic = ".$munic; } }else{//1以外の時 $query_tmp ="and St_munic = ".$munic; } } if($lowcat > 0){ $query_tmp .= " and Li_id = ".$lowcat; } if(strlen($key) > 0){ $query_tmp .= " and (St_mainname like ?"%".addslashes($key)."%?" or St_subname like ?"%".addslashes($key)."%?" or St_freeheadtxt like ?"%".addslashes($key)."%?" or St_freetxt like ?"%".addslashes($key)."%?" or St_movietxt like ?"%".addslashes($key)."%?")"; } … というphpがあり、地域検索、エリア検索、キーワード検索が出来るようになっています。 これを地域指定、エリア指定両方無い時も 地域指定1、エリア指定9999とするように出来ないでしょうか? 理想は地域、エリア検索がなくキーワード検索のみにしたいのですが、地域、エリア検索部分のphpを消すとキーワード検索が働かなくなります。 (エラーは出なくなりましたがキーワードを無視し、データベース全てのデータを返して来る状態です) すぐに回答欲しいです。 宜しくお願い致します。

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

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

  • ベストアンサー
  • asahina02
  • ベストアンサー率47% (95/202)
回答No.1

> エラーは出なくなりましたがキーワードを無視し、データベース全てのデータを返して来る状態です これの原因ですが、フォーム側のソースがNo.3234825の通りであれば、 キーワードがPHPに渡されてない気が・・ 間にtableとかが含まれるのはかまいませんが、基本的に上から <form ***>  <input ***>  <input ***>  <input ***> </form> となるようにしてください。 No.3234825の場合、キーワード入力欄が<form></form>の外側にあるので、 これは内側に入るようにコーディングしてくださいね。 ※キーワード入力欄だけでなく、<input type="hidden" ***>ってやつも同様

tse-sie
質問者

お礼

お礼が遅くなり申し訳ございませんでした。 おかげさまで無事キーワード検索が動きました! 助かりました。ありがとうございました。

関連するQ&A

  • PHP+MYSQLで検索画面を作成しています。プルダウンとキーワードを使用していますがうまくいきません。

    住所録を作成し、プルダウンとキーワードで作成しましたがうまくいきません。実行すると最後に記載のエラーがでます。教えてください。フリーワードだけの検索はうまくいきましたが。 ---kensaku.php--- <?php extract($_POST); $dfrom = sprintf("%04d-%02d-%02d",$year1,$mon1,$date1); $dto = sprintf("%04d-%02d-%02d",$year2,$mon2,$date2); if($kai == ''){ }else{ $jouken = "(ocrdate between '$dfrom' and '$dto')"; if ($kai <> "*"){ $jouken = "$jouken and kai like '%$kai%'"; } if ($fuk <> "*"){ $jouken = "$jouken and fuk like '%$fuk%'"; } if ($jic <> "*"){ $jouken = "$jouken and jic like '%$jic%'"; } if ($key1 <> ""){ $jouken = "$jouken and (keyword like '%$key1%' or detail like '%$key1%' or treat like '%$key1%' or remark like '%$key1%')"; if (key2 <> ""){ $jouken = "$jouken and (keyword like '%$key2%' or detail like '%$key2%' or treat like '%$key2%' or remark like '%$key2%')"; if (key3 <> ""){ $jouken = "$jouken and (keyword like '%$key3%' or detail like '%$key3%' or treat like '%$key3%' or remark like '%$key3%')"; } } } mysql_connect('localhost','***','****'); mysql_select_db('****'); $sql = "select * from jyusho where $jouken"; $result = mysql_query($sql); $num = mysql_num_rows($result); if ($num == 0){ echo "該当データがありません<br>"; exit; }else { echo "<table border=\"1\">\n"; echo "<tr>\n"; echo "<th>加入日</th>\n"; echo "<th>加入地域<br></th>\n"; echo "<th>加入県</th>\n"; echo "</tr>\n"; while($row = mysql_fetch_array($result)){ $id = $row["id"]; echo "<tr>"; echo "<td align=\"right\"><a href=\"meisai.php?id=$id\">",$id,"</a>\n"; echo "</td><td>"; echo $row["kai"]; echo "</td><td>"; echo $row["fuk"]; echo "</td><td>"; echo $row["jic"]; echo "</td></tr>"; }(ここまで170行目、次は、/htmlとなっています) ---ここまで--- エラーは、「Parse error: parse error, unexpected $end in c:\(省略)\kensaku.php on line 171」

  • checkbokとキーワード検索を組み合わせた検索

    PHP4とMySQL4.0.22を使っています。 チェックボックスとキーワードで検索結果を表示させたいと思い。 下記のようにプログラムを作成したのですが、うまく検索表示してくれません。 PHPもMySQLも初心者なため、あちこちの構文を寄せ集めたため、Parseもうまく通っていません。 どこをどういう風にすればうまくいくのか、教えていただけないでしょうか? よろしくお願いします。 ----------------------------以下PHPファイル----------- 検索フォーム 検索キーワード:<input type=text name=\"k\"value='$k' size=45 > チェックボックス <INPUT TYPE=\"CHECKBOX\" NAME=\"bumon[]\" value=\"01:河川・砂防及び海岸\">01:河川・砂防及び海岸 ・・ "; //データ検索結果の実行部分 if($sig=="kb"){ $wk ==""; if($wk<>""){ //チェックボックス $sql = "select * from tecris where"; $sql .= " ("; $i=0; foreach($_POST['bumon'] as $fr) { if ($i) { $sql .= " or "; } $sql .= "bumon = '$fr'; $i++; } $sql .= ") and "; //キーワード if($k<>""){ $xk = str_replace(" "," ",$k); $gk = explode(" ",$xk); $wk ="keyword like '%$gk[0]%'"; $i = 1; $n = count($gk) - 1; while ($i <= $n){ $wk = $wk . " and keyword like '%$gk[$i]%'"; $i++; } } //クエリの作成 $sql = $sql . $wk; };

    • 締切済み
    • PHP
  • phpでキーワード検索

    お世話になっております。 前回より少し変化があったので改めて質問させて頂きます。 前回のhttp://oshiete1.goo.ne.jp/qa3220932.htmlより <table border="0" cellspacing="0" cellpadding="0"> <tr> <td valign="middle">&nbsp;</td> <td>キーワード</td> <td>&nbsp;</td> </tr> <tr> <td valign="middle">&nbsp;</td> <!-- フリーワード検索ここから --> <td> <input name="key" type="text" size="20" maxlength="30"> </td> <td><table border="0" cellspacing="0" cellpadding="0"> <tr> <!-- 送信ボタンここから --> <td><form name="form1" method="get" action="list.php"> <input type="image" src="image/serch_but.gif" alt="検索" value="検索" width="65" height="20" border="0"> </form></td> <?php $sql = "select Ui_id,Ui_name from Upindustry_table order by Ui_order"; $rs = mysql_query($sql); while($row=mysql_fetch_array($rs)) ?> <!-- 送信ボタンここまで --> </tr> </table></td> </tr> <!-- フリーワード検索ここまで --> </table> <input name="fn" type="hidden" id="fn" value="sr"></td> </tr> </table> このようにしました所、エラーは出なくなりましたが検索結果が0になります。 これは元々エリア検索と一緒についていたもので、キーワードのみ、もしくはエリアのみ、または両方で検索出来るというもので下。 これをキーワードのみにしたいのですが、エリア検索の記述を消すとうまく動いてくれません。 どうやらキーワードがうまく送信されていないようで検索結果が「list.php?x=20&y=7」のように座標で出て来てしまいます。 エリア検索が一緒についている状態で、検索をすると「list.php?munic=9999&area=0&key=%83z%83e%83%8B&upcat=9999&lowcat=0&x=38&y=10&fn=sr」 と出ます。 どのようにしたら良いか教えて下さい。 もしこの他に必要なソース等あれば提示致します。 宜しくお願い致します。

    • 締切済み
    • PHP
  • SQL キーワード検索にて

    お世話になります。 DBからSQLでキーワードによる検索をかけるときですが、 二つ以上のワードがあるときに、一つのキーワードがほかのキーワードと かぶってしまう場合、例えば゛、『あいうえお』と『いうえ』等で絞り込むと、 結果的に『あいうえお』が含まれるものだけが該当しますが、これを、 『あいうえお』を含み、更にそれ以外にも『いうえ』が含まれるものを 絞り込むには、どうすればよいでしょうか。 つまり、『あいうえお』のみしか含まれないものは該当しないようにする方法です。 現在のSQLは、 (SELECT * FROM xxxx WHERE tablename LIKE '%あいうえお%' AND tablename LIKE '%いうえ%') のような感じです。 使用しているDBは、MySQL、SQLiteです。 何卒よろしくお願いいたします。

  • MySQLで期間指定でキーワード検索するには?

    PHPでMySQLを利用し開発を行っています。 検索ボックスにキーワードを入力して検索をしたいのですが、期間を指定して検索できるようにする方法が分かりません。 さらに1ページに五件ずつ表示するようにしています。 下記はキーワード検索として動いているプログラムです。 例は2つのフィールドから検索しています。 SELECT * FROM テーブル名 WHERE フィールド名1 LIKE '%$search%' OR フィールド名2 LIKE '%$search%' LIMIT 0, 5; これに BETWEEN 期間1 AND 期間2  を追加して完成させようと思っているのですが、 どうも上手くいかないので、どのように書けばよいか教えて下さい。 よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • 検索機能ソースの脆弱性に関して

    以前こちらでPHPの検索機能のソースに関して質問させて頂いた者です。そのときに、作成したソースに「SQLインジェクション」の可能性があるとのご指摘を受けたのですが、下記のソースを見ていただいて、どこに脆弱性があるのか、わかる方がおられましたら是非教えていただきたく存じます。 拙い知識ながらも、本等で調べて、$_POST['key']で受け取ったデータを、get_magic_quotes_gpcの設定がOFFの場合は、addslashes関数でエスケープ処理をする設定にしたのですが、フォームの入力値に「str' or '1'='1」のようなSQLインジェクション確認用の文字を入れたり、ソースの検証を自分で行った限りでは、エラーが発見できなかったのですが、どこがまずいのでしょうか? ご教示いただけますよう、宜しくお願いいたします。 検索フォーム <form method="post" action="view.php"> <input type="text" name="key"> <input type="submit" name="search" value="検索"> </form> ログ表示PHP(view.php) $key = "%"; if (isset($_POST['key'])) { $key = (get_magic_quotes_gpc()) ? $_POST['key'] : addslashes($_POST['key']); } $sql = "SELECT * FROM shop WHERE todohuken='XX' "; if(strlen($key) > 0){ $key = str_replace(" ", " ", $key); $array = explode(" ", $key); $and = "AND "; for($i=0; $i<count($array); $i++){ $and .= "address LIKE '%$array[$i]%'"; if($i < count($array)-1){ $and .= " AND ";   }  } } mysql_select_db($database_connDB, $connDB); $Recordset1 = mysql_query($sql.$and.";", $connDB) or die(mysql_error());

    • ベストアンサー
    • PHP
  • LIkEで漢字一文字検索でエラー

    お世話になります。 現在、PHPで作成し運営しているサイトでキーワード検索を設置しているのですが、「野」や「三」など漢字一文字で検索すると You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND ××× = AND ○○○ =' at line 3 というエラーになってしまいます。 別の漢字でエラーにならない場合もありますが、多くの漢字でエラーになってしまい、ググってみたものの対処法がわからず困っています。記述は下記の通りです。 $key = addslashes($_POST["keyword"]); $db= new mysqli($host, $username, $password, $database); if(mysqli_connect_errno())  die("Can't connect database : " . mysqli_connect_errno()); if(!$db->query("SET NAMES 'utf8'"))  die(mysqli_error($db)); $query = <<< EOS SELECT * FROM {table} WHERE name LIKE '%{$key}%' AND kana LIKE '%{$key}%' EOS; if(!$result = $db->query($query)) die(mysqli_error($db)); 色々と検証し、kanaのフィールドは問題なくnameのフィールドで エラーが発生しているということが分かりました。また「LIKE '%{$key}'」は問題なく「LIKE '%{$key}'」の前方一致でエラーが起きているみたいです。 ちなみにREGEXPでも試してみたのですがダメみたいです。 対処法をご存知の方がいましたら、よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 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
  • Dreamweaverで検索フォーム

    はじめまして。 DreamWeaverを使ってPHP+MySQLでWEBアプリを作っております。 ログ表示部分まで完成して、検索用のhtmlフォームから条件を指定して検索結果のみをSELECTして表示させたいのですが、「and検索やor検索」ができなくて困っています。 他に似たような質問をされている方もいますが、書いたソースが異なっているように見受けたので、投稿させていただきました。 宜しくお願いします。 検索フォーム <form method="post" action="view.php"> <input type="text" name="key"> <input type="submit" name="search" value="検索"> </form> ログ表示PHP(view.php) //検索キーワードの初期値を設定する $colname_Recordset1 = "%"; if (isset($_POST['key'])) { $colname_Recordset1 = (get_magic_quotes_gpc()) ? $_POST['key'] : addslashes($_POST['key']); } $sql = "SELECT * FROM shoplist"; if(strlen($colname_Recordset1) > 0){  $colname_Recordset2 = str_replace(" ", " ", colname_Recordset1);  $array = explode(" ", $colname_Recordset2);  $where = "where ";  for($i=0; $i<count($array); $i++){   $where .= "address like '%$array[$i]%'";   if($i < count($array)-1){    $where .= " and ";   }  } } mysql_select_db($database_connTest, $connTest); $Recordset1 = mysql_query($sql.$where, $connTest) or die(mysql_error()); $row_Recordset1 = mysql_fetch_assoc($Recordset1); $totalRows_Recordset1 = mysql_num_rows($Recordset1);

    • ベストアンサー
    • PHP
  • AND検索がきちんとできません

    PHP、MYSQLの勉強を始めたばかりの者です。 AND検索をしたいのですが…… きちんと検索できません。 データの中身 データタイトル|キーワード A|テスト B|サンプル 以下のようにすると、「テ」「ス」でAのデータは出てくるのですが、 「テ」「サ」で検索すると、 一つもでてこないはずなのに、Bのデータが出てきます。 「サ」「テ」ですとAのデータがでてきてしまいます。 何故でしょうか。 自分なりに考えてはみたのですが、お手上げ状態です。 何卒、宜しくお願いします。 <form method="GET" action="sample.php"> <input type="text" name="q" size="20"> <input type="submit" value="search"> </form> <?php require_once 'dbmanager.php'; $pdo = getDb(); // クエリ設定 if (isset($_GET['q'])) { $q = htmlspecialchars($_GET['q']); //クエリを入力 $q = str_replace(" ", " ", trim($q)); $words = explode(" ",$q); } // 解析 $tmp = []; $wd = []; $i = 0; foreach($words as $word) { if(!empty($word)) { $tmp[] = " keyword LIKE :word".$i." "; $wd[] = '%'.$word.'%'; $i++; } } // SQL if(count($tmp) > 0){ $sql = "SELECT * FROM ttables WHERE (".implode("AND",$tmp).") ORDER BY id DESC"; $search_sql = $pdo->prepare($sql); foreach($wd as $key => $word){ $search_sql->bindParam(':word'.$key, $word); } $search_sql->execute(); // while while($row = $search_sql->fetch(PDO::FETCH_ASSOC)) { print"<li>{$row['keyword']}{$row['title']}</li>"; } }

    • ベストアンサー
    • PHP

専門家に質問してみよう