PHPでMySQLを使った検索のプログラム2
まだ解決できないので、大変恐縮ですがご教授お願いします。
どうかよろしくお願いいたします。
数人にご教授いただいき、チェックボックスの選択には一つの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>
お礼
ご回答ありがとうございます。おっしゃるように指定しましたら解決しました!