- ベストアンサー
phpプルダウン検索でmysqlのデータ表示
- プルダウン検索でmysqlのデータを表示する方法について困っています。
- phpでmysqlからデータを検索し、プルダウンで選択したデータを表示したいですがうまく動作しません。
- 2つのプルダウンを追加した場合にデータが表示されない問題が発生しています。どう組み立てれば良いかわかりません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
んー動作上は特に問題はないのですが、よりよいコーディングのためにあえてダメ出しをすると、 prepare → bindParam → execute(引数なし) よりも prepare → execute(引数あり) の方がいいと思います。 前者の方法であれば提示されたコードのように書くのが一般的かもしれませんが、こう書くと同じものに対して2回条件判定が必要になりますよね?後者の方法であれば(URL参照先でもコードを提示していますが)1回だけで済むので、無駄なコードが減ると思います。なお、後者を採用できるのはバインドする型が全て「テキスト」である場合のみで、「整数」「バイナリデータ」等bindParamでの型指定が必要になる場合は前者を選択するしかありません。 特別な理由が無い限りはbindParamではなくbindValueを使いましょう。前者は参照渡し、後者は値渡しです。 joinはimplodeのエイリアス扱いなので、どちらかといえばimplodeと書く方が一般的でしょう。 文字列比較について、$varが文字列型であると確定している場合は $var != '' でも $var !== '' でも差はないのですが、可能であれば後者のように「厳密な比較」で書く癖をつけておきましょう。前者のような「緩やかな比較」はいろいろと弊害を引き起こす可能性があるので、使いどころを選びましょう。 http://php.net/manual/ja/types.comparisons.php [問題のある例] '2000' === '2e3' → False '2000' == '2e3' → True 気になった点はこのぐらいでしょうか。
その他の回答 (2)
$_SERVER['PHP_SELF']をそのようにechoするとXSS脆弱性が発生します。絶対にやめてください。 http://itpro.nikkeibp.co.jp/article/COLUMN/20070227/263356/ <form method="POST" action="<?=basename($_SERVER['SCRIPT_NAME'])?>"> とするか、いっそのこと <form method="POST" action=""> でもいいと思いますよ。 Taiyonoshizukuさんがおっしゃるように、「全て」の場合はプレースホルダを、というかSQL文自体を変形させる必要があるので、そこを工夫してみましょう。 PHPでデータベースに接続するときのまとめ http://qiita.com/mpyw/items/b00b72c5c95aac573b71 汎用的な変数構造フィルタリング関数(プレースホルダの動的増減はこちらで説明してます) http://qiita.com/mpyw/items/c39b9ee695a5c2e74627
お礼
ありがとうございます。参照先を拝見させていただき大変参考になりました。 おかげさまで目的通りに動きました。 ただひとつ気になったところが下記の●の箇所 try{ $db = new PDO('mysql:host=localhost;dbname=testusr;charset=utf8','usrname','usrpass'); $query = 'SELECT * FROM fruits'; $wheres = array(); if($color != ''){$wheres[] = 'color = :color';} if($fruits != ''){$wheres[] = 'fruits = :fruits';} $where = join(' and ',$wheres); if($where != ''){$query.=" WHERE $where";} $stt = $db->prepare($query); ●if($color != ''){$stt->bindParam(':color', $color);} ●if($fruits != ''){$stt->bindParam(':fruits', $fruits);} $stt->execute(); }catch(PDOException $e){ die('エラーメッセージ:'.$e->getMessage()); } バインドの部分ですが、ここでもif文を使いました、 このような書き方でも問題ありませんでしょうか?もっと正しい方法があるのでしょうか? よろしければよろしくお願いします。
- Taiyonoshizuku
- ベストアンサー率37% (183/489)
>(1)上のようにプルダウンが1つの場合は表示できるのですが、2つに増やした場合にうまく動きません。 うまくいかないとはどうなるの? うまく行った場合は→ うなく行かない→ 補足して。 (2)「全て」を選択した場合に全て表示したいのですが、何も表示されません。 全てを表示したいなら絞り込むための条件を入れちゃダメだよね? 今のままだと最終的なSQLは select * from fruits where color='' ってSQLが出来るよね? 実際全てを取ってくるSQLは select * from fruits だよね。 これで何か思いつかない?
お礼
うまくいく:選択なし・片方選択・両方選択で表示される うまくいかない:両方選択した場合でないと表示されない ということでした。 >全てを表示したいなら絞り込むための条件を入れちゃダメだよね? 言われてみればまったくその通りです。 今の状態だとどんなSQLができるのかをよく考えてみます。 ありがとうございます!
お礼
今回はテキストのみだったのでexecuteに引数を渡す形でできました。 bindParamとbindValue違いやjoinとimplodeの違いなど 細かな点を教えていただき感謝しております。 それぞれについて意味を理解しながら勉強したいと思います。 ありがとうございました。