util.phpのコード
<?php // XSS対策のためのHTMLエスケープ function es($data, $charset='UTF-8'){ // $dataが配列のとき if (is_array($data)){ // 再帰呼び出し return array_map(__METHOD__, $data); } else { // HTMLエスケープを行う return htmlspecialchars($data, ENT_QUOTES, $charset); } } // 配列の文字エンコードのチェックを行う function cken(array $data){ $result = true; foreach ($data as $key => $value) { if (is_array($value)){ // 含まれている値が配列のとき文字列に連結する $value = implode("", $value); } if (!mb_check_encoding($value)){ // 文字エンコードが一致しないとき $result = false; // foreachでの走査をブレイクする break; } } return $result; } //
easy.phpのコード### > ヘディングのテキスト
<?php require_once("util.php"); $gobackURL = "easy.php"; if (!cken($_POST)){ header("Location:{$gobackURL}"); exit(); } $user = "iPhoneuser"; $password = "iPhoneuser1020"; $dbName ="apple_product"; $host = "localhost:3306"; $dsn = "mysql:host={$host};dbname={$dbName}; charset=utf8"; ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>名前検索</title> <link href="P_NPL2130A.css" rel="stylesheet"> </head> <SCRIPT LANGUAGE="JavaScript"> </SCRIPT> <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 '; } //75行目 if(count($_POST['P_SERIES']) > 0){ $series = []; for($i=0;$i<count($_POST['P_SERIES']);$i++){ $series[] = ':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); } //92行目 if(count($_POST['P_SERIES']) > 0){ for($i=0;$i<count($_POST['P_SERIES']);$i++){ $stm->bindValue(':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> </html>
発生している問題・エラーメッセージ
シリーズのチェックボックスにチェックを入れると正常に動作します。 しかし機種名を入力すると、画像のようなエラーがでます。 また、やりたいことととして 機種名に「iPhone」、シリーズをiPhone3,iPhone4にチェックを入れると iPhone3,iPhone3GS,iPhone4,iPhone4sが検索結果に出したいです。 現状では、エラーがでてしまう状況でコーディング中です。
試したこと
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/05 06:49
2019/07/05 07:29