- ベストアンサー
MySQLに関するプログラムの書き換え方
- ページを開いても何もデータが出てこない状態にするにはどのように書き換えれば良いのでしょうか?
- 選手一覧を検索した後にデータが出てくるようにする方法を教えてください。
- 選手のチーム名やポジションに基づいて検索する方法を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>何かおかしなところがございましたらご指摘いただけたらありがたい DBの部分はまぁよいとして、htmlに組み込むところを少し調整した方がよいようです こんな風にしておくと、htmlの部分がぐちゃぐちゃにならずにプログラムとの 親和性があがります とくに例示では$_POSTの中身をそのまま出力していましたが、さすがにNGです <?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"; } } print <<<eof <form> <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="{$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> </table> <p> <input type="submit" value="検索"> <input type="reset" value="リセット"> </p> </form> eof;
その他の回答 (2)
- yambejp
- ベストアンサー率51% (3827/7415)
例文が複雑になっているのでプレイスホルダーの部分だけ抜き出して書きます。 こんな感じでやってみてください <form> name:<input type="text" name="name" size="30" value=""><br> check:<input type="checkbox" name="team_id[]" value="1">1 <input type="checkbox" name="team_id[]" value="2">2 <input type="checkbox" name="team_id[]" value="3">3 <input type="submit" value="go"> </form> <?PHP $sql = "SELECT * FROM mst_player_market WHERE 1 "; $datas=array(); //nameとteam_idを拾う $name=(isset($_REQUEST["name"])and $_REQUEST["name"]!=="")?$_REQUEST["name"]:null; $team_id=(isset($_REQUEST["team_id"]) and is_array($_REQUEST["team_id"]))?$_REQUEST["team_id"]:null; //nameもteam_idも空なら検索させない if(is_null($name) and is_null($team_id)){ $sql.= "AND 0 "; } //nameに何かはいっていれば検索、ただしワイルドカードやエスケープ文字をエスケープする if(!is_null($name)){ $sql.= "AND name like ? "; $datas[]="%".addcslashes($name, '\\_%')."%"; } //team_idをINで検索 if(!is_null($team_id)){ $sql.= "AND team_id in (".implode(",",array_fill(1,count($team_id),"?")).") "; $datas=array_merge($datas,$team_id); } print $sql.";<br>\n"; print_r( $datas); $pdo = new PDO($dsn, $user,$password); $stmt = $pdo->prepare($sql); $stmt->execute($datas); ?>
お礼
いつもお世話になってます! ご教授いただいたプログラムを組み合わせて作りました。 間違っているかどうかわからないですがプレースホルダーを使ったシステム自体は動いています。 何かおかしなところがございましたらご指摘いただけたらありがたいと思っております。 またチェックボックスなど項目を増やすかもしれないので気が向きましたらご教授いただけたらと思っております。 いつもお忙しいところ本当にありがとうございます。おかげ様でなんとかプログラムが動かせるようになりました。 プログラムは下記のように入力しました。 <form name="search_form" action="xxxxx.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> </table> <p> <input type="submit" value="検索"> <input type="reset" value="リセット"> </p> </form> //データベース接続部分省略 //最初のSQL文 $sql = "SELECT DISTINCT code,name,price,position,gazou,team.team_name FROM mst_player_market,team,position WHERE mst_player_market.code = team.playerid"; $datas=array(); //nameとteam_idを拾う $name=(isset($_REQUEST["name"])and $_REQUEST["name"]!=="")?$_REQUEST["name"]:null; $team_id=(isset($_REQUEST["team_id"]) and is_array($_REQUEST["team_id"]))?$_REQUEST["team_id"]:null; //nameもteam_idも空なら検索させない if(is_null($name) and is_null($team_id) and is_null($position_id)){ $sql.= "AND 0 "; } //nameに何かはいっていれば検索、ただしワイルドカードやエスケープ文字をエスケープする if(!is_null($name)){ $sql.= " AND name like ? "; $datas[]="%".addcslashes($name, '\\_%')."%"; } //team_idをINで検索 if(!is_null($team_id)){ $sql.= " AND team_id in (".implode(",",array_fill(1,count($team_id),"?")).") "; $datas=array_merge($datas,$team_id); } print $sql.";<br>\n"; print_r( $datas); /************************************************************************/ //実行 $pdo = new PDO($dsn,$user,$password); $stmt = $pdo->prepare($sql); $stmt->execute($datas); $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(); } ?> //結果部分省略
補足
度々丁寧な解説して頂いて本当にありがとうございます! 只今結果報告が出来る状況ではありませんので申し訳ありませんがしばらくお待ち頂けたらと思っております。 明後日くらいまでには結果報告しますのでよろしくお願い致します。
- yambejp
- ベストアンサー率51% (3827/7415)
$_POST["team_id"]や$_POST["name"]など検索項目をissetでチェックして すべてがセットされていなければ、SQLを走らせなければよいのでは? もしくはSQLのWHERE句に"AND 0"が付加される様にして発行すれば 1件もヒットしません ちなみにざっと見た感じ、プレースホルダの使い方が変 POSTされたデータを生でSQLに投入したらプリペアド処理する意味ないでしょ 運用方法を見直した方がよいです
お礼
ご指摘ありがとうございます! プレースホルダの使い方はまだ全然理解できてないのでこれからマニュアル見るなり検索してみるなりしてみようと思います。 下記のようなプログラムを入力したらSQL文のプログラムが走らなくなりました。 <?php try { $dsn = 'mysql:dbname=player;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']) && ($_POST['team_id']!==0)){ $sql.='1'; }else{ $sql.='and 0'; を入れると何故かページを開いたらすぐ全データが出ない状態になりました。 ($_POST['team_id']!==0) の部分が特にわからないです。値が入っていないと言う意味ですよね? 選手名だけ入力した場合、チーム名だけ入力した場合、それと両方入力した場合で3パターンとも意味がわからないですが正常に動きました。
補足
今回も回答頂きありがとうございます! 私の書き方が悪いと思うのですが、以下のようなエラーがテキスト内に出てしまいます。 <br /><b>Notice</b>: Undefined variable: value in <b>C:\xampp\htdocs\xxxxxx\xxxxxxx\xxxxxxx</b> on line <b>23</b><br /><br /><b>Notice</b>: Undefined index: in <b>C:\xampp\htdocs\xxxxxxxxxxx\xxxxxx\xxxxxxxx</b> on line <b>23</b><br /> これを直すのに少し時間がかかってしまうのでしばらくしてどうしてもわからなかったらまたここで質問させていただきたいと思っております。 恐縮ですが気が向いたらまたご教授いただきたいと思っております。 本当にありがとうございました!