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

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

解決済みの質問

チェックボックス + フリーワード検索 PHP&MYSQL

現在検索画面の作成をしているのですが、分からないことがありましたので
質問をさせて頂きました。
検索画面ですが、簡単な2ページ構成になっております。(kensaku.phpとresult.php)

仕様としてはkensaku.phpにチェックボックス(複数選択可)と
フリーワードがあり、一つの検索ボタンで検索し結果をresult.phpに表示させようと思っております。データベースはMYSQLです。
検索ボタンが一つしかないため、もしチェックボックスが選択されず、フリーワードだけ入力されたのであれば、それだけで検索。その逆のもし
チェックボックスだけ選択されたのであればそれだけで検索。
また両方入力されたのであれば、両方のデータを検索できるように
したいと思っております。
フリーワード検索までは出来るようになったのですが、
チェックボックス検索(両方検索・片方のみ検索)などが
どうしても出来ません。
どなたかご存知の方ご教授して頂けないでしょうか。
宜しくお願い致します。

こちらがコードになります。

1,kensaku.php

<form action="result.php" method="POST" >
<table class="font12" cellpadding="5" cellspacing="10" width="430" align="center">
<tr>
<td>
<span class="checkbox"><input type="checkbox" name="sejyutu[]" value="1" />aaa</span>
<span class="checkbox"><input type="checkbox" name="sejyutu[]" value="2" />bbb</span>
<span class="checkbox"><input type="checkbox" name="sejyutu[]" value="3" />ccc</span><br />
</td>
</tr>
<tr>
<td><input type="text" name="sejyutu_else" value="フリーワード検索" size="30" /></td>
</tr>
<tr>
<td colspan="2" align="right"><input type="submit" value="検索する" /></td>

2, result.php
<?php

$sejyutu = $_POST["sejyutu"];
$sejyutu_else = $_POST["sejyutu_else"];

if($sejyutu and sejyutu_else<>''){
//DB接続・選択
if (!$int_connect = @mysql_connect('localhost','aaa','aaaa')) {
die("can't connect mysql server.");
}
//データベースに接続
if (!@mysql_select_db("database", $int_connect)) {
die("can't use selected database.");
}



$sql = "select * from table where sejyutu_else like'%$sejyutu_else%'";
$result=mysql_query($sql,$int_connect);
$rows=mysql_num_rows($result);

?>

<table width="430" cellpadding="5" cellspacing="0" class="font12">
<?php
while($row = mysql_fetch_array($result)){

?>
<tr>
<td colspan="2"><p class="salon_name"><?php echo $row["name"]; ?></p></td>
</tr>
<tr>
<td valign="top"><p class="salon_item">最寄り駅:</p></td>
<td class="salon_detail"><?php echo $row["station"]; ?></td>
</tr>
<tr>
<td valign="top"><p class="salon_item">住所:</p></td>
<td class="salon_detail"><?php echo $row["address"]; ?></td>
</tr>
<tr>
<td valign="top"><p class="salon_item">施術名</p></td>
<td class="salon_detail"><?php echo $row["sejyutu"];?></td>
</tr>
<?php
}

}
?>
</table>

</body>
</html>

投稿日時 - 2007-06-28 12:49:45

QNo.3122592

すぐに回答ほしいです

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

たとえばこんな感じ

<?php
//$sejyutu = $_POST["sejyutu"];
//$sejyutu_else = $_POST["sejyutu_else"];
$sejyutu = Array("aaa","bbb","ccc");
$sejyutu_else = "hoge";

$whereStr="";
if(is_array($sejyutu)){
$str="";
foreach($sejyutu as $val){
$str.=($str==""?"":" OR ")."`sejyutu`='{$val}'";
}
$whereStr.=" AND({$str})";
}

if($sejyutu_else!=''){
$whereStr.=<<<eof
AND `sejyutu_else` LIKE '%{$sejyutu_else}%'
eof;
}

if($whereStr=="") $whereStr="AND 0";
$sql =<<<eof
SELECT *
FROM `table`
WHERE 1
{$whereStr}
eof;
print $sql;

?>

検索条件が複数あるときは常にANDでつないでいけば混乱がすくなくてすみます。
インジェクション対策は別途実装ください。

投稿日時 - 2007-06-28 14:40:08

補足

さっそくのご回答ありがとうございます!
コードを拝見させて頂きました。ANDでつなげていくということは大変勉強になりました。ただまだ私PHPと申しますかプログラム自体初心者のため
コードを全て理解するのが難しく、時間をかけないとだめそうです。。
ただあまり時間がなく、、
今の書いていたのがあるのですが あまりうまく動きません。
仕様がめちゃくちゃになっております。、
もしなにかご指摘など頂けるようでしたらお伺い出来ませんでしょうか?
申し訳ございません。

<?php

if (!$int_connect = @mysql_connect('localhost','aaa','aaa')) {
die("can't connect mysql server.");
}
//データベースに接続
if (!@mysql_select_db("database", $int_connect)) {
die("can't use selected database.");
}


if(!isset($_POST['sejyutu'])and isset($_POST['sejyutu_else'])){

$sql = "select * from table where sejyutu_else like '%$sejyutu_else%'";

} else if(isset($_POST['sejyutu'])and !isset($_POST['sejyutu_else'])){

foreach($_POST['sejyutu'] as $value){

$sql = "select * from table where sejyutu like '%$value%'";
}

}else if(isset($_POST['sejyutu'])and isset($_POST['sejyutu_else'])){

$sql = "select * from table where sejyutu and sejyutu_else like '%$value%', '%$sejyutu_else%'";

}else{
echo "検索キーワードを入力して下さい。";
}

$result=mysql_query($sql,$int_connect);
$rows=mysql_num_rows($result);

?>

<table width="430" cellpadding="5" cellspacing="0" class="font12">
<?php
while($row = mysql_fetch_array($result)){

?>
<tr>
<td colspan="2"><p class="salon_name"><?php echo mb_convert_encoding(trim($row["name"]),"sjis","euc-jp") ?></p></td>

</tr>
<tr>
<td valign="top"><p class="salon_item">最寄り駅:</p></td>
<td class="salon_detail"><?php echo mb_convert_encoding(trim($row["station"]),"sjis","euc-jp") ?></td>
</tr>
<tr>
<td valign="top"><p class="salon_item">住所:</p></td>
<td class="salon_detail"><?php echo mb_convert_encoding(trim($row["address"]),"sjis","euc-jp") ?></td>
</tr>
<tr>
<td valign="top"><p class="salon_item">施術名</p></td>
<td class="salon_detail"><?php echo mb_convert_encoding(trim($row["sejyutu"]),"sjis","euc-jp") ?></td>
</tr>
<?php
}
?>
</table>

</body>
</html>

投稿日時 - 2007-06-28 15:03:50

ANo.1

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

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

回答(1)

あなたにオススメの質問