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

解決済みの質問

php mysql でチェックボックスによる検索

お世話になります。
PHPにてDB(MySQL)に登録されたデータをチェックボックスで検索するスクリプトを組んでおります。

検索項目として(複数チェック可)
住所: □東京都 □神奈川県 □埼玉県
性別: □男   □女
とあります。
例えば東京都、神奈川県、男にチェックを入れた場合、
東京都+男、神奈川県+男のデータを取り出したいのですが、二つチェックを入れた場合、データが見つからないとなってしまします。

同じような質問は全て目を通して試してみたのですが、なかなかうまくいかない為、お力をかしていただければと思います。

スクリプトは以下となっております。

-------------------------------------------------------------
input.php

<html>
<head>
<title>PHP SEARCH</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<form action="search.php" method="POST" >
<form>
<b>住所</b><br>
<input type="checkbox" name="pref[]" value="東京都">東京都<br>
<input type="checkbox" name="pref[]" value="神奈川県">神奈川県<br>
<input type="checkbox" name="pref[]" value="埼玉県">埼玉県<br>
<b>性別</b><br>
<input type="checkbox" name="sex[]" value="男">男<br>
<input type="checkbox" name="sex[]" value="女">女<br>
<br>
<input type="submit" value="検索開始">
</form>
</body>
</html>
-------------------------------------------------------
search.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>サーチ</title>
</head>
<body>
<?php
$pear_path = 'c:/xampp/php/PEAR';
set_include_path(get_include_path() . PATH_SEPARATOR . $pear_path);
require_once('MDB2.php');

// DSNの設定
$dsn = array(
'phptype' => 'mysql',
'username' => 'root',
'password' => '',
'hostspec' => 'localhost',
'database' => 'test01',
);

// オプションの設定
$options = array(
'portability' => MDB2_PORTABILITY_ALL,
);

// 接続
$mdb2 =& MDB2::connect($dsn, $options);
if (PEAR::isError($mdb2)) {
exit('データベースへの接続に失敗しました');
}

// 初期化
$sql = 'set names utf8';
$res =& $mdb2->query($sql);
$mdb2->setFetchMode(MDB2_FETCHMODE_ASSOC);

// 都道府県
if(isset($_POST['pref'])){
$a = implode(' OR ',$_POST['pref']);
}

// 性別
if(isset($_POST['sex'])){
$b = implode(' OR ',$_POST['sex']);
}
// 検索
$sql = "select * from sample where pref in ('$a') AND sex in ('$b')";
$result = $mdb2->query($sql);
if (PEAR::isError(result)) {
exit('接続に失敗しました');
}

$num_rows = $result->numRows();

if($num_rows == 0){
exit('検索結果はありませんでした');
}else{
print $result->numRows()."件のデータがあります";
}

print("<table border=\"1\">\n");
print("<tr>");
print("<th>id</th><th>性別</th><th>都道府県</th>");
print("</tr>");

while($row = $result->fetchRow()){
print("<tr>\n");
print("<td>" . $row['id'] . "</td>");
print("<td>" . $row['pref']. "</td>");
print("<td>" . $row['sex']. "</td>");
print("</tr>\n");
}
// 接続を切る
$mdb2->disconnect();
?>
</body>
</html>

何卒よろしくお願い致します。

投稿日時 - 2009-01-25 11:57:34

QNo.4659300

すぐに回答ほしいです

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

No3です。済みません、なんか、凄い勘違いしてました。implode をexplodと思いこんでいた。
問題は、個々の比較用文字列をクォートで括ってないとか、SQL injection 対策されてない事ですね。

また、送信データがあるならSQLを発行、送信データがないならSQLを発行しないという切り分けも必要ですね。

if( isset($_POST['pref'] and is_array($_POST['pref']) and isset($_POST['sex']) and is_array($_POST['sex']) ){
$a = '`pref` in ("' .implode('","' , array_map('mysql_real_escape_string', $_POST['pref']) ). '")';
$b = '`sex` in ("' .implode('","' , array_map('mysql_real_escape_string', $_POST['sex']) ). '")';
$sql = "select 中略 where $a and $b";
// $sql 発行
}else{
// errorメッセージ
}

投稿日時 - 2009-01-26 02:41:11

補足

implode("','",$_POST['pref']);
と設定することで解決しました!!

わざわざありがとうございました!

投稿日時 - 2009-01-27 18:49:39

お礼

ありがとうございます。

>個々の比較用文字列をクォートで括ってないとか、SQL injection 対策されてない

まだまだ必要なことが沢山あるみたいですね…

記述していただきましたように書き直してみたところ
Parse error: syntax error, unexpected T_LOGICAL_AND, expecting ',' or ')'
と出てしまいました…

どこがいけないのかさっぱりです。
引き続きよろしくお願いします。

投稿日時 - 2009-01-26 06:13:47

ANo.4

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

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

回答(4)

ANo.3

<input type="checkbox" name="pref[]"
このようにname属性に[]付きで入れた場合、$_POST['pref'] は配列になります。
var_dump($_POST) でどんなデータが渡されてるのか確認されることをお薦めします。
http://jp.php.net/manual/ja/faq.html.php#faq.html.arrays

参考URL:http://jp.php.net/manual/ja/faq.html.php#faq.html.arrays

投稿日時 - 2009-01-25 21:49:21

ANo.2

implode('OR',~);

implode(',',~);
では どうですか?

投稿日時 - 2009-01-25 17:08:33

お礼

回答ありがとうございます。

変更してみても、地域を複数選択した場合
「検索結果はありませんでした」と表示されてしまいます…

input.phpからはきちんと複数のデータがきていますので、検索時にうまく受け渡しができていないということなのでしょうか?

投稿日時 - 2009-01-26 06:00:50

ANo.1

zwi

県別にinputタグのnameを変えてやるしかないじゃないでしょうか。
$_POSTで調べるときに全てのnameを調べれば済むはずです。

投稿日時 - 2009-01-25 13:01:41

お礼

早速の回答ありがとうございます。

>県別にinputタグのnameを変えてやる

といただきましたが、チェックボックスの数が増えれば増えるほど大変になってくる気がします…。
他に何かいい方法がありましたら引き続きお願いします。

投稿日時 - 2009-01-26 05:52:46

あなたにオススメの質問