質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

8228閲覧

PHPにて絞り込み検索を行いたい

hj_petricall

総合スコア2

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/06/23 03:29

編集2020/06/23 03:49

前提・実現したいこと

PHPの社員マスタの絞り込み検索についての質問です。
現在、PHPとmysqlを使用してマスタ(employee)から社員の絞り込み検索を行おうとしています。

発生している問題・エラーメッセージ

性別(sexual)と所属部署(department)が選択されていないときに
検索ボタン(search)を押すと全件取得するようにしたいのですが、データを取得することができません。
ちなみに

・性別、所属部署の両方が選択された場合
・性別のみ選択された場合
・所属部署のみ選択された場合

はそれぞれの条件で取得できます。

PHP初心者の練習のためメンテナンス性、sqlインジェクション等についてはまだ考慮しておりません。

該当のソースコード

PHP

1 // DB接続 2 $dbh = new PDO('mysql:host=localhost;dbname=syain_db;charset=utf8', $user, $pass); 3 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 4 // 全表示ボタン押下、または初回ログイン時 5 if (isset($_POST['all']) || empty($_POST['search'])) 6 { 7 $sql = "SELECT * FROM employee "; 8 } 9 // 検索ボタン押下時 10 elseif(isset($_POST['search'])) 11 { 12 if($_POST['department'] === "" && $_POST['sexual'] === "") 13 { 14 $sql = "SELECT * FROM employee "; 15 } 16 if($_POST['department'] === "") 17 { 18 $sql = "SELECT * FROM employee "; 19 $sql .= "WHERE "; 20 $sql .= 'sexual = "' . $_POST['sexual'] . '"'; 21 } 22 elseif($_POST['sexual'] === "") 23 { 24 $sql = "SELECT * FROM employee "; 25 $sql .= "WHERE "; 26 $sql .= 'department = "' . $_POST['department'] . '"'; 27 } 28 else 29 { 30 $sql = "SELECT * FROM employee "; 31 $sql .= "WHERE "; 32 $sql .= 'department = "' . $_POST['department'] . '"'; 33 $sql .= "AND "; 34 $sql .= 'sexual = "' . $_POST['sexual'] . '"'; 35 } 36 } 37 38 $stmt = $dbh->query($sql); 39 var_dump($sql); 40 $result = $stmt->fetchAll(PDO::FETCH_ASSOC); 41 42?> 43<p> 44<form method="post"> 45条件を絞り込む<br> 46 47フリーワード<input type="text" name="freeword"><br> 48 49 性別 50 <select name = "sexual"> 51 <option value=""></option> 52 <option value="1"></option> 53 <option value="2"></option> 54 </select><br> 55 56 所属部署 57<select name="department"> 58<option value="">選択してください</option> 59 <option value="1">システム部</option> 60 <option value="2">営業部</option> 61 <option value="3">総務部</option> 62</select><br> 63 64<input type="submit" name="search" value="検索する"></input> 65 66<form> 67 <input type="submit" name="all" value="全員表示"> 68</form><br> 69

試したこと

条件の書き方を変えたりしてみたのですが同じ結果になってしまい、どうすればわからない状況です・・・。
解決法等ございましたらどうか、コード等でご教示お願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2020/06/23 03:48

両方選択されていないときの検索は全データが表示されていいのですか?
hj_petricall

2020/06/23 03:51 編集

両方未選択の場合は全件取得と同じになります。 わかりずらくて申し訳ございません。加筆しました。
m.ts10806

2020/06/23 04:14

>sqlインジェクション等についてはまだ考慮しておりません。 回答のコードはSQLインジェクションが考慮されたコードですけど、認識されてますか? (初心者だから考慮しないというのはおかしいですが)
hj_petricall

2020/06/23 04:24

すみません、まだSQLインジェクション攻撃は外部からの不正な入力というぐらいの認識しかないので 認識不足の部分があります…。 どのようになっているのかご教示お願いできますでしょうか…。
guest

回答1

0

ベストアンサー

こんな書き方になります

投稿2020/06/23 03:57

yambejp

