PDOを使ったSQL文の入力方法

このQ&Aのポイント
  • PDOを使ってSQL文を実行する方法について教えてください。
  • 特定の地域や条件で絞り込んだ結果を表示させたいです。
  • bukkenとkodawariというテーブルを使用して、kidの条件による絞り込みを行いたいです。
回答を見る
  • ベストアンサー

PDOを使ったSQL文の入力方法

私のやりたいことはSQL文の実行なのですが、PDOを使った操作になります。 どうかご教授お願い致します。 <th>価格帯</th> <td> <select name="price_min"> <option value="1" selected="selected">下限なし</option> <option value="10000000">1000万</option> <option value="15000000">1500万</option> <option value="20000000">2000万</option> 以下略 <th>愛知県 - 名古屋市</th> <td> <input type="checkbox" name="chiiki_id[]" value="1" <?php if (isset($_REQUEST['chiiki_id']) and in_array('1',$_REQUEST['chiiki_id'])) print 'checked'; ?>/> 中村区 <input type="checkbox" name="chiiki_id[]" value="2" <?php if (isset($_REQUEST['chiiki_id']) and in_array('2',$_REQUEST['chiiki_id'])) print 'checked'; ?>/> 西区 <input type="checkbox" name="chiiki_id[]" value="3" <?php if (isset($_REQUEST['chiiki_id']) and in_array('3',$_REQUEST['chiiki_id'])) print 'checked'; ?>/> 昭和区 <input type="checkbox" name="chiiki_id[]" value="4" <?php if (isset($_REQUEST['chiiki_id']) and in_array('4',$_REQUEST['chiiki_id'])) print 'checked'; ?>/> 港区 </td> <th>こだわり条件</th> <td> <input type="checkbox" name="kid[]" value="1" <?php if (isset($_REQUEST['kid']) and in_array('1',$_REQUEST['kid1'])) print 'checked'; ?>/> 新築 <input type="checkbox" name="kid[]" value="2" <?php if (isset($_REQUEST['kid']) and in_array('2',$_REQUEST['kid2'])) print 'checked'; ?>/> 南向き <input type="checkbox" name="kid[]" value="3" <?php if (isset($_REQUEST['kid']) and in_array('3',$_REQUEST['kid3'])) print 'checked'; ?>/> セキュリティ充実 <input type="checkbox" name="kid[]" value="4" <?php if (isset($_REQUEST['kid']) and in_array('4',$_REQUEST['kid4'])) print 'checked'; ?>/> 市街地が近い<br /> <input type="checkbox" name="kid[]" value="5" <?php if (isset($_REQUEST['kid']) and in_array('5',$_REQUEST['kid5'])) print 'checked'; ?>/> 内装リフォーム <input type="checkbox" name="kid[]" value="6" <?php if (isset($_REQUEST['kid']) and in_array('6',$_REQUEST['kid6'])) print 'checked'; ?>/> システムキッチン <input type="checkbox" name="kid[]" value="7" <?php if (isset($_REQUEST['kid']) and in_array('7',$_REQUEST['kid7'])) print 'checked'; ?>/> ペット可</td> </tr> </table> <input type="submit" value="検索" class="Btn-gray button"> </form> $sql = 'SELECT DISTINCT * FROM bukken'; //名古屋の地域checkbox if(isset($_POST['chiiki_id'])and is_array($_POST['chiiki_id'])){ $ary = array_filter($_POST['chiiki_id'], function($v) {return is_numeric($v);}); $sqlA = 'id IN (SELECT chiid FROM chiiki WHERE chiiki_id IN ('.implode(',', $ary).'))'; }else{ //print '地域がチェックされてません'; $sqlA = ' 1 '; } //kid絞り込み if(isset($_POST['kid'])and is_array($_POST['kid'])){ $ary = array_filter($_POST['kid'], function($v) {return is_numeric($v);}); $sqlK1 = 'id IN (SELECT fid FROM fudou_kodawari2 WHERE kid IN ('.implode(',', $ary).'))'; }else{ //print '<br />こだわりがチェックされてません'; $sqlK1 = ' 1 '; } のようなフォームからチェックされた値のkidのところを絞った条件で表示させたいです。下記のPHPで値を受けてSQL文をMySQLに接続してSQLを実行するのですが、中々出来ません。 そして テーブルがbukkenとkodawariがあります。 bukken id bukken_name chiiki_id address price_min price_max     station 1 名駅MID    1 愛知県名古屋市中村区 40770000 55100000 名古屋駅 2 プレサン浄心 2 愛知県名古屋市西区城西 30800000 40001000 浄心駅 3 アネシア八事 3 愛知県名古屋市昭和区 50000000 62510000 八事日赤 4 アメニ港明 4 愛知県名古屋市港区港明 25000000 35000000 港区役所駅 5 ユーハウス上飯田 15 愛知県名古屋市北区 32000000 43330000 上飯田駅 6 ローレル葵 6 愛知県名古屋市東区葵x 30000000 46000000 高岡駅 7 ライオンズ2 愛知県名古屋市西区山木 35000000 55000000 上小田井駅 8 ポレスター名西 2 愛知県名古屋市西区名西 28000000 38000000 浄心駅 fudou_kodawari2 fid kid 1 1 1 2 1 3 2 1 3 2 3 3 3 4 4 3 5 4 6 4 7 1 8 1 8 2 8 4 このようなテーブルでSELECT DISTINCT * FROM bukken WHERE (id IN (SELECT fid FROM fudou_kodawari2 WHERE kid IN (1,2,3)))と言うSQL文を入力すると id bukken_name chiiki_id address price_min price_max     station 1 名駅MID    1 愛知県名古屋市中村区 40770000 55100000 名古屋駅 2 プレサン浄心 2 愛知県名古屋市西区城西 30800000 40001000 浄心駅 3 アネシア八事 3 愛知県名古屋市昭和区 50000000 62510000 八事日赤 4 アメニ港明 4 愛知県名古屋市港区港明 25000000 35000000 港区役所駅 7 ライオンズ2 愛知県名古屋市西区山木 35000000 55000000 上小田井駅 8 ポレスター名西 2 愛知県名古屋市西区 28000000 38000000 浄心駅 kidの条件 1の場合  fidが 1,2,7,8 2の場合 fidが 1,3,8 3の場合  fidが 1,3,4 なので  1,2,3,4,7,8 という結果が表示されますが、1,2,3の全てに一致する条件しか表示できないようにする(結果が1になる)にはどのようなSQL文を入力すれば良いのでしょうか?

  • PHP
  • 回答数3
  • ありがとう数5

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

  • ベストアンサー
  • JaneDue
  • ベストアンサー率75% (263/350)
