質問を更新いたしました。
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"> <input type="submit" value="SEARCH"> </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>