質問: $stmt->fetch(PDO::FETCH_ASSOC)){ $res .= << {$row['student_number']} {$row['student_name']} {$row['email']} {$row['sex']} {$row['syozoku']} {$row['birth_year']} 編 eod; } $res .= "\n"; }catch(Exception $e){ echo "エラー発生" . $e->getMessage(); } ?> 一覧画面 条件を絞り込む フリーワード 性別 男 女 所属 運動部 文化部 帰宅部 生徒会 ``` ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/edc63a0d7fd826fdcedbbb6393cf572a.png) ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/29b7d69c0bb72d7888f61d86fdd99e9a.png) ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/8845401bb5b75653d9e7a8aed55c68df.png)
回答: pdo使っているのにbind使ってなかったり、sqlのエスケープされてなくて非常に勿体無いですね。。 * bindParam * PHPのPDOでSQLインジェクション対策 入力コントロールの内容そのまま問い合わせに使うのであれば、わざわざ大量にif文使わなくて良いと思います。 > > 質問1 > > > それぞれの条件のときにわざわざselect文で完結してしまっているからですね。 条件を配列で持っておき、andでつなげてSELECTとすることで、複数条件で検索可能となります。 ※とりあえず現状のソースを活かすので冒頭に挙げたエスケープは入れてません。 ``` $where = []; if (isset($_POST['sex']) && $_POST['sex'] != "") { $where[] = " ( sex = '".$_POST['sex']."' ) "; } if (isset($_POST['syozoku']) && $_POST['syozoku'] != "") { $where[] = " ( syozoku like '%".$_POST['sex']."%' ) "; } $sql = 'SELECT * FROM student'; if(count($where) > 0){ $sql .= " where ".implode(" and ",$where); } ``` > > 質問2 > > > 全て「イコール」で検索しているからです。 現状のデータ構造を変えられないのであれば、とりあえず質問1の回答のソースのようにlikeの部分一致で検索すれば良いはず。 余談: 所属名称や性別などはコードで持っておき、別のテーブルにした方が良いです。 今回の所属名や性別などは名称があまり変わらないかもしれませんが、 日本語や名称を持っておくと万が一名称が変わったときに管理しきれなくなります。 所属も複数登録する可能性があるのであれば、同じテーブル内で規則性ないセパレータで持つよりも、 「生徒所属管理テーブル」のようなものを作って、「生徒コード」「所属コード」で1対多の関係で持っておき、 生徒テーブルから随時参照するような形でしておく方が、~~管理はしやすくなります。~~それぞれの役割がはっきりします。 1つのテーブルに全て詰め込むのは後々のメンテナンス性まで考えた場合に賢いやり方ではありません。 後学のためにテーブル設計参考例 ================ 何かしらの課題っぽいので変えられない部分もあるかと思いますが、テーブル設計の例を挙げておきます。 学生テーブル(PK:学籍番号) | 学籍番号 | 氏名 | メールアドレス | 性別 | | --- | --- | --- | --- | | 001 | 山田太郎 | tarou@hogehoge.com | 0 | | 002 | 山田花子 | hanako@hogehoge.com | 1 | 所属テーブル(PK:所属コード) | 所属コード | 所属名称 | | --- | --- | | 001 | 運動部 | | 002 | 生徒会 | | 003 | 文化部 | 学生所属管理テーブル(PK:学籍番号、所属コード) | 学籍番号 | 所属コード | | --- | --- | | 001 | 001 | | 002 | 002 | | 002 | 003 | 取得の仕方としては、 学生テーブルから取得するときに 学籍番号で学生所属管理テーブルを参照し、 所属名称は学生所属管理テーブルの所属コードから 所属テーブルを参照するようにします。 ※ SQL一発でjoinでつなげても良いですし、学生テーブルのみ取得してあとは個別にSQL発行しても構いません。 男女は0なら男、1なら女と直接出力時にphpに書いても良いと思います。それか設定ファイルに持つとか。 やり方は1つではないので色々と考えて、やってみてください。