回答No.3

>今回はとにかく2テーブルで作ってみたいです。 了解。ただし今後いろいろ機能追加しようとすると、どんどん辛くなってきますよ。覚悟。 HAVING COUNT(*) = N の部分は、「kidの個数」が入ればよいので、 count($_POST['kid']) で取得できます。 その他どんな関数があるのか目を通しておくとよいです。 http://jp2.php.net/manual/ja/ref.array.php kidが1個しかない場合でも動きますが、本来は WHERE kid = X だけにして、 fid毎にまとめるGROUP BY ~や、集計するHAVING COUNT~は不要です。 余力があれば1個の時を分岐させてみて下さい。

sinto58167
質問者

お礼

JaneDue様、いつもアドバイスいただき、ありがとうございます! おかげさまでHAVING COUNT(*) = count($_POST['kid'])が実行でき、条件を絞ることが出来ました! コードの文法を間違えるとsyntax errorなどが出てくるので私にとってかなり難しかったですが、何とか上手く実行することができました。 本当にありがとうございます! >余力があれば1個の時を分岐させてみて下さい。 ちょっと時間がかかるかもしれませんが、こちらも頑張ってみたいと思います! あとは画像も表示させたいです。頑張ってみようと思います。 本当にデータベースと接続して検索できるホームページの制作の難しさ は想像以上です。 また機会があればよろしくお願い致します!

その他の回答 (2)

  • JaneDue
  • ベストアンサー率75% (263/350)
回答No.2

kid 1,2,3 すべてを持つ 物件id を取得したい、という事であれば。 SELECT * FROM bukken WHERE id IN(   SELECT fid   FROM fudou_kodawari2   WHERE kid IN (1,2,3) -- kidが1か2か3   GROUP BY fid -- fid毎にまとめて   HAVING COUNT(*)=3 -- その合計が3個のもの ) でいけるかと。 ご質問の主旨とは異なりますが、テーブルの切り方がまずくありませんか?。こだわり条件って確か「南向き」とか「新築」とかでしたよね。だとすれば別テーブルにしない方がよいのではないでしょうか。 例として(混乱すると困るので参考程度に軽く読んで下さい) 例えば「 1 物件につき画像 1枚 」の場合は、物件テーブルに直接 カラム image を作れば良いですよね。 一方「画像は何枚でもOK」としたい場合は、データがいくつになるか不明なので、画像用テーブルを別に作成すべき、ということになります。 考え方としては「物件が決まれば一意的に決まる内容」は直接物件テーブルにまとめ、データ数不明の場合は別テーブルにします。 別例として[売主id]でしたら 1物件につき1人なので物件テーブルに、[下見した顧客id]なら件数不明になるので別テーブルにします。 同じく[物件紹介文]なら物件テーブルに、[見た人の感想文]なら別テーブルへ。 [最寄駅]なら物件テーブルに、[近い駅]なら別テーブルへ…という感じです。 さて、当該のこだわり条件についてですが、一見いくつ該当するか不明なので別テーブルがふさわしいようにも思えますが、実際には「南向き」かどうか、「新築」かどうか等の各条件は其々まったく別の性格のもので、「物件がきまれば自動的に決まるその物件の属性」と観ることができます。 また、データ数も不明ではありません。(全条件の数以上に条件がある、ということはあり得ませんよね) くどくなりましたが、こだわり条件は直接物件テーブルに入れる方がよいのではないかと。(今の状態でも出来ないことはありませんが、正規化がうまくいっていない為クエリは複雑になり処理も遅くなってしまいます) ご参考まで。

sinto58167
質問者

お礼

