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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

Q&A

1回答

4115閲覧

PHP,SQLで検索画面のフィルター機能を付けたい

nagata_

総合スコア12

MySQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

0グッド

0クリップ

投稿2019/07/04 08:30

編集2019/07/09 07:56

質問を更新いたしました。

PHP、SQLの初心者です。ご教授願います。
自分の学習課題として、Databaseに登録してある情報を検索できる画面を作成しています。データはアップル製品で構成しています。
【やりたいこと】
検索画面で「フィルター」機能を付けようとしています。
機種名検索で部分一致を行い、SQL文のANDでシリーズのチェックボックスのフィルターを行いたいです。
例)
機種名に「iPhone」と打つと、すべてのiPhoneが表示される(iPhone3G~iPhoneXSまで)
機種名を空欄かつシリーズのチェックをなしのとき、全て表示する
機種名に「iPhone」と打ち、チェックボックスに「iPhone3」をつけると検索結果に「iPhone3G,iPhone3GS」と表示する

【分からないこと】
チェックボックスのみ(機種名の記入無)だと正常に検索結果が表示されますが
機種名を一部分でも記入するとエラーがでて全件表示されてしまいます。
(おそらく機種名を読み込んでいない?)
また、機種名に「iPhone3G」と打ち、シリーズに「iPhone4」をチェックすると
iPhone4,iPhone4sが表示されてしまいます。(iPhone3G,iPhone3GSと表示したい)

イメージ説明

<body> <form method="POST" action="<?php echo es($_SERVER['SCRIPT_NAME']); ?>"> <table border="1"> <tr> <td>機種名</td> <td> <input type="text" name="P_KISYUMEI" placeholder="機種名を入力してください。" value="<?php echo $P_KISYUMEI ?>"></td> <td rowspan="7" align="center" valign="middle">&nbsp;<input type="submit" value="SEARCH">&nbsp;</td> </tr> <tr> <td>シリーズ</td> <td> <table> <tr> <td><input type="checkbox" value="iPhone3" name="P_SERIES[]" <?php echo isset($_POST['P_SERIES']) ?>>iPhone3</td> <td><input type="checkbox" value="iPhone4" name="P_SERIES[]" <?php echo isset($_POST['P_SERIES']) ?>>iPhone4</td> <td><input type="checkbox" value="iPhone5" name="P_SERIES[]" <?php echo isset($_POST['P_SERIES']) ?>>iPhone5</td> <td><input type="checkbox" value="iPhone6" name="P_SERIES[]" <?php echo isset($_POST['P_SERIES']) ?>>iPhone6</td> </tr> <tr> <td><input type="checkbox" value="iPhone7" name="P_SERIES[]" <?php echo isset($_POST['P_SERIES']) ?>>iPhone7</td> <td><input type="checkbox" value="iPhone8" name="P_SERIES[]" <?php echo isset($_POST['P_SERIES']) ?>>iPhone8</td> <td><input type="checkbox" value="iPhoneX" name="P_SERIES[]" <?php echo isset($_POST['P_SERIES']) ?>>iPhoneX</td> </tr> </table> </td> </tr> </table> </form> <?php try{ $pdo = new PDO($dsn, $user, $password); // プリペアドステートメントのエミュレーションを無効にする $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); // 例外がスローされる設定にする $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $whereCollection = []; if(!empty($_POST['P_KISYUMEI '])){ $whereCollection[] = ' P_KISYUMEI LIKE :P_KISYUMEI '; } if(count($_POST['P_SERIES']) > 0){ $series = []; for($i=0;$i<count($_POST['P_SERIES']);$i++){ $series[] = ':P_SERIES'.$i; } $whereCollection[] = ' P_SERIES IN ('.implode(',',$series).') '; } $where = count($whereCollection)>0? " where ".implode(" and ",$whereCollection):""; $sql = "SELECT * FROM iphone_spec ".$where; echo $where; $stm = $pdo->prepare($sql); if(!empty($_POST['P_KISYUMEI '])){ $stm->bindValue(':P_KISYUMEI', "%{$P_KISYUMEI}%", PDO::PARAM_STR); } if(count($_POST['P_SERIES']) > 0){ for($i=0;$i<count($_POST['P_SERIES']);$i++){ $stm->bindValue(':P_SERIES'.$i, $_POST['P_SERIES'][$i], PDO::PARAM_STR); } } $stm->execute(); // 結果の取得(連想配列で受け取る) $result = $stm->fetchAll(PDO::FETCH_ASSOC); echo count($result)."件の機種が見つかりました。"; if(count($result)>0){ //echo "機種名に「{$P_KISYUMEI}」が含まれているレコード"; // テーブルのタイトル行 echo "<table border=1>"; echo "<thead><tr>"; echo "<th bgcolor='#cccccc'>", "No.", "</th>"; echo "<th bgcolor='#cccccc'>", "詳細", "</th>"; echo "<th bgcolor='#cccccc'>", "機種名", "</th>"; echo "<th bgcolor='#cccccc'>", "シリーズ", "</th>"; echo "<th bgcolor='#cccccc'>", "CPU", "</th>"; echo "</tr></thead>"; // 値を取り出して行に表示する echo "<tbody>"; foreach ($result as $key => $row){ // 1行ずつテーブルに入れる $keys = $key+1; echo "<tr>"; echo "<td bgcolor='#ffffff'>{$keys}</td>"; echo "<td bgcolor='#ffffff'></td>"; echo "<td bgcolor='#ffffff'>", es($row['P_KISYUMEI']), "</td>"; echo "<td bgcolor='#ffffff'>", es($row['P_SERIES']), "</td>"; echo "<td bgcolor='#ffffff'>", es($row['CPU']), "</td>"; echo "</tr>"; } echo "</tbody>"; echo "</table>"; } else { echo "機種名に「{$P_KISYUMEI}」は見つかりませんでした。"; } }catch (Exception $e) { echo '<span class="error">エラーがありました。</span><br>'; echo $e->getMessage(); } ?> <hr> <p><a href="<?php echo $gobackURL ?>">CLEAR</a></p> </body>

データベース画像
イメージ説明

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

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

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

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

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

yambejp

2019/07/04 08:43

$_SERVER['PHP_SELF']はNG、$_SERVER['SCRIPT_NAME']を使ってください
nagata_

2019/07/09 11:16

回答が遅れ申し訳ありません。 まだ初心者で至らない点が多く、試行錯誤している状況です。 質問を更新いたしまして、コードをシンプルにしてみました。 機種名の入力でも検索できていないので、まだまだのようです。 お力添えのほどよろしくお願いします。
guest

回答1

0

ラジオボタンの使い方からしておかしいので、最初の項目だけ

PHP

1<?PHP 2$taisyou=filter_input(INPUT_POST,"P_TAISYOU"); 3var_dump($taisyou); 4?> 5<form method="post"> 6<label><input type="radio" value="" name="P_TAISYOU" checked>ALL</label><br> 7<label><input type="radio" value="iPhone" name="P_TAISYOU">iPhone</label><br> 8<label><input type="radio" value="iPad" name="P_TAISYOU">iPad</label><br> 9<label><input type="radio" value="iPod" name="P_TAISYOU">iPod</label><br> 10<label><input type="radio" value="dummy" name="P_TAISYOU">dummy</label><br> 11<input type="submit" value="send"> 12</form>

上記徐々に拡張していけばよいでしょう

投稿2019/07/04 09:01

yambejp

総合スコア114843

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問