総合スコア116724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2020/06/23 06:12 編集

<?PHP $department=filter_input(INPUT_POST,'department',FILTER_VALIDATE_INT); $sexual=filter_input(INPUT_POST,'sexual',FILTER_VALIDATE_INT); if(count($_POST)>0){ $sql = "SELECT * FROM employee where 1 "; $data=[]; if(is_numeric($department)){ $sql.=" and department=? "; $data[]=$department; } if(is_numeric($sexual)){ $sql.=" and sexual=? "; $data[]=$sexual; } print $sql.";<br>"; print_r($data); } ?> <form method="post"> フリーワード<input type="text" name="freeword"><br> 性別 <select name = "sexual"> <option value="">-</option> <option value="1">男</option> <option value="2">女</option> </select><br> 所属部署 <select name="department"> <option value="">選択してください</option> <option value="1">システム部</option> <option value="2">営業部</option> <option value="3">総務部</option> </select><br> <input type="submit" name="search" value="検索する"> </form><br>
yambejp

2020/06/23 03:58

$sqlと$dataをつかってprepareで処理してください
hj_petricall

2020/06/23 04:11

queryの部分をprepareに変更するという認識でよろしいでしょうか
yambejp

2020/06/23 04:26 編集

$stmt = $dbh->query($sql); の部分を $stmt = $pdo->prepare($sql); $stmt->execute($data); とします 私のソースで言う print $sql.";<br>"; print_r($data); の部分で、$sqlと$dataがセットされているのがわかると思います
hj_petricall

2020/06/23 04:50

なるほど…。 ちなみに検索はできたのですが全員表示ボタン(all)を押した際も検索と同じ検索になってしまいます。。。 // 現状のコード $department=filter_input(INPUT_POST,'department',FILTER_VALIDATE_INT); $sexual=filter_input(INPUT_POST,'sexual',FILTER_VALIDATE_INT); // データが入ってた時 if(count($_POST) > 0 ) { $sql = "SELECT * FROM employee where 1 "; $data = []; if(is_numeric($department)) { $sql.=" and department=? "; $data[]=$department; } if(is_numeric($sexual)) { $sql.=" and sexual=? "; $data[]=$sexual; } $stmt = $dbh->prepare($sql); $stmt->execute($data); $result = $stmt->fetchAll(PDO::FETCH_ASSOC); postでデータが入った際に検索を行うようになってるからだと思いますが、全員表示ボタン(all)を押した際に全件取得するにはどうすればよろしいでしょうか…。 全員表示ボタンは質問のほうのコードに記載してあります。
yambejp

2020/06/23 06:13

allの必要性をあまり感じないです。jsで条件をクリアして検索すればいいだけでは? どうしてもallボタンを付けたいならこう
yambejp

2020/06/23 06:13

<?PHP $department=filter_input(INPUT_POST,'department',FILTER_VALIDATE_INT); $sexual=filter_input(INPUT_POST,'sexual',FILTER_VALIDATE_INT); $all=filter_input(INPUT_POST,'all'); if(count($_POST)>0){ $sql = "SELECT * FROM employee where 1 "; $data=[]; if(is_null($all)){ if(is_numeric($department)){ $sql.=" and department=? "; $data[]=$department; } if(is_numeric($sexual)){ $sql.=" and sexual=? "; $data[]=$sexual; } } print $sql.";<br>"; print_r($data); } ?> <form method="post"> フリーワード<input type="text" name="freeword"><br> 性別 <select name = "sexual"> <option value="">-</option> <option value="1">男</option> <option value="2">女</option> </select><br> 所属部署 <select name="department"> <option value="">選択してください</option> <option value="1">システム部</option> <option value="2">営業部</option> <option value="3">総務部</option> </select><br> <input type="submit" name="search" value="検索する"> <input type="submit" name="all" value="全員表示"> </form><br>
hj_petricall

2020/06/23 07:10

確かにallはあまり必要性がないですが、すべて出したい際に表示を選択をすべて初期に戻すのが面倒くさいので全員表示のボタンを作りたかったです。 わかりやすく説明していただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問