• 締切済み

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

  • MySQL
  • 回答数9
  • ありがとう数13

みんなの回答

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

>ところでこのSQL文をtest.phpに組み込むのでしょうか? > >そしてどのように組み込んだらよいのでしょうか? プログラムとデザインを分けるようにお伝えしましたが SQLとプログラムも分けて考えてください。 まずはSQL文が動作することを確認する必要があります。 PHPとMySQLを利用しているということはphpMyAdminは運用していますよね? もししていないようでしたらマストなツールなのでインストールをお勧めします。 なお最終的にはtest.phpで提案したphp相当のものに組み込んで PDOで処理することになると思います。 実際のところ#7,8の内容には絞り込みのデータが書いていないので、 (「where 1」というのは全データを表示するという意味、これにANDで絞り込みの SQL文をつないでいきます) ユーザーから送られてきたデータをもとにどう絞り込みをしたいか仕様を固めてください

sinto58167
質問者

お礼

いつもアドバイスいただき本当にありがとうございます。 今回もよろしくお願い致します。 >まずはSQL文が動作することを確認する必要があります。 >PHPとMySQLを利用しているということはphpMyAdminは運用していますよね? >もししていないようでしたらマストなツールなのでインストールをお勧めします。 phpMyAdminはxampp内にあるのでいつもそれを使用しております。 yamabe.jp様にいただいたSQL文を動かしたところ物件単位の検索、物件詳細の検索 共に正常に表示されました。 >ユーザーから送られてきたデータをもとにどう絞り込みをしたいか仕様を固めてください 特にユーザーからの依頼と言うわけではなく、趣味でやっているので縛りは全く無いです。 プログラム組んでいくうちに相談している皆さんのスキルが高いのでWEBアプリがどんどん 大げさなものになっていきました。 でも懲りだしたらもっと切りがなかもしれないですが。 私としましては勉強になるのでありがたいです。 まず物件単位の検索、物件詳細の検索 そのあとandで絞込み検索を繋げていく 価格帯を下限~上限を設定してまず検索 andでまず地域を絞り込み地域自体はor条件 そしてさらにandでこだわり条件で絞込み こだわり条件自体はand条件とor条件を選べるようにする仕様で こだわり条件に~駅から何分という条件も入れて いきたいと思っています。 また時間のある時に返答よろしくお願いいたします。

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

#7つづき //物件の詳細単位で集計 select t2.shosai_id,shubetu_name,bukken_name,shosai_name,chiiki_name,address,price,madori,moyorieki,kodawari from t_bukken as t1 left join t_shosai as t2 on t1.bukken_id=t2.bukken_id inner join t_shubetu as t3 on t1.shubetu_id=t3.shubetu_id inner join t_chiiki as t4 on t1.chiiki_id=t4.chiiki_id left join (select t5.bukken_id,group_concat(eki_name,jikan,'分') as moyorieki from t_bukken_eki as t5 inner join t_eki as t6 on t5.eki_id=t6.eki_id group by bukken_id ) as t7 on t1.bukken_id=t7.bukken_id left join ( select t8.shosai_id,group_concat(kodawari_name) as kodawari from t_shosai_kodawari as t8 inner join t_kodawari as t9 on t8.kodawari_id=t9.kodawari_id group by shosai_id ) as t10 on t2.shosai_id=t10.shosai_id where 1 ※where句に条件をつないでいく //物件単位で集計 select t1.bukken_id,bukken_name,shubetu_name,shosai_count,min_price,max_price,chiiki_name,address,moyorieki,kodawari from t_bukken as t1 inner join ( select bukken_id,count(*) as shosai_count,min(price) as min_price,max(price) as max_price,kodawari from t_shosai as t2 left join ( select t3.shosai_id,group_concat(kodawari_name) as kodawari from t_shosai_kodawari as t3 inner join t_kodawari as t4 on t3.kodawari_id=t4.kodawari_id group by shosai_id ) as t5 on t2.shosai_id=t5.shosai_id group by bukken_id ) as t6 on t1.bukken_id=t6.bukken_id inner join t_shubetu as t7 on t1.shubetu_id=t7.shubetu_id inner join t_chiiki as t8 on t1.chiiki_id=t8.chiiki_id left join (select t9.bukken_id,group_concat(eki_name,jikan,'分') as moyorieki from t_bukken_eki as t9 inner join t_eki as t10 on t9.eki_id=t10.eki_id group by bukken_id ) as t11 on t1.bukken_id=t11.bukken_id where 1