すみません書き忘れてしまったのですが、1つのテーブルで作る意見もいただき本当にありがとうございます! 試したいのですが、現在の2テーブルパターンを途中までかれこれ2、3ヶ月も悩んで途中まで作ってしまっているので(笑)、後には引けない状態になっております。 余裕ができたら1テーブルも試したいと思っているので今回はとにかく2テーブルで作ってみたいです。 わがまま言って申し訳ないです。 あと補足の補足なのですが、文章を書き忘れていた部分がありました。 読み辛くて申し訳ありません。 ここで一つ疑問なのですが、HAVING COUNT(*) = 3以外のチェックが付いたとき(例えば1,4とか1,2などはHAVING COUNT(*) = 2で   チェックが付いたのが1つとかだったらHAVING COUNT(*) = 1ですよね? HAVING COUNT(*) = N のNの部分はチェックボックスにチェックした数に対応して自動に変化させることってできないでしょうか? もしくは全然べつの方法でも良いですが 今のままだとHAVING COUNT(*) = 3じゃないと対応できないですよね? ユーザーによってはチェックをいくつつけるのかわからないのでそれに対応するコードを作ってみたいです。 もちろん私が設定した条件でのコードを教えてもらったのでできないのは私のせきにんなのですが。 もしよろしければ そんなときの対応のためのSQL文はどのようなものかご教授いただけないでしょうか? 気が向きましたらまたよろしくお願い致します。

sinto58167
質問者

補足

アドバイスいただき本当にありがとうございます! 私の理解力が無いのがかなり申し訳ないですがどうかご容赦いただきますようよろしくお願い致します。 下記のようなフォームに1,2,3にチェックがついたとしたら フォームからチェックボックスに受けたとして、 <th>こだわり条件</th> <td> <input type="checkbox" name="kid[]" value="1" <?php if (isset($_REQUEST['kid']) and in_array('1',$_REQUEST['kid'])) print 'checked'; ?>/> 新築 <input type="checkbox" name="kid[]" value="2" <?php if (isset($_REQUEST['kid']) and in_array('2',$_REQUEST['kid'])) print 'checked'; ?>/> 南向き <input type="checkbox" name="kid[]" value="3" <?php if (isset($_REQUEST['kid']) and in_array('3',$_REQUEST['kid'])) print 'checked'; ?>/> セキュリティ充実 <input type="checkbox" name="kid[]" value="4" <?php if (isset($_REQUEST['kid']) and in_array('4',$_REQUEST['kid'])) print 'checked'; ?>/> 市街地が近い<br /> <input type="checkbox" name="kid[]" value="5" <?php if (isset($_REQUEST['kid']) and in_array('5',$_REQUEST['kid'])) print 'checked'; ?>/> 内装リフォーム <input type="checkbox" name="kid[]" value="6" <?php if (isset($_REQUEST['kid']) and in_array('6',$_REQUEST['kid'])) print 'checked'; ?>/> システムキッチン <input type="checkbox" name="kid[]" value="7" <?php if (isset($_REQUEST['kid']) and in_array('7',$_REQUEST['kid'])) print 'checked'; ?>/> ペット可</td> </tr> </table> 次に値を受けるPHPの式はアドバイスのSQLを実行するために下記のように入力しました。 if(isset($_POST['kid'])and is_array($_POST['kid'])){ $ary = array_filter($_POST['kid'], function($v) {return is_numeric($v);}); $sqlK1 = 'id IN(SELECT fid FROM fudou_kodawari2 WHERE kid IN ('.implode(',', $ary).') GROUP BY fid HAVING COUNT(*) = 3'; こうするとPDOでMySQLに下記のようなSQL文が実行されます。 SELECT * FROM bukken WHERE id IN(SELECT fid FROM fudou_kodawari2 WHERE kid IN (1,2,3) GROUP BY fid HAVING COUNT(*) = 3) そうすることによって id ,bukken_name ,chiiki_id ,address price_min price_max station 1 名駅MID 1 愛知県名古屋市中村区 40770000 55100000 名古屋駅 のような結果が出てきました。 ここで一つ疑問なのですが、HAVING COUNT(*) = 3以外のチェックが付いたとき(例えば1,4とか1,2などはHAVING COUNT(*) = 2で   チェックが付いたのが1つとかだったらHAVING COUNT(*) = 1ですよね? もちろん私が設定した条件でのコードを教えてもらったのでできないのは私のせきにんなのですが。 もしよろしかったのであれば そんなときの対応のためのSQL文はどのようなものかご教授いただけないでしょうか?

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

正しいSQL文の組立てと、PDOへの組み込みは分けて考えて。 > なので 1,2,3,4,7,8 という結果が表示されますが 、1,2,3の全てに一致する条件 fidなのか、kidなのか、ごちゃごちゃになりませんか? > SELECT DISTINCT * FROM bukken WHERE (id IN (SELECT fid FROM fudou_kodawari2 WHERE kid IN (1,2,3))) SELECT * FROM bukken WHERE (id IN (SELECT DISTINCT fid FROM fudou_kodawari2 WHERE kid IN (1,2,3))) じゃないですか?

sinto58167
質問者

補足

アドバイスいただき誠に感謝いたします。 ありがとうございます! DISTINCTは無くしたほうが良いのですね。

関連するQ&A

  • MySQLの質問です。2

    お世話になります。 以前質問させていただいたのですがごちゃごちゃになってしまったので項目など見直してもっと単純な作りにしたいと思います。 MySQLを使ったWEBアプリを作っているのですが、特にこだわりのcheckboxと地域のcheckboxで分けてフォームからPHPのプログラムで受けて展開させる方法がわかりません。 どなたかご教授いただけたらと思っております。 テーブルに関しては賛否両論ですが、まずは3つでやってみたいと思います。 1つのほうが簡単そうなのですが、せっかく作ったので。 SQL文の間違いなのはわかっているのですがどうしてもわかりません。 何卒よろしくお願い致します。 下記のようなフォームにしたいと思っております。 <h1>マンション物件の条件検索</h1> <form name="search_form" action="mansion.php" method="post" > <input type="hidden" name="cmd" value="search" /> <table> <tr> <th>価格帯</th> <td> <select name="price_min"> <option value="1" selected="selected">下限なし</option> <option value="10000000">1000万</option> <option value="15000000">1500万</option> 略 </select> ~ <select name="price_max"> <option value="999999999999" selected="selected">上限なし</option> <option value="10000000">1000万</option> 略 </select> </td> </tr> <tr> <th>愛知県 - 名古屋市</th> <td> <td> <input type="checkbox" name="chiiki_id[]" value="1" <?php if( $_REQUEST["chiiki_id"] == "1" ){ print( 'checked' ); } ?>/> 中村区 <input type="checkbox" name="chiiki_id[]" value="2" <?php if( $_REQUEST["chiiki_id"] == "2" ){ print( 'checked' ); } ?>/> 西区 略 </tr> <tr> <th>愛知県 - その他の地域</th> <td> <input type="checkbox" name="chiiki_id[]" value="1" <?php if( $_REQUEST["chiiki_id"] == "1" ){ print( 'checked' ); } ?>/> 尾張 <input type="checkbox" name="chiiki_id[]" value="2" <?php if( $_REQUEST["chiiki_id"] == "2" ){ print( 'checked' ); } ?>/> 三河 </td> </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' ); } ?>/> 南向き <input type="checkbox" name="kid[]" value="3" <?php if( $_REQUEST["kid"] == "3" ){ print( 'checked' ); } ?>/> セキュリティ充実 </td> </tr> </table> <input type="submit" value="検索" class="Btn-gray button"> </form> <p>&nbsp;</p> <?php //初期設定 //username,$password,$dbnameは適当に if( $_REQUEST["cmd"] == "search" ){ $dsn = 'mysql:host=localhost;dbname=fudousan'; $username = 'xxxxx'; $password = 'xxxxxxx'; $data=array(); $sql = "SELECT t1.* FROM bukken as t1 "; $flag=true; //kid絞り込み if(isset($_REQUEST["kid"]) and is_array($_REQUEST["kid"])){ $sql.="INNER JOIN (SELECT DISTINCT fid FROM fdou_kodawari WHERE kid in ("; $sql.=implode(",",array_fill(0,count($_REQUEST["kid"]), '?')); $sql.=")) as t2 ON t1.id=t2.fid "; $data=array_merge($data,$_REQUEST["kid"]); $flag=false; } //WHERE句作成 $sql.= "WHERE 1 "; //名古屋の地域checkbox $sql = "SELECT t1.* FROM bukken as t1 "; if(isset($_REQUEST["chiiki_id"]) and is_array($_REQUEST["chiiki_id"])){ $sql.="INNER JOIN (SELECT DISTINCT chiid FROM chiiki WHERE chiiki_id in ("; $sql.=implode(",",array_fill(0,count($_REQUEST["chiiki_id"]), '?')); $sql.=")) as t2 ON t1.id=t2.chiid "; $data=array_merge($data,$_REQUEST["chiiki_id"]); $flag=false; } //WHERE句作成 $sql.= "WHERE 1 "; //価格絞り込み if(isset($_REQUEST["price_min"]) and $_REQUEST["price_min"]!==""){ $price_min=str_replace(",","",$_REQUEST["price_min"]); }else{ $price_min=0; } if(isset($_REQUEST["price_max"]) and $_REQUEST["price_max"]!==""){ $price_max=str_replace(",","",$_REQUEST["price_max"]); }else{ $price_max=100000000; } if(isset($_REQUEST["price_min"]) or isset($_REQUEST["price_max"])){ $sql.="AND price_min BETWEEN ? AND ? "; array_push($data,$price_min,$price_max); $flag=false; } //実行 $pdo = new PDO($dsn,$username,$password); $stmt = $pdo->prepare($sql); $stmt->execute($data); $rows=array( 以下省略 使っている3つのテーブルです。 bukken id、 bukken_name、 address 、price_min、 price_max、 station 1 名駅MID 愛知県名古屋市中村区 40770000、 55100000 名古屋駅 2 プレサン浄心 愛知県名古屋市西区 30800000、 40001000 浄心駅 3 アネシア八事 愛知県名古屋市昭和区50000000、 62510000 八事日赤 4 アメニ港明 愛知県名古屋市港区 25000000、 35000000 港区役所駅 5 ユーハウ上飯田 愛知県名古屋市北区 32000000、 43330000 上飯田駅 6 ローレル葵 愛知県名古屋市東区 30000000、 46000000 高岳駅 7 ライオンズ上小田井 愛知県名古屋市西区 35000000、 55000000 上小田井駅 8 ポレスターセントラル名西 愛知県名古屋市西区 28000000、 38000000 浄心駅 chiikiテーブル chiid chiiki_id 1 1 2 2 3 3 4 4 5 15 6 6 7 2 fudou_kodawariテーブル fid kid 1 1 1 2 1 3

  • SQL文の書き方をご教授お願い致します。

    <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' ); } ?>/> キャンペーン <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' ); } ?>/> 特別室<br /> <input type="checkbox" name="kid[]" value="5" <?php if( $_REQUEST["kid"] == "5" ){ print( 'checked' ); } ?>/> 和室 <input type="checkbox" name="kid[]" value="6" <?php if( $_REQUEST["kid"] == "6" ){ print( 'checked' ); } ?>/> 喫煙室</td> </tr> <tr> //まずこのSQL文でt_hotelsのテーブルとt_hotel_kodawariを結合します $sql="SELECT t_hotels.id,t_hotels.hotel_name,t_hotels.price,t_hotels.address,t_hotel_kodawari.id,t_hotel_kodawari.kid FROM t_hotels JOIN t_hotel_kodawari USING(id) WHERE 1 "; テーブル t_hotel_kodawari id kid ------------ 1 1 1 2 1 4 2 1 2 5 3 2 4 3 4 6 5 2 5 3 6 1 7 2 テーブルt_hotels id hotel_name price address ----------------------------------------------------- 1 Aホテル 10000 栃木県・・・ 2 Bホテル 12000 栃木県・・・ 3 Cホテル 9000 千葉県・・・ 4 Dホテル 10000 千葉県・・・ 5 Eホテル 15000 愛知県・・・ 6 Fホテル 30000 東京都・・・ 7 Gホテル 40000 神奈川県・・・ テーブルt_hotels とt_hotel_kodawariをJOIN USINで結合して表示 id hotel_name price address id kid ------------------------------------------------------------------- 1 Aホテル 10000 栃木県・・・ 1 1 1 Aホテル 10000 栃木県・・・ 1 2 1 Aホテル 10000 栃木県・・・ 1 4 2 Bホテル 12000 栃木県・・・ 2 1 2 Bホテル 12000 栃木県・・・ 2 5 3 Cホテル 9000 千葉県・・・ 3 2 4 Dホテル 10000 千葉県・・・ 4 3 4 Dホテル 10000 千葉県・・・ 4 6 5 Eホテル 15000 愛知県・・・ 5 2 5 Eホテル 15000 愛知県・・・ 5 3 6 Fホテル 30000 東京都・・・ 6 1 7 Gホテル 40000 神奈川県 7 2 $condition = array(); //仮にkid1が一つ選択されたら まず if( !empty( $_POST["kid"] )){ for($i=0; $i<count($_REQUEST["kid"]); $i++) { $tmpKey = "kid".$i; $sql .= " and kid = :".$tmpKey; $condition[$tmpKey] = $_REQUEST["kid"][$i]; var_dump($sql); } } で絞り込まれSQL文が作られ、 var_dump($sql);でSQL文を表示させると string(184) "SELECT t_hotels.id,t_hotels.hotel_name,t_hotels.price,t_hotels.address,t_hotel_kodawari.id,t_hotel_kodawari.kid FROM t_hotels JOIN t_hotel_kodawari USING(id) WHERE 1 and kid = :kid0" の結果によって、 kid1を選択するとホテルA,B,Fが表示されます。 でkidがまずandで絞り込まれます。 ですが、もう二つ目選択すると string(184) "SELECT t_hotels.id,t_hotels.hotel_name,t_hotels.price,t_hotels.address,t_hotel_kodawari.id,t_hotel_kodawari.kid FROM t_hotels JOIN t_hotel_kodawari USING(id) WHERE 1 and kid = :kid0" string(200) "SELECT t_hotels.id,t_hotels.hotel_name,t_hotels.price,t_hotels.address,t_hotel_kodawari.id,t_hotel_kodawari.kid FROM t_hotels JOIN t_hotel_kodawari USING(id)「 WHERE 1 and kid = :kid0 and kid = :kid1"」 で ------------------------------------------- 二重にand で絞られてしまい何も出てきません。希望としては二回目の選択からkidはor条件にすれば仮にkid1,kid2ホテルA,B,C,E,F,Gと両方を含む表示を実現したいのですが、 実際はSQLの表記の方法をネットや本で調べたのですが、分からない状態です。ご教授いただけたらと思います。 なお、私の希望通りの方法ではなくても実現できれば大丈夫です。 どうかよろしくお願い致します。

    • ベストアンサー
    • MySQL
  • 大量のcheckboxにcheckedを入れる

    チェックボックスが50個あります。 送信ボタンを押して元のページを再度開きます。 そのときにチェックしたボックスにチェックを入れた状態にしたいです。 inputタグの中に<?php if(isset($checkbox2) && in_array('b2',$checkbox2)){echo ' checked';} ?>を入れていますが単調になってしまいます。 単調にならずにする方法はありますか? <input type="checkbox" name="chk1[]" value="a1" />の場合はインデックスが固定でないのでできませんでした。 その他いけない箇所があれば教えて下さい。 お願いします。 <?php if(isset($_GET["chk1"])){ $checkbox1 = $_GET["chk1"]; for($i=0; $i<sizeof($checkbox1); $i++){ print $checkbox1[$i]."<br />"; } } if(isset($_GET["chk2"])){ $checkbox2 = $_GET["chk2"]; foreach($checkbox2 as $key => $val){ print $val."<br />"; } } ?> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> </head> <body> <form method="get" action="checkbox.php"> <input type="checkbox" name="chk1[]" value="a1" /> <input type="checkbox" name="chk1[]" value="a2" /> <input type="checkbox" name="chk1[]" value="a3" /> <input type="checkbox" name="chk1[]" value="a4" /> <input type="checkbox" name="chk1[]" value="a5" /> <input type="checkbox" name="chk1[]" value="a6" /> <input type="checkbox" name="chk1[]" value="a7" /> <input type="checkbox" name="chk1[]" value="a8" /> <input type="checkbox" name="chk1[]" value="a9" /> <input type="checkbox" name="chk1[]" value="a10" /> <br /> <input type="checkbox" name="chk2['b1']" value="b1" <?php if(isset($checkbox2) && in_array('b1',$checkbox2)){echo ' checked';} ?>/> <input type="checkbox" name="chk2['b2']" value="b2" <?php if(isset($checkbox2) && in_array('b2',$checkbox2)){echo ' checked';} ?>/> <input type="checkbox" name="chk2['b3']" value="b3" <?php if(isset($checkbox2) && in_array('b3',$checkbox2)){echo ' checked';} ?>/> <input type="checkbox" name="chk2['b4']" value="b4" <?php if(isset($checkbox2) && in_array('b4',$checkbox2)){echo ' checked';} ?>/> <input type="checkbox" name="chk2['b5']" value="b5" <?php if(isset($checkbox2) && in_array('b5',$checkbox2)){echo ' checked';} ?>/> <input type="checkbox" name="chk2['b6']" value="b6" <?php if(isset($checkbox2) && in_array('b6',$checkbox2)){echo ' checked';} ?>/> <input type="checkbox" name="chk2['b7']" value="b7" <?php if(isset($checkbox2) && in_array('b7',$checkbox2)){echo ' checked';} ?>/> <input type="checkbox" name="chk2['b8']" value="b8" <?php if(isset($checkbox2) && in_array('b8',$checkbox2)){echo ' checked';} ?>/> <input type="checkbox" name="chk2['b9']" value="b9" <?php if(isset($checkbox2) && in_array('b9',$checkbox2)){echo ' checked';} ?>/> <input type="checkbox" name="chk2['b10']" value="b10" <?php if(isset($checkbox2) && in_array('b10',$checkbox2)){echo ' checked';} ?>/> <br /> <input type="submit" value="送信" /> </form> </body> </html>

    • 締切済み
    • PHP
  • PHPにフォームについて質問です。

    つい最近ここで教えていただいたフォームのプログラムなのですが、どのように組み合わせるのかわからない状態でうまく反映できません。自分で出来ると思ったのですが出来ませんでした。 前回途中で質問終わらせてしまったことは後悔していますが今回もどうかご教授いただきたいです。 下記のように入力しましたが検索したあとに名前はフォームに表示されている状態なのですが、チェックボックスのチェックは検索した後に消えてしまいます。 チェックを検索したあとにも残るようにするにはどのように入力すれば良いでしょうか? どうかよろしくお願い致します。 <?php $value=array(); //想定するデータを初期化しておく $value['name']=""; if(isset($_REQUEST['name'])){ $value['name']=htmlspecialchars($_REQUEST['name'],ENT_QUOTES,'UTF-8'); } $checked=array(); //想定するデータを初期化しておく $checked['team_id']=array(1=>"",2=>"",3=>"",4=>"",5=>""); if(isset($_REQUEST['team_id']) and is_array($_REQUEST['team_id'])){ foreach($_REQUEST['team_id'] as $val){ $checked['team_id'][$val]=" checked"; } } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>リーグデータ</title> <link rel="stylesheet" type="text/css" href="../common/style.css"/> </head> <body id="list"> <div id="main"> <form name="search_form" action="xxxxxxxx.php" method="post"> <input type="hidden" name="cmd" value="search" /> <table> <tr> <th class="th_top">選手名</th> <td class="td_top"> <input type="text" name="name" size="30" value="<?php echo "{$value['name']}" ?>"> </td> </tr> <tr> <th>チーム名</th> <td> <input type="checkbox" name="team_id[]" value="1"{$checked['team_id'][1]}/>名古屋 <input type="checkbox" name="team_id[]" value="2"{$checked['team_id'][2]}/>徳島 <input type="checkbox" name="team_id[]" value="3"{$checked['team_id'][3]}/>千葉 <input type="checkbox" name="team_id[]" value="4"{$checked['team_id'][4]}/>浦和 <input type="checkbox" name="team_id[]" value="5"{$checked['team_id'][5]}/>磐田 <br /> </td> </tr> <tr> <th class="th_middle"> ポジション </th>

    • ベストアンサー
    • PHP
  • MySQLについての質問です

    毎回お世話になっています。 今回も知恵を頂けたらありがたいです。よろしくお願い致します。 下記のようなプログラムを組んだところ、ページを開いたらすぐ全データがが出てくる状態になっています。ページを開いても何もデータが出てこない状態にして検索してからデータが出てくるようにするにはどのように書き換えれば良いのでしょうか? <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>リーグデータ</title> <link rel="stylesheet" type="text/css" href="../common/style.css"/> </head> <?php error_reporting( E_ALL ^ E_NOTICE ); ?> <body id="list"> <div id="main"> <form name="search_form" action="player_list.php" method="post"> <input type="hidden" name="cmd" value="search" /> <table> <tr> <th class="th_top">選手名</th> <td class="td_top"> <input type="text" name="name" size="30" value="<?php echo $_POST['name'] ?>"> </td> </tr> <tr> <th>チーム名</th> <td> <input type="checkbox" name="team_id[]" value="1" <?php if (isset($_REQUEST['team_id']) and in_array('1',$_REQUEST['team_id'])) print 'checked'; ?>/> 名古屋 <input type="checkbox" name="team_id[]" value="2" <?php if (isset($_REQUEST['team_id']) and in_array('2',$_REQUEST['team_id'])) print 'checked'; ?>/> 徳島 <input type="checkbox" name="team_id[]" value="3" <?php if (isset($_REQUEST['team_id']) and in_array('3',$_REQUEST['team_id'])) print 'checked'; ?>/> 千葉 <input type="checkbox" name="team_id[]" value="4" <?php if (isset($_REQUEST['team_id']) and in_array('4',$_REQUEST['team_id'])) print 'checked'; ?>/> 浦和 <input type="checkbox" name="team_id[]" value="5" <?php if (isset($_REQUEST['team_id']) and in_array('5',$_REQUEST['team_id'])) print 'checked'; ?>/> 磐田<br /> </td> </tr> <tr> <th class="th_middle"> ポジション </th> <td class="td_middle"> FW MF DF GK </td> </tr> </table> <p> <input type="submit" value="検索"> <input type="reset" value="リセット"> </p> </form> <?php try { $dsn = 'mysql:dbname=xxxxx;host=localhost'; $user = 'xxxxx'; $password = 'xxxxxx'; $dbh = new PDO($dsn,$user,$password); $dbh->query('SET NAMES utf8'); $sql = 'SELECT code,name,team_name,price,position,gazou FROM mst_player_market WHERE 1'; $stmt = $dbh->prepare($sql); $stmt->execute(); $dbh = null; if(isset($_POST['name'])) { $name = htmlspecialchars($_POST['name']); print($name); } if(isset($_POST['name'])) { if(!$_POST['name']==true){print ''; }else{ $sqlN ='code IN (SELECT code FROM mst_player_market where name LIKE ("%'.$_POST['name'].'%"))'; $sql.=' and ('.$sqlN.')'; } } if(isset($_POST['team_id'])and is_array($_POST['team_id'])){ $ary = array_filter($_POST['team_id'], function($v) {return is_numeric($v);}); $sqlA = 'code IN (SELECT playerid FROM team WHERE team_id IN ('.implode(',', $ary).'))'; }else{ print ''; $sqlA = ' 1 '; $flag=false; } $sql.=' and ('.$sqlA.')'; if($flag) $sql.="AND 0 ";; //参考 print $sql."<br>"; //実行 $pdo = new PDO($dsn,$user,$password); $stmt = $pdo->prepare($sql); $stmt->execute(); //画像処理 $rows=array(); while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ $rows[]=$row; }; //参考SQL文表示 print_r($rows); print'選手一覧<br /><br />'; print'</form>'; } catch(Exception $e) { print'ただいま障害により大変ご迷惑をお掛けしております。'; exit(); } ?> <?php foreach((array) $rows as $row ){ ?> <tr> <td><img src="../player/<?php print( htmlspecialchars( $row["gazou"], ENT_QUOTES )); ?>" /></td> <td><?php print( htmlspecialchars( $row["team_name"], ENT_QUOTES )); ?></td> <td>\<?php print( htmlspecialchars( number_format( $row["price"] ),ENT_QUOTES ) ); ?></td> <td> <?php print( htmlspecialchars( $row["name"], ENT_QUOTES ) ); ?> </td> <td> <?php print( htmlspecialchars( $row["position"], ENT_QUOTES ) ); ?> </td> </tr> <?php } ?> </table> </div> <!------------mainのdiv--------------> </body> </html>

    • ベストアンサー
    • MySQL
  • 検索時の選択内容を保持する方法 2

    昨日こちらのURL『http://okwave.jp/qa/q6477112.html』にて質問させていただきました。 ご回答を締め切らせていただいたため、誠に勝手ながら新たに質問の方させていただきました。 PHP検索フォーム、検索時の選択内容を保持する方法にて、先日ご回答いただいた 下記のコードを基本として利用しているのですが、 <? //checkbox if($_REQUEST["test_a"]=="1") $checked["test_a"]=" checked"; if($_REQUEST["test_b"]=="1") $checked["test_b"]=" checked"; //radio if(isset($_REQUEST["test_c"])) $checked["test_c"][$_REQUEST["test_c"]]=" checked"; //select if(isset($_REQUEST["test_d"])) $selected["test_d"][$_REQUEST["test_d"]]=" selected"; print <<<eof <form> <input type="checkbox" name="test_a" value="1"{$checked["test_a"]}>A <input type="checkbox" name="test_b" value="1"{$checked["test_b"]}>B <input type="radio" name="test_c" value="1"{$checked["test_c"][1]}>C-1 <input type="radio" name="test_c" value="2"{$checked["test_c"][2]}>C-2 <input type="radio" name="test_c" value="3"{$checked["test_c"][3]}>C-3 <select name="test_d"> <option value="">---</option> <option value="1"{$selected["test_d"][1]}>D-1</option> <option value="2"{$selected["test_d"][2]}>D-2</option> <option value="3"{$selected["test_d"][3]}>D-3</option> </select> <input type="submit" value="go"> </form> eof; ?> 複数選択のチェックボックスがある場合の方法をご存じの方いらっしゃいましたら、 是非ともご教授お願い致します。 複数チェックボックスは、 <input type="checkbox" name="bungu[0]" value="鉛筆" >鉛筆 <input type="checkbox" name="bungu[1]" value="定規" >定規 <input type="checkbox" name="bungu[2]" value="色鉛筆" >色鉛筆 <input type="checkbox" name="bungu[3]" value="ペン" >ペン <input type="checkbox" name="bungu[4]" value="絵具" >絵具 <input type="checkbox" name="bungu[5]" value="ハサミ" >ハサミ <input type="checkbox" name="bungu[6]" value="ボールペン" >ボールペン というようなものを利用しています。

    • ベストアンサー
    • PHP
  • SQLのIN演算子について悩んでいます。

    SQLのIN演算子について悩んでいます。 -------------------------------------------------------------------- <form method="get" action="index.php"> <input type="checkbox" name="check_addr[]" value="東京都"/>東京都<br /> <input type="checkbox" name="check_addr[]" value="千葉県"/>千葉県<br /> <input type="checkbox" name="check_addr[]" value="神奈川"/>神奈川<br /> <input type="submit" value="選択する" /> </form> --------------------------------------------------------------------- のフォームから下記のPHPで -------------------------------------------------------------------- $sql = "SELECT * FROM testvote WHERE mark = '0'"; if(isset($_GET["check_addr"])){ $array = implode(",", $_GET["check_addr"]); $sql = "SELECT * FROM testvote WHERE addr IN(" .$array. ")"; } ----------------------------------------------------------------------- チェックを入れた都道府県だけをMYSQLから取り出して表示させたいのですが、 どうにもうまく動きません。 色々と試しているのですが、IN演算子の中が数字などの場合はうまく動いています。 日本語でIN演算子を使用する場合はどうしたらいいのでしょうか? ちなみに addrの中には都道府県(埼玉県・東京都・・・)のデータが入っています。

    • ベストアンサー
    • PHP
  • 送信後のチェックボックスの表示

    最初の画面でAにチェックされているとします。 そのあとに、AとBをチェックしたあとにSubmitで送信します。 送信したあとに、AとBにチェックした最初の画面を表示させたいときは、 どんな風にすればよいのでしょうか。 今は・・・ If Request.Form="" <input type="checkbox" name="test" value="A" checked>A <input type="checkbox" name="test" value="B">B <input type="checkbox" name="test" value="C">C Else Select Request.Form("test") Case "A" <input type="checkbox" name="test" value="A" checked>A <input type="checkbox" name="test" value="B">B <input type="checkbox" name="test" value="C">C Case "B" <input type="checkbox" name="test" value="A">A <input type="checkbox" name="test" value="B" checked>B <input type="checkbox" name="test" value="C">C Case "C" <input type="checkbox" name="test" value="A">A <input type="checkbox" name="test" value="B">B <input type="checkbox" name="test" value="C" checked>C   ・・・ End Select End If というように、全ての場合のときに"checke"をつけて表示させています。 もっと、効率のよい書き方はないものでしょうか?

  • formから送信する値について

    nameを同じくする複数のチェックボックスのチェック項目について valueを「+」や「,」でつなげて送信したいです 例えば <input type="checkbox" name="color" value="red" checked > <input type="checkbox" name="color" value="blue" checked> <input type="checkbox" name="color" value="green" checked > <input type="checkbox" name="option" value="A" checked > <input type="checkbox" name="option" value="B" checked > <input type="checkbox" name="option" value="C" checked > ならば、submitされるURL変数は ?color=red,blue,green&option=A+B+C になるようにしたいのです よろしくお願いします

    • ベストアンサー
    • HTML
  • []を付けずにcheckboxの値を複数受信

    カテゴリをPHPとするか迷いましたが、 こちらに質問させていただきます。 <input type="checkbox" name="hiragana[]" value="a">あ <input type="checkbox" name="hiragana[]" value="i">い <input type="checkbox" name="hiragana[]" value="u">う とした場合、 $checked=$_POST['hiragana']; print_r($checked); などとして使えることはわかるのですが、 角括弧をつけず、 <input type="checkbox" name="hiragana" value="a">あ <input type="checkbox" name="hiragana" value="i">い <input type="checkbox" name="hiragana" value="u">う としたときに、同様に配列として取得する(すべてのチェックされた項目を取得する) 方法はあるのでしょうか? このようにした場合、 $checked=$_POST['hiragana']; print_r($checked); や print_r($_POST); すると、最後にチェックされた値しか入っていないようです。 (上書きされているようですが...) HTTPヘッダを見ると、 hiragana=a&hiragana=i&hiragana=u のように、すべて送信はされているのは確認できるのですが... 後者のような角括弧をつけていないタイプのcheckboxを使って ちゃんとチェックされた値をすべて受信して動作していると 思われるサイトを目にするので どうすればできるのかと思い質問させて頂きました。 よろしくお願いいたします。

    • ベストアンサー
    • HTML

専門家に質問してみよう