アプリ版:「スタンプのみでお礼する」機能のリリースについて

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;
};

A 回答 (4件)

実際の動作、テーブル構成がわからないので外しているかもしれませんが、チェックボックスのVALUE値が「01:河川・砂防及び海岸」となっているのがおかしいように思えます。


SQL文のWHERE句を生成する箇所でこのVALUEの値をそのまま使用しているのでおかしくなるのではないでしょうか?
通常のテーブルの作り方として、この手の値は数値で持ちます。
つまり、1 や 2 といった値です。
従ってチェックボックスのHTMLを見直すと、

<INPUT TYPE=\"CHECKBOX\" NAME=\"bumon[]\" value=\"1\">01:河川・砂防及び海岸

とすればいいように思えます。
こういった不具合の確認にはまず生成されたSQL文を表示してみてください。
またクエリを実行したあとエラーになるならば、mysql_error関数でエラーの内容が取得できますので参考にするとよろしいかと思います。
    • good
    • 0
この回答へのお礼

ありがとうございました。
生成されたSQL文を表示させながら、なんとかエラーを見つけました。

$sql .= "bumon = '$fr';

$sql .= "bumon = '$fr'";]
と最後に「"」を追加したら検索できるようになりました。
ただ、教えていただいたように、value=\"1\" として検索してSQL文を表示させたところ
select * from tecris where (bumon = '1') と表示され、検索できませんでした。

また、検索は出来るようになったのですが、検索ボタンを押すと、チェックボックスのチェックマークがなくなってしまいます。
表示したままには出来ないものでしょうか?
よろしかったらご教授願います。

お礼日時:2005/08/16 00:19

ごめんなさい。


下の例では正常動作しませんでした・・・
ほんと、すいません。
確かにチェックボックスが増えますね。
これは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\">";
}



動いたのでしたらよかったです^^
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/08/19 12:18

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;
}

補足日時:2005/08/18 21:40
    • good
    • 0

チェックボックスの項目のテーブルを別に持ってリレーションさせたほうがいいと思います。



テーブル構造がどうなっているかは分かりませんが、
現在 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:河川・砂防及び海岸
・・・・・・・・・・・・・・・・
の代わりに入れて試してみたのですが、
チェックボックスにチェックを入れて検索すると、そのたびにチェックボックスが増えてしまいます。
入れるところが悪いのでしょうか?

補足日時:2005/08/17 15:00
    • good
    • 0

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