sinto58167
質問者

お礼

テーブル詳細とSQL文ありがとうございます。 こんな長いSQL文あるんですね! しばらくテーブルを元に考えてみたいと思います。

sinto58167
質問者

補足

いつもお世話になっております。 送っていただいたSQL文なのですが、自分なりに本やサイトなど、構文見ながら確認したのですが、なかなか完璧に理解することが難しいです。 このあたりはいろいろ作っていって慣れるしかないのかなと思います。 ところでこのSQL文をtest.phpに組み込むのでしょうか? そしてどのように組み込んだらよいのでしょうか? またお時間ございましたらご教授いただけるとありがたく思います。

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

かなりぐちゃぐちゃですが、ひとまずこれで //物件テーブル create table t_bukken(bukken_id int not null primary key,bukken_name varchar(100),shubetu_id int,address varchar(200),chiiki_id int); insert into t_bukken values (1,'マンションA',1,'○○区あああ町1-1-1',1) ,(2,'マンションB',1,'○○区あああ町2-2-2',1) ,(3,'マンションC',1,'○○区いいい町3-3-3',1) ,(4,'アパートD',2,'○○区ううう町4-4',1) ,(5,'マンションE',1,'××区かかか町1-2-3',2) ,(6,'アパートF',2,'××区ききき町4-5-6',2) ,(7,'戸建G',3,'△△市さささ町10-10',4) ,(8,'戸建H',3,'△△市ししし町20-1',4) ,(9,'戸建I',3,'□□郡すすす町字せせせ100',6); //詳細テーブル create table t_shosai(shosai_id int not null primary key,shosai_name varchar(100),bukken_id int not null,price int,madori varchar(100)); insert into t_shosai values (1,'101号室',1,200000,'4LDK') ,(2,'202号室',1,100000,'2DK') ,(3,'303号室',1,150000,'2LDK') ,(4,'102号室',2,100000,'2LDK') ,(5,'103号室',3,100000,'2DK') ,(6,'104号室',4,60000,'1K') ,(7,'105号室',5,100000,'2DK') ,(8,'1001号室',6,80000,'2K') ,(9,'',7,200000,'3LDK') ,(10,'',8,30000,'4LDK') ,(11,'',9,400000,'5LDK'); ※物件=集合住宅案件は1件とし、部屋ごとのカウントは詳細とします //種別テーブル create table t_shubetu(shubetu_id int not null primary key,shubetu_name varchar(100)); insert into t_shubetu values (1,'マンション') ,(2,'アパート') ,(3,'戸建') ,(99,'その他'); //地域テーブル create table t_chiiki(chiiki_id int not null primary key,chiiki_name varchar(50)); insert into t_chiiki values (1,'○○区') ,(2,'××区') ,(3,'●●区') ,(4,'△△市') ,(5,'▲▲市') ,(6,'□□郡'); //駅テーブル create table t_eki(eki_id int not null primary key,eki_name varchar(50)); insert into t_eki values (1,'新宿') ,(2,'代々木') ,(3,'原宿') ,(4,'渋谷'); ※沿線と絡めたりするともう少し工夫が必要 //物件-駅テーブル create table t_bukken_eki(bukken_id int not null,eki_id int not null,jikan int,unique(bukken_id,eki_id)); insert into t_bukken_eki values (1,1,3) ,(1,2,5) ,(2,2,5) ,(2,3,1) ,(3,4,10) ,(4,4,20) ,(5,1,10) ,(6,1,10); ※物件と駅の組み合わせ、到達時間もいれておく //こだわりテーブル create table t_kodawari(kodawari_id int not null primary key,kodawari_name varchar(50)); insert into t_kodawari values (1,'ペット可') ,(2,'駐車場あり') ,(3,'南向き') ,(4,'新築') ,(5,'セキュリティ'); //詳細-こだわりテーブル create table t_shosai_kodawari(shosai_id int not null,kodawari_id int not null,unique(shosai_id,kodawari_id)); insert into t_shosai_kodawari values (1,1) ,(1,2) ,(1,3) ,(2,1) ,(2,2) ,(3,1) ,(4,1) ,(5,1) ,(6,3) ,(7,1) ,(7,2) ,(7,3) ,(7,4) ,(7,5) ,(9,1) ,(9,4) ,(10,1) ,(11,1); ※物件の詳細とこだわりの組み合わせ つづく

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

