プロが教えるわが家の防犯対策術!

お世話になります。
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-transitio …
<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>

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

A 回答 (4件)

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メッセージ
}

この回答への補足

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

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

補足日時:2009/01/27 18:49
    • good
    • 0
この回答へのお礼

ありがとうございます。

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

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

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

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

お礼日時:2009/01/26 06:13

<input type="checkbox" name="pref[]"


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

参考URL:http://jp.php.net/manual/ja/faq.html.php#faq.htm …
    • good
    • 0

implode('OR',~);



implode(',',~);
では どうですか?
    • good
    • 0
この回答へのお礼

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

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

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

お礼日時:2009/01/26 06:00

県別にinputタグのnameを変えてやるしかないじゃないでしょうか。


$_POSTで調べるときに全てのnameを調べれば済むはずです。
    • good
    • 0
この回答へのお礼

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

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

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

お礼日時:2009/01/26 05:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています