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

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

締切り済みの質問

checkboxで複数選択して,OR検索を行うことができなくて困っています.

HTML,PHPとMYSQLを用いて
企業の求人情報を検索するフォームを作成しています.
HTMLの入力フォームは
・キーワード入力(企業名)
・プルダウンから選択(業種選択)
・チェックボックスで複数選択(職種選択)
の構成です.
検索を行う際は{企業名 AND 業種 AND (職種[1]OR[2]・・・)}というように職種の部分のみOR検索という構成で考えています.
しかし,職種を複数選択して検索を行うことが出来なくて非常に困っています.
以下が現在作成中のコードです.
HTMLはチェックボックスの部分のみ貼りますね
serch_form.html
<form action="library_search.php" method="post">
<input type="checkbox" name="box[]" value="プログラマー">プログラマー
<input type="checkbox" name="box[]" value="システムエンジニア">システムエンジニア
<br>
<input type="checkbox" name="box[]" value="ネットワークエンジニア">ネットワークエンジニア
<input type="checkbox" name="box[]" value="その他情報系">その他情報系

library_search.php
<html>
<head><title>検索結果</title></head>
<meta http-equiv="Content-Type" content="text/html charset=EUC-JP">
<body>
<?php

//POST表示用

print_r($_POST);

$where = array();
$host = "localhost";

if (!$conn = mysql_connect($host, "usr", "passwd")){
die("データベース接続エラー.<br />");
}
mysql_select_db("db", $conn);

$condition = "";


if(isset($_POST["title"]) && ($_POST["title"] != "")){
$title = mysql_escape_string( $_POST["title"]);
$title = str_replace("%", "\%", $title);
if ($condition == ""){
$condition = "WHERE cname LIKE \"%".$title."%\"";
} else{
$condition .= "AND cname LIKE \"%".$title."%\"";
}
}
if(isset($_POST["pdown"]) && ($_POST["pdown"] != "")){
$pdown = mysql_escape_string( $_POST["pdown"]);
$pdown = str_replace("%", "\%", $pdown);
if ($condition == ""){
$condition = "WHERE gyousyu LIKE \"%".$pdown."%\"";
} else{
$condition .= "OR gyousyu LIKE \"%".$pdown."%\"";
}
}
if(isset($_POST["box"]) && ($_POST["box"] != "")){
//foreach($_POST["box"] as $val){

$where = mysql_escape_string( $_POST["box"]);
$where = str_replace("%", "\%", $where);

//}

if ($condition == ""){
$condition = "WHERE job LIKE \"%".$where."%\"";
} else{
//$where = inplode(' or ' ,$where);
$condition .= "AND job LIKE \"%".$where."%\"";
}
}

$sql = "SELECT * FROM job_table ".$condition." ORDER BY id LIMIT 50";
$res = mysql_query($sql, $conn);



print("<table border=\"1\">");
print("<tr><td>企業名</td><td>業種</td><td>募集職種</td></tr>");
while($row = mysql_fetch_array($res)) {
print("<tr>");
print("<td>".$row["cname"]."</td>");
print("<td>".$row["gyousyu"]."</td>");
print("<td>".$row["job"]."</td>");
print("</tr>");
}
print("</table>");
mysql_free_result($res);
?>
</body>
</html>

特にforeach文を使って,POSTに格納されたjob[]を分解して格納する方法がわかりません.
PHP初心者で汚いコードですが,どうかお願い致します.

投稿日時 - 2008-01-11 07:22:56

QNo.3669168

すぐに回答ほしいです

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

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

回答(1)

ANo.1

最近ヒアドキュメントは駄目だと釘をさされていますが、
あえてここはヒアドキュメントで・・・

この手のSQL作成に関しては基本的には「WHERE 1」とします。
すると条件を設定してないときにすべて表示することになります。
それに「AND」でつないでいくのです。
そうするとWHEREをつける場所の場合分けみたいな処理は不要になります。

配列をまわすのは三項演算子でORをつけて最後にANDをカッコでくくると
よいでしょう。

ちなみにLIKEは前方一致または後方一致しかインデックスがききません。
LIKE '%hoge%'的な使い方ではSQLの高速検索は発揮できませんので
念頭に置いた方がよいでしょう。

<?PHP
/*
エスケープ処理は今回は省略
$KIGYOUMEI=エスケープ処理($_POST['title']);
$GYOUSHU =エスケープ処理($_POST['gyousyu']);
$SHOKUSHU =ループでエスケープ処理($_POST['box']);
*/

//以下テストデータ
$KIGYOUMEI="ソニー";
$GYOUSHU="製造業";
$SHOKUSHU=Array("研究","製造","営業");

if(!empty($KIGYOUMEI)) $where_KIGYOUMEI ="AND `cname` LIKE '%{$KIGYOUMEI}%'";
if(!empty($GYOUSHU)) $where_GYOUSHU ="AND `gyousyu` LIKE '%{$GYOUSHU}%'";

$where_SHOKUSHU="";
if(is_array($SHOKUSHU)){
foreach($SHOKUSHU as $val){
$where_SHOKUSHU.=($where_SHOKUSHU==""?"":" OR ")."`job` LIKE '%{$val}%'";
}
$where_SHOKUSHU="AND ({$where_SHOKUSHU})";
}
$sql = <<<eof
SELECT *
FROM `job_table`
WHERE 1
{$where_KIGYOUMEI}
{$where_GYOUSHU}
{$where_SHOKUSHU}
ORDER BY `id`
LIMIT 50
eof;

print $sql;

?>

投稿日時 - 2008-01-11 09:46:32

あなたにオススメの質問