ちょっと時間かかりそうなので、ひまなときやってみます もう少しこの質問は閉じずにおいといてください

sinto58167
質問者

お礼

了解です。 閉じずにお待ちしております。 お手数ですがよろしくお願い致します。

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

http://localhost/suumo/mansion2/test.inc.htmのURLを開いてから >仮に地域の中村区とこだわり条件の新築をしてから検索ボタンを押すと > >http://localhost/suumo/mansion2/test.inc.htm?pri … > >に変わりますのでプログラムの動作は正常に動いていると思います。 まぁわかりやすく例示していただいているのだと思いますが localhostでのアクセス情報はこちらで確認できないのであしからず ちなみにtest.inc.htmでチェックボックスが引き継がれるのは変ですね 私のサンプルはあくまでtest.phpがtest.inc.htmを参照する仕組みです。 >テーブルについてですが、addressは番地まで入れたいのですが余分に >テーブルを作らずにbukkenテーブルの中にaddress >と並行してchiiki_idを入れれば良いのでしょうか? addressは変更される頻度が低く(区画整理や市町村統合などなければ)、 履歴も必要なさそうなので、とりあえずそのままaddressに番地まで つっこんでしまえばいいと思います ただ、文字列で登録されたaddressは検索性が低いので、市区町村単位で 正規化したchiiki_idを並行して設定した方がいいということです。 >1ページ内で地域から駅など全て表示させるのはユーザー目線で見たらちょっとどうなんだろう?と >思ってしまいます。 駅名の一部もしくは全部からあいまい検索するのがベターだと思いますが、 ○○駅ちかくの××条件の物件、など絞り込みに利用することを考えると 1ページないで処理する方がいいですね ただし、駅名一覧を冗長表示するよりは最大3つまで駅が指定できるような 仕組みの方がいいかもしれません ほんとは沿線を指定したり駅名のあいまい検索をしたりajaxで処理するとベターです >station_bukkenはどう紐付けするのでしょう? 複数駅が指定できるようにするなら別テーブルで処理するのがベター ただ駅の指定を3つまで・・・のように仕様を固めてしまうなら物件テーブル内に station_idと到達時間を3つ分用意すればいいでしょう。 ただし、名古屋の鉄道状況がよくわからないので、駅の密集状況などによっては 指定した駅で絞り込みができないリスクもあります。 (別テーブルで処理する限りいくつでも紐づけられます) 結構複雑な条件になってきているので、一気に実装しようとせずに、順番に機能を 追加して、稼働が確認されてから次に進む方が効率的かもしれません。 (チェックボックスやセレクトボックスの処理は前回書いた回答で 解決しているようですから、あとはSQL文の書き方を拡張していく感じですかね)

sinto58167
質問者

補足

