• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PHPでMySQLを使った検索のプログラム2)

PHPでMySQLを使った検索のプログラム2

このQ&Aのポイント
  • PHPを使ってMySQLを操作するプログラムで、チェックボックスの選択に応じてホテルを検索する機能を実装しています。しかし、検索ボタンを押すとエラーが発生し、原因が分からない状況です。
  • プログラムでは、ホテル情報、こだわり情報、ホテルごとのこだわりの3つのテーブルを作成し、これらを結合して検索を行っています。しかし、結合のSQL文が正しくない可能性があります。
  • 質問者は、MySQLのテーブルとPHPのプログラムのコードを提示しており、特にSQL文の部分に自信がないと述べています。正しいSQL文を教えてほしいとのことです。

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

>>あまり最初から詰め込みすぎずに、徐々に条件を付けていった方がいいですよ >ということはもっと単純な条件式で大丈夫なのでしょうか? え~と、そういうことではなく、たくさん条件を最初から書くと どの条件節でエラーになっているかわかりづらくなるということです。 今回の質問であれば「こだわり」の部分が問題だったのですから ほかの上限や下限料金、住所などはばっさりコメントアウトしてまえば エラーの切り分けができるので、どこを直せばいいか絞り込めます。 デバグをするときにはなるべく簡潔な処理まで切り詰めた方がいいということです。 (まぁ複合バグもあるのでケースバイケースですが・・・) >LEFT OUTER JOINを変更して ちなみに、こまかく見てないのでなんともいえませんが 今回の例だとLEFT JOINした場合はWHEREやHAVINGの処理をかませないと 絞り込みになっていないかもしれません >何もcheckboxや他の項目をチェックしなかったら、全てのホテルが表示されてしまします。 >本当はチェックしなかったら、表示されないようにしたいのですが。 通常の絞り込みのロジックはこう WHERE 1 AND 条件1 AND 条件2 ・・・ AND検索なのですべての条件に当てはまるものが絞り込まれます。 条件が何もない場合なにも表示しないなら フラグ管理して、条件句に条件を付加していくときにフラグを立てるようにし フラグが0の際には条件句の最後に「AND 0」を足せばいいでしょう。 $flag=0; $sql="SELECT * FROM tbl WHERE 1 "; if(条件1){ $sql.="AND hoge='hogehoge' "; flag=1; } if(条件2){ $sql.="AND fuga BETWEEN 'xxx' AND 'yyy' "; flag=1; } if(条件3){ $sql.="AND piyo LIKE 'zzz%' "; flag=1; } if($flag==0){ $sql.="AND 0 "; }

sinto58167
質問者

お礼

親切に教えていただきいつもありがとうございます。 $sql="全体を表す文";で後はandで絞り込むのですね。 大変勉強になります。ある程度の基本があるのですね。 いろいろな全体のSQLの文を考えたのですが、最初の checkboxのkidが値を拾っていないというか何も受けていないことが var_dump($sql); によってわかりました。 checkboxのフォームが悪いのか受け方は変更したのですが、上手くいきません。 やはりデータベースは難しいですね。 誠に恐縮ですが、また機会がありましたらご教授いただけたらと思います。 ありがとうございました。

sinto58167
質問者

補足

checkboxの値で間違いがわかりました。 いろいろプログラム変更していたらフォームをname属性からvalue属性に変えてしまっていて、値の受け渡しができていませんでした。 PHPは何か変な仕様ですね。 ありがとうございました。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

>$sql = $sql . " left outer join kid on t_hotels.hid = kid.hid"; とありますが・・・ 「kid」というテーブルがあるようにみえませんが? あまり最初から詰め込みすぎずに、徐々に条件を付けていった方がいいですよ

sinto58167
質問者

お礼

yambejp様、いつもご指摘感謝いたします。 ということは私はワリと単純なミスで数日間止まっていたんですね。 >あまり最初から詰め込みすぎずに、徐々に条件を付けていった方がいいですよ ということはもっと単純な条件式で大丈夫なのでしょうか? 本のせいにするわけじゃないですけど書籍など調べると SELECT * FROM テーブル1 INNER JOIN テーブル2 ON テーブル1.テーブル1のカラム = テーブル2.テーブル2のカラム だとか場合によっては上記のINNER の部分をLEFT OUTER JOINを変更して条件式あたりを使ってWHEREで絞り込むのだと本に書いてあったので構文が必要だと思っていたのですが勝手な先入観だったのかもしれません。 本だと内部結合、外部結合のなどの構文が最初に出てくるのでそれらを使わないと複数のテーブルを扱えないと思っていたのですが、どうなのでしょう? yamabejp様のアドバイスを受けたら勘違いな気がしてきました。 LEFT OUTER JOIN のkidをt_hotel_kodawari.idに直したら文法のerrorは直りました。 ただ問題なのは何もcheckboxや他の項目をチェックしなかったら、全てのホテルが表示されてしまします。 本当はチェックしなかったら、表示されないようにしたいのですが。 条件文を単純にしていきたいを思います。 おかげ様で正解に近づいてきていると思います。 ありがとうございます。