みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

前回、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>

投稿日時 - 2013-01-23 14:09:33

QNo.7906517

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

>Notice: Undefined index: search_key
>Notice: Undefined index: search_ken
>と言う具合にsearch_keyとsearch_kenが見つからないみたいなことが書いてありました。

Undefined indexなんだから、$_POST['search_key']がない($_POSTはある)ということですよね。

print_r($_POST);

でも入れて、データチェックすればいいんじゃないですか?

投稿日時 - 2013-01-24 14:51:33

ANo.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を使っているのですからプレースホルダを使ってエスケープ処理をさせてやってください。今現在は有効なエスケープ処理が何も入っていませんよね。

投稿日時 - 2013-01-23 16:04:59

補足

解答ありがとうございます。何度も何度も申し訳ありません。

解答を待っている間、いろいろと自分なりに調べて書き換えていたら、ずっと
$search_key = $_POST['search_key'];
$search_ken = $_POST['search_ken'];
の部分でエラーが出てしまうようになってしまいました。
Notice: Undefined index: search_key
Notice: Undefined index: search_ken
と言う具合にsearch_keyとsearch_kenが見つからないみたいなことが書いてありました。

プレースホルダについては、いろいろとサイトを見たりと勉強をしているつもりなのですが、
いまいち理解できず、うまく書くことができません。

本当に何度も何度も申し訳ありません。よろしくお願いします。

投稿日時 - 2013-01-23 16:58:13

ANo.3

すみません、コメントアウトされてる方のSQL見てました。

$select_sql
をechoなどして出力された文字をmysqlに直接実行し、実行できるようにしましょう。

投稿日時 - 2013-01-23 15:37:17

ANo.2

シングルクォート内で変数を使っても、変数値に展開しませんよ。
ちゃんと文字列結合するなりしましょう。
むしろエラーにならないのが不思議な感じがしますが・・・。


それに、search_key、search_kenがともに入力されてなかった時も
今の作りでは出ないと思います。

また、今ようなSQLの実行の仕方ではなく、プレースホルダ―を利用した
プリペアドステートメントによる実行をした方が安全です。
http://pear.php.net/manual/ja/package.database.mdb2.intro-execute.php

投稿日時 - 2013-01-23 15:17:41

ANo.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 のつもり」とかいう
#オチじゃないですよね?

投稿日時 - 2013-01-23 14:48:29

補足

agunuz様、早速の解答ありがとうございます。

>#まさか、OR としているのが「AND のつもり」とかいう
>#オチじゃないですよね?

キーワードか開催地のどちらかで検索させたいということでORを使ったのですが・・・もしかし、ここから間違っていたりしますか?

>どう「うまく反映されない」のでしょうか?

反映されないというのは、検索フォームで入力したキーワードor選択した開催地のどちらかで検索をかけて、ヒットしたモノだけを表示させたいのですが、開催地を北海道と選択しても、キーワードに第2回と入力しても、moe_db内のすべてのデータが表示させられてしまいます。

SELECT * FROM moeinfo WHERE name like '%ああああ%' OR address like '%岩手県%'
これでは、nameはああああ、addressは岩手県でしか検索がヒットしないのではないでしょうか?
検索フォームの所で指定したキーワード、あるいは開催地をSELECT * FROM~の部分に展開させたいと考えていたのですが、無理なのでしょうか?
説明不足かもしれませんが、よろしくお願いします。

投稿日時 - 2013-01-23 15:45:51

あなたにオススメの質問