いつもお世話になります。アドバイス何卒よろしくお願いいたします。 >ちなみにtest.inc.htmでチェックボックスが引き継がれるのは変ですね このことが良くわからないです。 今のところこの問題は保留でいいでしょうか。 原因がわからないです。 確かにlocal環境は確認しようがないですね。失礼致しました。 >ただ、文字列で登録されたaddressは検索性が低いので、市区町村単位で >正規化したchiiki_idを並行して設定した方がいいということです。 ではbukkenテーブル内にaddressとchiiki_idを作って分けていこうと思いますが、 わからないところがあります。 chiiki_idはチェックボックスになっているので数字を入れないといけないですよね? 市町村単位で入れるのは別カラムを作って入れるのでしょうか? 例えばbukkenテーブルの中にchiiki_id,address,の後にcityカラムの中に~区以降の住所とか。 間違っていたらすみません。 id ,bukken_name ,chiiki_id ,address, city, price_min ,price_max 1 ,名駅MID, 1, 愛知県名古屋市, 中村区則武本通x丁目xx番 ,40770000 55100000 2 ,プレサン浄心, 2, 愛知県名古屋市, 西区城西x丁目xxxx番x ,308000000 40001000 3 ,アネシア八事, 3, 愛知県名古屋市, 昭和区高峯町xxx番 ,50000000 62510000 上記の構造で大丈夫でしょうか? 間違っておりましたらお手数ですがテーブル構造がどんな感じか教えていただけるとありがたいです。 >○○駅ちかくの××条件の物件、など絞り込みに利用することを考えると >1ページないで処理する方がいいですね 言われてみれば1ページ内のほうが確かにわかりやすそうです。 >指定した駅で絞り込みができないリスクもあります。 >(別テーブルで処理する限りいくつでも紐づけられます) では別テーブルで作っていきます。 >stationテーブル、station_bukkenテーブルの二つが必要です。 >station_bukkenテーブルでは、 >物件ID、駅ID、時間 >を登録できるようにするといいでしょう。 この通りに作っていこうと思います。 stationテーブルは構造は 駅ID、駅名 で良いのでしょうか? テーブルがこのように複雑な場合、SQL文が出にくい私にとってはハードルが高いですが、 何とか完成させたいと思っております。何卒よろしくお願いいたします。

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

話を戻してデータの持ち方について bukkenテーブルについて >id、 bukken_name、 address 、price_min、 price_max、 station となっていますが、 addressが、市区町村までしか登録しないのであれば、 chiikiテーブルにまとめて、chiiki_idだけ埋め込む方がすっきりします。 またaddressを番地まできっちり入れる場合はaddressに並行してchiiki_idを 埋め込んで検索性を高めます。 またstationについてはchiikiと同じようにstationテーブルを用意しておくとよいでしょう。 ただし、stationは1つしか選べないような仕組みはよくありません。 A駅から3分、B駅から5分、C駅から10分・・・的な複数選択できた方が たとえばA駅に紐づいた物件を探したり、B駅から10分以内の物件を探したり できるの有利です。 なので、複数選択可能な条件なので stationテーブル、station_bukkenテーブルの二つが必要です。 station_bukkenテーブルでは、 物件ID、駅ID、時間 を登録できるようにするといいでしょう。 ちょどstationの管理はこだわりと同じ仕組みになりますね ちなみにこだわりは、and検索とor検索のどちらもできるようにすると ユーザービリティがあがります。 ・and検索:「犬が飼える」かつ「南向き」の部屋を探すケース (どんどん条件がきびしくなる)もあれば ・or検索:「犬が飼える」か「南向き」の部屋→犬が飼えれば向きはどうでもよく、 南向きなら犬はいいや・・・という割り切った考えの人もいるでしょう また下限価格、上限価格については私の認識が甘かったのですが 物件内に複数あるのですね? であれば建物と別に部屋を管理するテーブルが必要です 部屋ID 、物件ID、部屋番号(○○号室)、価格 のようなデータをもたないと、同じ建物内の複数物件が管理しづらいでしょう

sinto58167
質問者

補足

