![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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;
};
No.1ベストアンサー
- 回答日時:
実際の動作、テーブル構成がわからないので外しているかもしれませんが、チェックボックスのVALUE値が「01:河川・砂防及び海岸」となっているのがおかしいように思えます。
SQL文のWHERE句を生成する箇所でこのVALUEの値をそのまま使用しているのでおかしくなるのではないでしょうか?
通常のテーブルの作り方として、この手の値は数値で持ちます。
つまり、1 や 2 といった値です。
従ってチェックボックスのHTMLを見直すと、
<INPUT TYPE=\"CHECKBOX\" NAME=\"bumon[]\" value=\"1\">01:河川・砂防及び海岸
とすればいいように思えます。
こういった不具合の確認にはまず生成されたSQL文を表示してみてください。
またクエリを実行したあとエラーになるならば、mysql_error関数でエラーの内容が取得できますので参考にするとよろしいかと思います。
ありがとうございました。
生成されたSQL文を表示させながら、なんとかエラーを見つけました。
$sql .= "bumon = '$fr';
を
$sql .= "bumon = '$fr'";]
と最後に「"」を追加したら検索できるようになりました。
ただ、教えていただいたように、value=\"1\" として検索してSQL文を表示させたところ
select * from tecris where (bumon = '1') と表示され、検索できませんでした。
また、検索は出来るようになったのですが、検索ボタンを押すと、チェックボックスのチェックマークがなくなってしまいます。
表示したままには出来ないものでしょうか?
よろしかったらご教授願います。
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\">";
}
動いたのでしたらよかったです^^
moon_night様
何度もありがとうございました。
ご教授頂いた方が、短くて済みそうですね。
次回試してみたいと思います。
本当にありがとうございました。
No.3
- 回答日時:
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\">";
}
を記載しました。
その後、私のほうでも色々試してみました。
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;
}
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\">";
}
・・・(略)
}
という風にすればできます。
この回答への補足
moon_nightさま、お返事いただきましてありがとうございました。
早速、IDを入れて、テーブル構造を
ID bumon keyword
01 01:河川・砂防及び海岸 沿岸道路
・ ・・・・・・・・・・・・ ・・・・
としました。
そしてチェックボックスも
foreach ($_POST['bumon'] as $bt) {
if ($bt == '1') {
・・・(略)
}
を
<INPUT TYPE=\"CHECKBOX\" NAME=\"bumon[]\" value=\"01:河川・砂防及び海岸\">01:河川・砂防及び海岸
・・・・・・・・・・・・・・・・
の代わりに入れて試してみたのですが、
チェックボックスにチェックを入れて検索すると、そのたびにチェックボックスが増えてしまいます。
入れるところが悪いのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C#でDBの特定列をUpdate
-
cron
-
ResultSetインターフェイスでの...
-
一度検索されたものに対するソ...
-
INSERT,DELETEを同時に
-
filter_input で取得した型は何...
-
PHPでMySQLのテーブルからcount...
-
MYSQL UPDATE
-
MySQLにmd5が登録できません。
-
変数にNULLを代入したい
-
SQL文が実行できません
-
ユーザーアカウンントの重複を...
-
mysqlにあるemailへそれぞ...
-
sqlの検索結果件数を知りたい
-
読み込んだファイル中の文字列...
-
MySQL接続のPHPの記述に関しまして
-
select文
-
DB::connectでパスワードに「@...
-
PHPからMySQL・異なるDBにコピー
-
PHPでMySQLのデータを2次元配...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
insert1つの処理でもトランザ...
-
Pro*Cの構文エラー
-
JAVA SQLServerException 列名 ...
-
<VB.NET>INSERT文でDBにデータ...
-
VB.NET エラーになる箇...
-
MySQLのINSERT時にたまに重複に...
-
一度検索されたものに対するソ...
-
ResultSetインターフェイスでの...
-
チェックボックスからの複数検...
-
PHP初心者です。syntax error, ...
-
PHP+SQLite でSELECT文のWHERE...
-
エクセルVBAのデータベース接続...
-
PHPよりMySQLの操作のコードの...
-
phpで複数の検索語を検索対象に...
-
php MySQL で、更新ボタンを押...
-
VBA ACCESS SQL...
-
C#でDBの特定列をUpdate
-
PHP&MySQLでの文字列+数列の一...
-
データベースに存在するデータ...
-
ASPでSQL文を使う場合に。
おすすめ情報