• 締切済み

たびたび申し訳ありません!大至急ご教授願います。

前回、PHPとMySQLの質問をさせていただきました(http://okwave.jp/qa/q7893483.html)。 pearについては、無事問題が解決し、PHPとMySQLの方も、何も表示されない状態から表示される状態まで進みました。ありがとうございました。 しかし、検索結果がうまく反映されず、MySQLにあるデータが表示されてしまいます。 私は、 $select_sql= <<<EOS SELECT * FROM moeinfo WHERE name like '%$search_key%' OR address like '%$search_ken%' EOS; の部分か、 $search_key = $_POST['search_key']; $search_ken = $_POST['search_ken']; の部分がいけないのではないかと考えているのですがいかがでしょうか? また初歩的なミスだとは思いますが、ご教授して頂けるとありがたく思います。よろしくお願いいたします。(画像醜いかもしれません!申し訳ないです。) Windows7 PHP 5.4.9 MySQL 5.5 Apach 2.2.22 phpMyAdmin 3.5.4 <検索フォーム> <html> <head> <title>PHPのテスト</title> <meta http-equiv="Content-Type" content="text/html; Charset=Shift_JIS"> </head> <center> <body bgcolor="#FFFFFF" text="#000000"> <font size="4">PHPのテスト</font> <form name="form1" method="post" action="list.php"> <table width="550" border="10" cellspacing="1" cellpadding="0"> <tr> <td><center>キーワード</td> <td><center><input type="text" name="search_key" size="55" maxlength="300"></td> </tr> <tr> <td><center>開催地</td> <td> <center> <select name="search_ken" > <option value="" selectd>----- 都道府県を選んでください -----</option> <option value="北海道">北海道</option> <option value=青森県">青森県</option> <option value="岩手県">岩手県</option> <option value="宮城県">宮城県</option>         ~~~省略~~~ <option value="宮崎県">宮崎県</option> <option value="鹿児島県">鹿児島県</option> <option value="沖縄県">沖縄県</option> </select> </td> </tr> </table> <br> <input type="submit" value="検 索"> </form> </body> </html> <検索結果> <html> <head> <title>萌えおこしイベントデータベース</title> </head> <body> <?php require_once("MDB2.php"); $dbUser = "root"; $dbPass = "im1907720"; $dbHost = "localhost"; $dbName = "moe_db"; $dbType = "mysql"; $dsn = "$dbType://$dbUser:$dbPass@$dbHost/$dbName"; $conn = MDB2::connect($dsn); if(MDB2::isError($conn)) { die($conn -> getMessage()); } $conn -> disconnect(); //POSTされたデータを受け取り、エスケープします。 $search_key = $_POST['search_key']; $search_ken = $_POST['search_ken']; //$select_sql=mysql_query('SELECT * FROM moeinfo WHERE name like '%$search_key%' OR address like '%$search_ken%''); $select_sql= <<<EOS SELECT * FROM moeinfo WHERE name like '%$search_key%' OR address like '%$search_ken%' EOS; $result=$conn->query($select_sql); if(MDB2::isError($result)) { die($result->getMessage()); } $count=$result->numRows(); print "検索結果は" .$count. "件です。<br>"; if($count> 0){ ?> <table width="1000" border="1" cellspacing="0" cellpadding="8"> <tbody> <tr><th>イベント名</th><th>開催地</th><th>サイトURL</th></tr> <?php while($rs=$result->fetchRow(MDB2_FETCHMODE_ASSOC)) { ?> <tr><td aling="center"> <?=$rs['name']?></td> <td><?=$rs['address']?></td> <td><?=$rs['url']?></td> </tr> <?php } ?> </tbody> </table> <?php } $result->free(); $conn->disconnect(); ?> </body> </html>

みんなの回答

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.5

>Notice: Undefined index: search_key >Notice: Undefined index: search_ken >と言う具合にsearch_keyとsearch_kenが見つからないみたいなことが書いてありました。 Undefined indexなんだから、$_POST['search_key']がない($_POSTはある)ということですよね。 print_r($_POST); でも入れて、データチェックすればいいんじゃないですか?

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.4

>キーワードか開催地のどちらかで検索させたいということでORを >使ったのですが・・・もしかし、ここから間違っていたりしますか? つまりキーワードもしくは開催地のどちらかが「空文字列」の可能性があるということですよね?だとすれば組み立て方が間違っています。 SQL文が SELECT * FROM moeinfo WHERE name like '%ああああ%' OR address like '%岩手県%' であれば(キーワードがああああを含む)or(開催地が岩手県)ですから、1項目に該当がなくても岩手県開催のものがHitします。ところがキーワードが「空文字列」で SELECT * FROM moeinfo WHERE name like '%%' OR address like '%岩手県%' となると、キーワードが「あらゆる値」にマッチしてしまいます。入力された値しかwhereに書いてはいけません。 $where = array(); if ($search_key !== '') { $where[] = "(name like '%" . $search_key . "%')"; } if ($search_ken !== '') { $where[] = "(address like '%" . $search_ken . "%')"; } $select_sql = "SELECT * FROM moeinfo"; if (count($where) > 0) { $select_sql .= ' where ' . implode(' or ' , $where); } などとすべきです。 なお入力された値は下記のようにtrimして使ってください。 $search_key = trim($_POST['search_key']); $search_ken = trim($_POST['search_ken']); すでに他の方から指摘がありますが、せっかくMDB2を使っているのですからプレースホルダを使ってエスケープ処理をさせてやってください。今現在は有効なエスケープ処理が何も入っていませんよね。

kimikj8
質問者

補足

解答ありがとうございます。何度も何度も申し訳ありません。 解答を待っている間、いろいろと自分なりに調べて書き換えていたら、ずっと $search_key = $_POST['search_key']; $search_ken = $_POST['search_ken']; の部分でエラーが出てしまうようになってしまいました。 Notice: Undefined index: search_key Notice: Undefined index: search_ken と言う具合にsearch_keyとsearch_kenが見つからないみたいなことが書いてありました。 プレースホルダについては、いろいろとサイトを見たりと勉強をしているつもりなのですが、 いまいち理解できず、うまく書くことができません。 本当に何度も何度も申し訳ありません。よろしくお願いします。

回答No.3

すみません、コメントアウトされてる方のSQL見てました。 $select_sql をechoなどして出力された文字をmysqlに直接実行し、実行できるようにしましょう。

回答No.2

シングルクォート内で変数を使っても、変数値に展開しませんよ。 ちゃんと文字列結合するなりしましょう。 むしろエラーにならないのが不思議な感じがしますが・・・。 それに、search_key、search_kenがともに入力されてなかった時も 今の作りでは出ないと思います。 また、今ようなSQLの実行の仕方ではなく、プレースホルダ―を利用した プリペアドステートメントによる実行をした方が安全です。 http://pear.php.net/manual/ja/package.database.mdb2.intro-execute.php

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

>検索結果がうまく反映されず、MySQLにあるデータが表示されてしまいます。 どう「うまく反映されない」のでしょうか? print $select_sql; としたSQL文をphpMyAdminで実行すれば、組み立てたSQL文のとおりの結果が返ると思います。 下記のようなテストスクリプトを書けば SELECT * FROM moeinfo WHERE name like '%ああああ%' OR address like '%岩手県%' のようなSQL文になっているのが確認できます。これではダメということですか? (テストスクリプト) <?php if ($_POST) { $search_key = $_POST['search_key']; $search_ken = $_POST['search_ken']; //$select_sql=mysql_query('SELECT * FROM moeinfo WHERE name like '%$search_key%' OR address like '%$search_ken%''); $select_sql= <<<EOS SELECT * FROM moeinfo WHERE name like '%$search_key%' OR address like '%$search_ken%' EOS; print $select_sql . "<br />"; } ?> <form name="form1" method="post" action=""> キーワード<input type="text" name="search_key" size="55" maxlength="300"> 開催地<select name="search_ken" > <option value="" selectd>----- 都道府県を選んでください -----</option> <option value="北海道">北海道</option> <option value=青森県">青森県</option> <option value="岩手県">岩手県</option> <option value="宮城県">宮城県</option> <option value="宮崎県">宮崎県</option> <option value="鹿児島県">鹿児島県</option> <option value="沖縄県">沖縄県</option> </select> <input type="submit" value="検 索"> </form> #まさか、OR としているのが「AND のつもり」とかいう #オチじゃないですよね?

kimikj8
質問者

補足

agunuz様、早速の解答ありがとうございます。 >#まさか、OR としているのが「AND のつもり」とかいう >#オチじゃないですよね? キーワードか開催地のどちらかで検索させたいということでORを使ったのですが・・・もしかし、ここから間違っていたりしますか? >どう「うまく反映されない」のでしょうか? 反映されないというのは、検索フォームで入力したキーワードor選択した開催地のどちらかで検索をかけて、ヒットしたモノだけを表示させたいのですが、開催地を北海道と選択しても、キーワードに第2回と入力しても、moe_db内のすべてのデータが表示させられてしまいます。 SELECT * FROM moeinfo WHERE name like '%ああああ%' OR address like '%岩手県%' これでは、nameはああああ、addressは岩手県でしか検索がヒットしないのではないでしょうか? 検索フォームの所で指定したキーワード、あるいは開催地をSELECT * FROM~の部分に展開させたいと考えていたのですが、無理なのでしょうか? 説明不足かもしれませんが、よろしくお願いします。

関連するQ&A