お世話になります。 いつもご指導いただきありがとうございます。 ファイルを3つに分けて動作確認致しました。 http://localhost/suumo/mansion2/test.inc.htmのURLを開いてから 仮に地域の中村区とこだわり条件の新築をしてから検索ボタンを押すと http://localhost/suumo/mansion2/test.inc.htm?price_min=1&price_max=999999999999&chiiki_id[]=1&kid[]=1 に変わりますのでプログラムの動作は正常に動いていると思います。 テーブルについてですが、addressは番地まで入れたいのですが余分にテーブルを作らずにbukkenテーブルの中にaddress と並行してchiiki_idを入れれば良いのでしょうか? stationの検索についてはあまり考えていなかったのですが、ユーザビリティーを考えるのであれば、 必要なものだろうと思います。 1ページ内で地域から駅など全て表示させるのはユーザー目線で見たらちょっとどうなんだろう?と 思ってしまいます。 この辺はどうすれば良いか迷っています。 駅は駅、地域は地域でページは分けたほうがいいかもしれません。 分けた場合はまずは地域から選択するページを作りたいと思います。 stationテーブルはkodawariと同じようにidと紐付ければ良いのですが、station_bukkenはどう紐付け するのでしょう? 例えば時間のテーブルを作って駅(どんな駅でも良い)から何分というのが単純に作れていい気が します。 この場合 station_time 物件ID、時間(選択肢 駅から?分) でいいかもしれません。 こだわり条件はor条件とand条件で分けるのは良いと思います。 こんな考え方あるんですね。出来ればやってみたいと思います。 下限価格、上限価格につきましては最初の参考書のプログラムがそのまま残っていただけなのです。 特に深くは考えてなかったのですが、確かに物件別にも部屋番号が違うものがあり、値段も変わる ので、テーブルは余分に必要ですね。 いろいろ書いてしまいましたが私には実現方法がわからないのでお時間ございましたらまたご教授 いただきたいと思っております。

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

>test.inc.htmとtest.phpとcommon.phpの3つのファイルに >分ければ良いのでしょうか? そういうことです。 htmはあくまでテンプレートです。 ダイレクトにtest.inc.htmを開いても、htmlのレイアウトが確認できるので htmlはそれだけで簡潔したファイルにしておくとよいです。 ファイル名についても特に深い意味はないですが、インクルードして使うファイル とわかるようにしておくとファイル管理が後々楽です >そして、test.phpとcommon.phpはファイルにそのままコピペで良いのでしょうか? 一応そのつもりで書いてあります。 >phpファイルの部分は高度すぎて理解できるかちょっとわからないです。 きちんとしたクラスの書き方はもうすこし修飾が必要なのですが、 とりあえず動くのを確認するという意味では、なんとなく理解できればよいでしょう new testでインスタンスを作成して、execで実行して結果を出力している感じ ロジックが見えやすいように関数はかなり無駄に展開してあります。 >デザインとプログラムを分けて効率化するにはここを理解しないことには進めないのでしょうか。 細かい関数を理解する必要はないと思いますよ、checkedやselectedをプログラムで 制御していることだけ理解し、ご自身で拡張できそうな問題ないでしょう。 >test.inc.htmはかなり部分的に省略してありますが それこそhtmlタグからはじまりhtmlタグで閉じるフルのhtmlを書いてもらえばよいです ※注記 今回のご提案は、プログラムの不備にひっぱられてMySQLの質問がブレがちな点が 気になったためのものです。 テンプレートとプログラムが分かれていれば、MySQLの質問にhtmlの記述をどうする こうすると悩む必要はなくなります。 とりあえず、3つのファイルに分ける処理をそのままコピペでいいので試してみてください おいおい拡張していけばいいでしょう

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

#1の続き //common.php <?PHP class common { function include_parse($filename,$replacement=null,$nonerem=null,$label=null) { if(empty($filename)) return false; $str=file_get_contents($filename); $str=$this->replace_parse($str,$replacement); return $str; } function replace_parse($str,$replacement=array()) { $pattern='/\{(\$.+?)\}/'; $str=preg_replace_callback( $pattern ,function ($matches) use ($replacement){ return self::replace_callback($matches,$replacement); } ,$str); return $str; } function replace_callback($matches,$replacement) { extract($replacement); $ret=""; $evalstr='$ret=isset('.$matches[1].')?'.$matches[1].':"";'; eval($evalstr); return $ret; } } ?> もちろん、もうすこし工夫してチェックボックスやセレクトボックス自体を DBからデータ取得して自動生成したりしてもよいかもしれません

sinto58167
質問者

補足

