• 締切済み

checkbokとキーワード検索を組み合わせた検索

PHP4とMySQL4.0.22を使っています。 チェックボックスとキーワードで検索結果を表示させたいと思い。 下記のようにプログラムを作成したのですが、うまく検索表示してくれません。 PHPもMySQLも初心者なため、あちこちの構文を寄せ集めたため、Parseもうまく通っていません。 どこをどういう風にすればうまくいくのか、教えていただけないでしょうか? よろしくお願いします。 ----------------------------以下PHPファイル----------- 検索フォーム 検索キーワード:<input type=text name=\"k\"value='$k' size=45 > チェックボックス <INPUT TYPE=\"CHECKBOX\" NAME=\"bumon[]\" value=\"01:河川・砂防及び海岸\">01:河川・砂防及び海岸 ・・ "; //データ検索結果の実行部分 if($sig=="kb"){ $wk ==""; if($wk<>""){ //チェックボックス $sql = "select * from tecris where"; $sql .= " ("; $i=0; foreach($_POST['bumon'] as $fr) { if ($i) { $sql .= " or "; } $sql .= "bumon = '$fr'; $i++; } $sql .= ") and "; //キーワード if($k<>""){ $xk = str_replace(" "," ",$k); $gk = explode(" ",$xk); $wk ="keyword like '%$gk[0]%'"; $i = 1; $n = count($gk) - 1; while ($i <= $n){ $wk = $wk . " and keyword like '%$gk[$i]%'"; $i++; } } //クエリの作成 $sql = $sql . $wk; };

みんなの回答

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.4

ごめんなさい。 下の例では正常動作しませんでした・・・ ほんと、すいません。 確かにチェックボックスが増えますね。 これはforeachでチェック一つに付き二つ書き出しているためです。 チェックが多く付くごとにチェックボックスが増えていきます。 やるんでしたらこうしないとダメでしたね^^;; if ($_POST['bumon']) { for($i=1;$i<=2;$i++) { $flag = 0; foreach ($_POST['bumon'] as $bt) { if ($bt == $i) { print "<INPUT TYPE=\"CHECKBOX\" NAME=\"bumon[]\" value=\"$i\" checked>"; $flag++; } } if (!$flag) { print "<INPUT TYPE=\"CHECKBOX\" NAME=\"bumon[]\" value=\"$i\">"; } } } else { print "<INPUT TYPE=\"CHECKBOX\" NAME=\"bumon[]\" value=\"1\">"; print "<INPUT TYPE=\"CHECKBOX\" NAME=\"bumon[]\" value=\"2\">"; } 動いたのでしたらよかったです^^

jacal
質問者

お礼

moon_night様 何度もありがとうございました。 ご教授頂いた方が、短くて済みそうですね。 次回試してみたいと思います。 本当にありがとうございました。

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.3

foreach ($_POST['bumon'] as $bt) { if ($bt == '1') { ・・・(略) } の(略)の部分を正確に教えていただければ答えられると思いますが、その補足情報では回答ができません。

jacal
質問者

補足

略の部分は教えていただいたとおり print "<INPUT TYPE=\"CHECKBOX\" NAME=\"bumon[]\" value=\"1\" checked>"; } else { print "<INPUT TYPE=\"CHECKBOX\" NAME=\"bumon[]\" value=\"1\">"; } を記載しました。 その後、私のほうでも色々試してみました。 http://okweb.jp/kotaeru.php3?q=1506155 と手元にあった参考書「MySQL以前」を参考に次のように作成したら、うまくできるようになりました。これで本当に良いのか、もっと簡単に書けるのではないかと思いますが、結果はうまく検索できているみたいです。 いろいろとありがとうございました。 if($ca == '01'){$c01 = "checked";} if($cb == '02'){$c02 = "checked";} ---------------途中省略----------- //チェックボックス <p> <INPUT TYPE=\"CHECKBOX\" NAME=\"ca\" value=\"01\" $c01>01:河川・砂防及び海岸 <INPUT TYPE=\"CHECKBOX\" NAME=\"cb\" value=\"02\" $c02>02:港湾及び空港 </p>\n"; ---------------途中省略----------- //クエリの作成 $sql = "select * from tecris where "; $sql .= "("; $i=0; if($_POST['ca']) {if ($i) {$sql .= " or ";}$sql .= "ID = '01'";$i++;} if($_POST['cb']) {if ($i) {$sql .= " or ";}$sql .= "ID = '02'";$i++;} $sql .= ") and "; if($wk<>""){ $sql = $sql; }

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.2

