![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
まだ解決できないので、大変恐縮ですがご教授お願いします。
どうかよろしくお願いいたします。
数人にご教授いただいき、チェックボックスの選択には一つのkid(kodawari_keyの略)に対して2複数の値をもっているホテルを表示させるにはデータベースのtableを複数に分けて紐付けする必要があるとアドバイスをいただき、教えて頂いたとおりtableをホテル用とチェックボックス用とチェックボックスのid用とに分けて、SQL文で紐付けしたつもりだったのですが、チェックボックスをチェックしてから検索ボタンを押すと
Fatal error: Call to a member function execute() on a non-object in C:\xampp\htdocs\koredake\xxxxx\xxxxxxx.php on line 97
のようなエラーが出てしまいます。
このことから紐付けのSQL文が間違っているのではと思うのですが、正解がわかりません。
どなたか教えていただけたらと思っております。
//MySQLの部分 教えていただいた部分で大変恐縮です。
//ホテルの基本情報
CREATE TABLE t_hotels(id int not null primary key,name varchar(100) not null,price_min int not null,price_max int not null,address varchar(100) not null);
INSERT INTO t_hotels VALUES(1,'HOTEL A',5000,10000,'栃木県・・・'),
(2,'HOTEL B',5000,12000,'栃木県・・・'),
//こだわり情報
CREATE TABLE t_kodawari_key(id int not null primary key,name varchar(20));
INSERT INTO t_kodawari_key VALUES(1,'温泉'),(2,'ランチ'),(3,' ディナー');
//ホテルごとのこだわり
CREATE TABLE t_hotel_kodawari(hid int not null,kid int not null,unique key(hid,kid));
INSERT INTO t_hotel_kodawari VALUES(1,1),(1,2),(1,3),(2,1),(3,2),(3,3),(4,3);
//温泉かランチにこだわりがあるところ
SELECT hid,t3.name,t3.price_min,t3.price_max,GROUP_CONCAT(t2.name) as kodawari,t3.address
//温泉かランチかディナーのうち2つ以上にこだわりがあるところ
SELECT hid,t3.name,t3.price_min,t3.price_max,GROUP_CONCAT(t2.name) as kodawari,t3.address
//PHP部分 前半省略
<h1>ビジネスホテルの条件検索</h1>
<form name="search_form" action="zenzen16.php" method="post" >
<input type="hidden" name="cmd" value="search" />
<table>
<tr>
<th>物件種別</th>
<td>
<input type="checkbox" name="kid[]" value="1" <?php if( $_REQUEST["kid"] == "1" ){ print( 'checked' ); } ?>/>
温泉
<input type="checkbox" name="kid[]" value="2" <?php if( $_REQUEST["kid"] == "2" ){ print( 'checked' ); } ?>/>
ランチ<br />
<input type="checkbox" name="kid[]" value="3" <?php if( $_REQUEST["kid"] == "3" ){ print( 'checked' ); } ?>/>
ディナー
<input type="checkbox" name="kid[]" value="4" <?php if( $_REQUEST["kid"] == "4" ){ print( 'checked' ); } ?>/>
駐車場</td>
</tr>
<tr>
<th>価格帯</th>
<td>
<input type="text" name="price_min" value="<?php print( htmlspecialchars( $_REQUEST["price_min"] ,ENT_QUOTES ) ) ?>" size="8"> ~
<input type="text" name="price_max" value="<?php print( htmlspecialchars( $_REQUEST["price_max"] ,ENT_QUOTES ) ) ?>" size="8"><br />
</td>
</tr>
<tr>
<th>住所</th>
<td><input type="text" name="address" value="<?php print( htmlspecialchars( $_REQUEST["address"] ,ENT_QUOTES ) ) ?>" size="20"></td>
</tr>
</table>
<input type="submit" value="検索" class="Btn-gray button">
</form>
<p></p>
<?php
if( $_REQUEST["cmd"] == "search" ){
$pdo = new PDO("mysql:host=localhost; dbname=hotel_reservation; charset=utf8", "koredake", "koredake123", array( PDO::ATTR_EMULATE_PREPARES => false ) );
$sql = "select * from t_hotels where 1 = 1 ";
$condition = array();
//この部分が特に自信が無いです。
if( !empty( $_POST["kid"] )){
$sql = $sql . " left outer join kid on t_hotels.hid = kid.hid";
}
if( !empty( $_REQUEST["price_min"] ) ){
$sql = $sql . " and price >= :price_min ";
$condition[":price_min"] = $_REQUEST["price_min"];
}
if( !empty( $_REQUEST["price_max"] ) ){
$sql = $sql . " and price <= :price_max ";
$condition[":price_max"] = $_REQUEST["price_max"];
}
if( !empty( $_REQUEST["address"] ) ){
$sql = $sql . " and ( address like :address ) ";
$condition[":address"] = "%{$_REQUEST["address"]}%";
}
$statement = $pdo->prepare( $sql );
$statement->execute( $condition );
$results = $statement->fetchAll();
?>
<table border="1">
<caption>検索結果</caption>
<tr>
<th></th>
<th>ホテル名</th>
<th>宿泊料金</th>
<th>住所</th>
</tr>
<?php
foreach( $results as $result ){
?>
<tr>
<td><img src="hotel/<?php print( htmlspecialchars( $result["id"], ENT_QUOTES )); ?>.png" /></td>
<td><?php print( htmlspecialchars( $result["hotel_name"], ENT_QUOTES )); ?></td>
<td>\<?php print( htmlspecialchars( number_format( $result["price"] ),ENT_QUOTES ) ); ?></td>
<td>
<?php print( htmlspecialchars( $result["address"], ENT_QUOTES ) ); ?>
</td>
</tr>
<?php
}
}
?>
</table>
</div>
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 ";
}
この回答への補足
checkboxの値で間違いがわかりました。
いろいろプログラム変更していたらフォームをname属性からvalue属性に変えてしまっていて、値の受け渡しができていませんでした。
PHPは何か変な仕様ですね。
ありがとうございました。
親切に教えていただきいつもありがとうございます。
$sql="全体を表す文";で後はandで絞り込むのですね。
大変勉強になります。ある程度の基本があるのですね。
いろいろな全体のSQLの文を考えたのですが、最初の
checkboxのkidが値を拾っていないというか何も受けていないことが
var_dump($sql);
によってわかりました。
checkboxのフォームが悪いのか受け方は変更したのですが、上手くいきません。
やはりデータベースは難しいですね。
誠に恐縮ですが、また機会がありましたらご教授いただけたらと思います。
ありがとうございました。
No.1
- 回答日時:
>$sql = $sql . " left outer join kid on t_hotels.hid = kid.hid";
とありますが・・・
「kid」というテーブルがあるようにみえませんが?
あまり最初から詰め込みすぎずに、徐々に条件を付けていった方がいいですよ
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や他の項目をチェックしなかったら、全てのホテルが表示されてしまします。
本当はチェックしなかったら、表示されないようにしたいのですが。
条件文を単純にしていきたいを思います。
おかげ様で正解に近づいてきていると思います。
ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- MySQL my_itemsテーブルのIDにAUTO_INCREMENT を追加ができるかで 1 2023/01/03 09:09
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
mysql データ更新
-
検索結果にリンクを生成
-
接続ができません
-
phpとmysqlを使っています。
-
LIMIT で条件を満たしているの...
-
バージョン3.23.53からアップグ...
-
phpMyAdminについて
-
PHP+MySQL 接続できません
-
Float型の時の計算結果がおかしい
-
ADOのバージョンを確認する方法
-
MYSQL
-
PHP+ApacheでMySQLに接続できな...
-
SQLのVARCHARとVARCHAR2の違い
-
MYSQLで日本語が入力できない
-
”MySQL”以前は実行できたのです...
-
ページング実装で2ページ目以...
-
phpMyAdimnとコマンドラインで...
-
MySQLとEclipseの接続方法について
-
ODP.NETのバージョン確認
-
MySQLでエラーがでて前に進めま...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フォームから送信した値とMySQL...
-
PHPにてSQLから取得したデータ...
-
mysql sqlエラー
-
mysqlで作ったテーブルをphpで...
-
pdfファイルの管理システム
-
MySQLからのデータをページに1...
-
PHPでMySQLを使った検索のプロ...
-
mysql データ更新
-
プレースホルダを使った複数カ...
-
検索機能
-
MySQLでの順位付けについて
-
データを一括で処理する方法に...
-
PHPでMySQLを使った検索のプロ...
-
PDOでDB ページング
-
配列の要素でmysqlに問い合わせ
-
mysql+php リストボックスにつ...
-
MySQLでデータ表示
-
mysqlの置換について2
-
PHP+MYSQLで検索画面を作成し...
-
PHP&MYSQLでの検索システムにつ...
おすすめ情報