お世話になります。 お答えいただきありがとうございます。 test.inc.htmとtest.phpとcommon.phpの3つのファイルに 分ければ良いのでしょうか? そして、test.phpとcommon.phpはファイルにそのままコピペで良いのでしょうか? phpファイルの部分は高度すぎて理解できるかちょっとわからないです。ちょっと時間がかかるかもしれません。 デザインとプログラムを分けて効率化するにはここを理解しないことには進めないのでしょうか。 test.inc.htmはかなり部分的に省略してありますが大雑把にいくとこれで大丈夫でしょうか? <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>05-11</title> <link rel="stylesheet" type="text/css" href="../common/style.css"/> </head> <?php error_reporting( E_ALL ^ E_NOTICE ); ?> <body id="S03-10"> <div id="main"> <h1>マンション物件の条件検索</h1> <form> <p> 価格帯: <select name="price_min"> <option value="1"{$selected["price_min"][1]}>下限なし</option> <option value="10000000"{$selected["price_min"][10000000]}>1000万</option> <option value="15000000"{$selected["price_min"][15000000]}>1500万</option> </select> ~ <select name="price_max"> <option value="999999999999"{$selected["price_max"][999999999999]}>上限なし</option> <option value="10000000"{$selected["price_max"][10000000]}>1000万</option> </select> </p> <p> 地域: <input type="checkbox" name="chiiki_id[]" value="1"{$checked["chiiki_id"][1]}>中村区 <input type="checkbox" name="chiiki_id[]" value="2"{$checked["chiiki_id"][2]}>西区 <input type="checkbox" name="chiiki_id[]" value="3"{$checked["chiiki_id"][3]}>昭和区 <input type="checkbox" name="chiiki_id[]" value="4"{$checked["chiiki_id"][4]}>港区 <input type="checkbox" name="chiiki_id[]" value="5"{$checked["chiiki_id"][5]}>守山区 <input type="checkbox" name="chiiki_id[]" value="6"{$checked["chiiki_id"][6]}>東区 <input type="checkbox" name="chiiki_id[]" value="7"{$checked["chiiki_id"][7]}>中区 </p> <p> こだわり条件: <input type="checkbox" name="kid[]" value="1"{$checked["kid"][1]}>新築 <input type="checkbox" name="kid[]" value="2"{$checked["kid"][2]}>南向き <input type="checkbox" name="kid[]" value="3"{$checked["kid"][3]}>セキュリティ充実 <input type="submit" value="go"> </p> </form> </div> </body> </html>

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