チェックボックスの項目のテーブルを別に持ってリレーションさせたほうがいいと思います。 テーブル構造がどうなっているかは分かりませんが、 現在 bumon フィールドに 「01:河川・砂防及び海岸」と入っていると思いますが、このフィールドを数字だけにして、別に 項目テーブル ID | 項目内容 1 | 01:河川・砂防及び海岸 というようにすれば検索しやすいと思います。(リレーションをはる) どちらにしろ検索キーワードを使っているので文字コードをあわせないといけませんけども。 チェックボックスのチェックは foreach ($_POST['bumon'] as $bt) { if ($bt == '1') { print "<INPUT TYPE=\"CHECKBOX\" NAME=\"bumon[]\" value=\"1\" checked>"; } else { print "<INPUT TYPE=\"CHECKBOX\" NAME=\"bumon[]\" value=\"1\">"; } if ($bt == '2') { print "<INPUT TYPE=\"CHECKBOX\" NAME=\"bumon[]\" value=\"2\" checked>"; } else { print "<INPUT TYPE=\"CHECKBOX\" NAME=\"bumon[]\" value=\"2\">"; } ・・・(略) } という風にすればできます。

jacal
質問者

補足

moon_nightさま、お返事いただきましてありがとうございました。 早速、IDを入れて、テーブル構造を ID bumon          keyword 01 01:河川・砂防及び海岸 沿岸道路 ・ ・・・・・・・・・・・・ ・・・・ としました。 そしてチェックボックスも foreach ($_POST['bumon'] as $bt) { if ($bt == '1') { ・・・(略) } を <INPUT TYPE=\"CHECKBOX\" NAME=\"bumon[]\" value=\"01:河川・砂防及び海岸\">01:河川・砂防及び海岸 ・・・・・・・・・・・・・・・・ の代わりに入れて試してみたのですが、 チェックボックスにチェックを入れて検索すると、そのたびにチェックボックスが増えてしまいます。 入れるところが悪いのでしょうか?

  • ttyp03
  • ベストアンサー率28% (277/960)
回答No.1

実際の動作、テーブル構成がわからないので外しているかもしれませんが、チェックボックスのVALUE値が「01:河川・砂防及び海岸」となっているのがおかしいように思えます。 SQL文のWHERE句を生成する箇所でこのVALUEの値をそのまま使用しているのでおかしくなるのではないでしょうか? 通常のテーブルの作り方として、この手の値は数値で持ちます。 つまり、1 や 2 といった値です。 従ってチェックボックスのHTMLを見直すと、 <INPUT TYPE=\"CHECKBOX\" NAME=\"bumon[]\" value=\"1\">01:河川・砂防及び海岸 とすればいいように思えます。 こういった不具合の確認にはまず生成されたSQL文を表示してみてください。 またクエリを実行したあとエラーになるならば、mysql_error関数でエラーの内容が取得できますので参考にするとよろしいかと思います。

jacal
質問者

お礼

ありがとうございました。 生成されたSQL文を表示させながら、なんとかエラーを見つけました。 $sql .= "bumon = '$fr'; を $sql .= "bumon = '$fr'";] と最後に「"」を追加したら検索できるようになりました。 ただ、教えていただいたように、value=\"1\" として検索してSQL文を表示させたところ select * from tecris where (bumon = '1') と表示され、検索できませんでした。 また、検索は出来るようになったのですが、検索ボタンを押すと、チェックボックスのチェックマークがなくなってしまいます。 表示したままには出来ないものでしょうか? よろしかったらご教授願います。

関連するQ&A