DBの件はひとまず置いておいて、ひとつ提案 徐々にPHPが肥大化してきたので、プログラムとデザインを分けた方がいいですね また、プログラムもクラスを利用しましょう。 よく使う機能はまとめて再利用できるようにします。 チェックボックスの処理はこんな感じでやります (上限に引っかかるのでcommon.phpは#2に) //test.inc.htm <form> <p> 価格帯: <select name="price_min"> <option value="1"{$selected["price_min"][1]}>下限なし</option> <option value="10000000"{$selected["price_min"][10000000]}>1000万</option> <option value="15000000"{$selected["price_min"][15000000]}>1500万</option> </select> ~ <select name="price_max"> <option value="999999999999"{$selected["price_max"][999999999999]}>上限なし</option> <option value="10000000"{$selected["price_max"][10000000]}>1000万</option> </select> </p> <p> 地域: <input type="checkbox" name="chiiki_id[]" value="1"{$checked["chiiki_id"][1]}>中村区 <input type="checkbox" name="chiiki_id[]" value="2"{$checked["chiiki_id"][2]}>西区 <input type="checkbox" name="chiiki_id[]" value="3"{$checked["chiiki_id"][3]}>昭和区 <input type="checkbox" name="chiiki_id[]" value="4"{$checked["chiiki_id"][4]}>港区 <input type="checkbox" name="chiiki_id[]" value="5"{$checked["chiiki_id"][5]}>守山区 <input type="checkbox" name="chiiki_id[]" value="6"{$checked["chiiki_id"][6]}>東区 <input type="checkbox" name="chiiki_id[]" value="7"{$checked["chiiki_id"][7]}>中区 </p> <p> こだわり条件: <input type="checkbox" name="kid[]" value="1"{$checked["kid"][1]}>新築 <input type="checkbox" name="kid[]" value="2"{$checked["kid"][2]}>南向き <input type="checkbox" name="kid[]" value="3"{$checked["kid"][3]}>セキュリティ充実 <input type="submit" value="go"> </p> </form> //test.php <?PHP $test=new test; $test->exec(); class test { function __construct() { include_once "common.php"; $this->common=new common; } function exec() { $fname="x.htm"; $str=file_get_contents($fname); $replacement=array( "checked"=>$this->set_checked() ,"selected"=>$this->set_selected() ); $str=$this->common->replace_parse($str,$replacement); print $str; } function set_selected() { $selected=array(); $selected["price_min"]=$this->set_checked_price_min(); $selected["price_max"]=$this->set_checked_price_max(); return $selected; } function set_checked_price_min() { $default="1"; $array=array("1","10000000","15000000"); $selected=array(); foreach($array as $val){ $selected[$val]=($_REQUEST["price_min"]===$val)?" selected":""; } if(!isset($_REQUEST["price_min"])) $selected[$default]=" selected"; return $selected; } function set_checked_price_max() { $default="999999999999"; $array=array("999999999999","10000000"); $selected=array(); foreach($array as $val){ $selected[$val]=($_REQUEST["price_max"]===$val)?" selected":""; } if(!isset($_REQUEST["price_max"])) $selected[$default]=" selected"; return $selected; } function set_checked() { $checked["chiiki_id"]=$this->set_checked_chiiki_id(); $checked["kid"]=$this->set_checked_kid(); return $checked; } function set_checked_chiiki_id() { if(!isset($_REQUEST["chiiki_id"]) or !is_array($_REQUEST["chiiki_id"])) return false; $array=array("1","2","3","4","5","6","7"); $checked=array(); foreach($array as $val){ $checked[$val]=in_array($val,$_REQUEST["chiiki_id"])?" checked":""; } return $checked; } function set_checked_kid() { if(!isset($_REQUEST["kid"]) or !is_array($_REQUEST["kid"])) return false; $array=array("1","2","3"); $checked=array(); foreach($array as $val){ $checked[$val]=in_array($val,$_REQUEST["kid"])?" checked":""; } return $checked; } } ?>

関連するQ&A

  • 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
  • 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>&nbsp;</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>

    • ベストアンサー
    • MySQL
  • PHPでMySQLを使った検索のプログラム

    「たったコレだけでPHPプログラミングが理解できる本」を参考にPHPでプログラムを書いていまして、 ビジネスホテルの検索機能をチェックボックス機能を余分につけて検索できないか試したのですが、 チェックボックスにチェックを入れると全く検索できず他のテキストボックスに入力するだけなら検索できます。 なんとかチェックボックスを有効にできないかいろいろなサイトを調べたり本を読んだりしましたが解決策が見つかりません。 いろいろな機能に対応できるようなプログラムを組みたいと思ったのでかなりの初心者で大変恐縮ですが、どなたかご教授お願いできないかと思っております。 あと参考になるサイトがございましたら、教えていただきたいと思っております。 何卒よろしくお願い致します。 前半省略 <form name="search_form" action="" method="post" > <input type="hidden" name="cmd" value="search" /> <table> <tr> <th>物件種別</th> <td> <input type="checkbox" name="kodawari_key[]" value="温泉" <?php if( $_REQUEST["kodawari_key"] == "温泉" ){ print( 'checked' ); } ?>/> 温泉 <input type="checkbox" name="kodawari_key[]" value="ランチ" <?php if( $_REQUEST["kodawari_key"] == "ランチ" ){ print( 'checked' ); } ?>/> ランチ<br /> <input type="checkbox" name="kodawari_key[]" value="ディナー" <?php if( $_REQUEST["kodawari_key"] == "ディナー" ){ 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>&nbsp;</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 hotels where 1 = 1 "; $condition = array(); if( !empty( $_POST["kodawari_key"] )){ $sql = $sql . " and kodawari_key = :kodawari_key"; $condition["kodawari_key"] = $_REQUEST["kodawari_key"]; } 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 ( pref like :pref or city like :city or address like :address ) "; $condition[":pref"] = "%{$_REQUEST["address"]}%"; $condition[":city"] = "%{$_REQUEST["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["pref"], ENT_QUOTES ) ); ?> <?php print( htmlspecialchars( $result["city"], ENT_QUOTES ) ); ?> <?php print( htmlspecialchars( $result["address"], ENT_QUOTES ) ); ?> </td> </tr> <?php } } ?> </table> </div> </body> </html>

    • ベストアンサー
    • MySQL
  • 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
  • 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
  • ラベルのマークアップ

    <input name="price_min" type="text" value="" id="price_min" />~ <input name="price_max" type="text" value="" id="price_max" />円 このようなフォーム要素があるとき、 どのようにラベル付けをするのが妥当なのでしょうか? <label> 価格:<br> <input name="price_min" type="text" value="" id="price_min" />~ <input name="price_max" type="text" value="" id="price_max" />円 </label> このように、ひとつの<label>に対して二つのコントロールを含めることはできるのでしょうか? 現在は<span>価格</span> のように<span>タグで代用しています。 ぜひアドバイスをお願いします。

    • ベストアンサー
    • HTML
  • 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
  • 1つのsql文でデータを取得したい

    phpとmysqlを連携させデータを取得しています。mysql5です。 現在は2つのテーブルからデータを取得するため以下のように2回のsql文を発行しています。 $sql = 'SELECT products_id, name, products_flag, comment1, IF("' . $products->beforedays . '" < DATE(create_date), "1", "0") as new, FROM products WHERE status = ? AND del_flg = ? ORDER BY create_date DESC'; // 1回目のsqlで取得したproducts_idを参照し下記のsqlを実行 $sql = 'SELECT MIN(price1) as min_price1, MAX(price1) as max_price1, MIN(price2) as min_price2, MAX(price2) as max_price2, IFNULL(price2, price1) as price0, stock FROM products_class_detail WHERE products_id = ?'; これを1回のsqlにまとめる場合どのような書き方になるでしょうか? 自分なりに下記のようにしてみたところ動作はするのですが複数のデータが条件に 当てはまるはずがminとmaxがあるためか条件に当てはまる最後のデータのみしか 取得されませんでした。 ※試しにmin,maxを外すと複数のデータを取得できました。 $sql = 'SELECT products.products_id, products.name, products.products_flag, products.comment1, IF("' . $products->beforedays . '" < DATE(products.create_date), "1", "0") as new, MIN(products_class_detail.price1) as min_price1, MAX(products_class_detail.price1) as max_price1, MIN(products_class_detail.price2) as min_price2, MAX(products_class_detail.price2) as max_price2, IFNULL(products_class_detail.price2, products_class_detail.price1) as price0, products_class_detail.stock FROM products, products_class_detail WHERE products_class_detail.products_id = products.products_id AND products.status2 = ? AND products.del_flg = ? ORDER BY' . $where_sql; 商品の情報を取得するsqlで最後のorder句は商品の並び順の変更でユーザーの指定した 順番(新着順や価格順等)で表示するためのものです。 2回のsqlの場合は問題なく動作していたのですがで新着順や価格順に並び替えを行うため 1回のでsqlで行いたいと思っております。 新着順の場合は1回目のsqlに条件が入るので問題ないのですが価格順の場合は2回目の sqlに条件が入るので2回のsqlではうまく並び替えができませんでした。 ソースの短縮にもなり可能であれば1回のsqlで完結させたいのですがどうすればいいものか わからずつまづいております。 詳しい方がいらっしゃいましたら宜しくお願い致します。

  • 配列をWHEREで検索できますか。

    こんにちは。私はMysql4.1,PHP5を使用しています。 いまチェックボックスを使った配列の検索で悩んでおりました。 <input type="checkbox" name="chiiki[]" value="1">北海道 <input type="checkbox" name="chiiki[]" value="2">青森県 という形でhtmlからPOSTで値を受けとり検索したいと考えています。 テーブルには ---------------- chiiki ---------------- 1,2,4 というように配列で登録しています。 http://oshiete.nikkeibp.co.jp/kotaeru.php3?q=1496449 を参考にさせていただいたのですが、結果がうけとれません。 今まで配列を処理するときは while($col = mysql_fetch_array($rst)){ $chiiki = split(",",$col['chiiki']); } としていましたが、これは結果の値を受け取ったあとなので whereを使って配列と一致させる方法がわかりません。 どなたかご教授いただけないでしょうか。よろしくお願いいたします。

    • ベストアンサー
    • 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