前提・実現したいこと
PHP、HTML、mysqlを使用し社員の情報の登録を行うページを作っています。
その際、入力チェックを行うのですが、エラーの際は画面遷移させずに上のほうに
エラーメッセージを表示させ、すべて内容がokな場合は登録完了のページに飛ぶようにしたいです。
今回の条件
・入力値が空欄、未選択の場合(空白スペースもエラー)に画面遷移させずに、上記のほうに先頭に「・」付きの赤字でエラーを出したい
・すべての項目がokの場合は「add.php」(登録完了用の画面)に値を渡して画面遷移(登録完了画面は作成済み)
・ファイルはすべて同じフォルダにある
・エラー時に入力した値は保持する
・赤字はcssを用意(これはわかるので大丈夫)
補足
・ブートストラップはまだシートを当てただけで実装はしてないです。
・赤字は別にCSSを作成します
form.php
PHP
<? // 初期化 $error = array(); // エラーメッセージ if($_POST['employee_num'] === "") { $error[] = "社員番号は必ず入力してください。"; } if($_POST['employee_name'] === "") { $error[] = "氏名は必ず入力してください。"; } if($_POST['sexual'] === "") { $error[] = "性別が選択されていません。"; } if($_POST['department'] === "") { $error[] = "所属部署が選択されていません。"; } if($_POST['phone_num'] === "") { $error[] = "電話番号は必ず入力してください。"; } if($_POST['street'] === "") { $error[] = "住所は必ず入力してください。"; } ?> <!DOCTYPE html> <html lang = "ja"> <head> <meta charset="UTF-8"> <title>新規登録画面</title> <link rel="stylesheet" href="../css/bootstrap.css"> </head> <body> <h2>新規登録</h2> // ↓ここから <?php if(isset($_POST['send'])) { if(isset($error)) { ?> <ul class="error_message"> <?php foreach($error as $value) { echo $value."<br>"; } } ?> </ul> } // ↑↑ここまでがエラーメッセージ表示枠 // ここからフォーム画面 <form method="POST" action="add.php"> <p> 社員番号: <input type="number" min="1" max="9999" name="employee_num"> </p> <p> 氏名: <input type="text" name="employee_name"> </p> <p> 性別 <select name = "sexual"> <option value="">-</option> <option value="1">男</option> <option value="2">女</option> </select> </p> <p> 所属部署: <select name="department"> <option value="" hidden>選択してください</option> <option value="1">システム部</option> <option value="2">営業部</option> <option value="3">総務部</option> </select> </p> <p> 生年月日: <?php echo '<select name="year">'. "\n"; $start = date('Y'); $end = date('Y') - 100; for($i = $start; $i >= $end; $i--) { echo '<option value="' .$i . '">' . $i .'</option>'. "\n"; } echo '</select>年' . "\n"; echo '<select name="month">' . "\n"; for ($i = 1; $i <= 12; $i++) { echo '<option value="' .$i . '">' . $i .'</option>'. "\n"; } echo '</select>月' . "\n"; echo '<select name="day">' . "\n"; for ($i = 1; $i <= 31; $i++) { echo '<option value="' .$i . '">' . $i .'</option>'. "\n"; } echo '</select>日' . "\n"; ?> </p> <p> 電話番号: <input type="text" name="phone_num" onKeyup="this.value=this.value.replace(/[^0-9]+/,'')"> </p> <p> 住所: <input type = "text" name="street"> </p> <input type="submit" name="send" value="登録"> </form> </body> </html>
###add.php
PHP
<?php $employee_num = (int)$_POST['employee_num']; $employee_name = $_POST['employee_name']; $sexual = (int)$_POST['sexual']; $department = (int) $_POST['department']; $year = $_POST['year']; $month = $_POST['month']; $day = $_POST['day']; $select_month = sprintf('%02d', $month); $select_day = sprintf('%02d', $day); $total = $year.$select_month.$select_day; $birthday = date("Y-m-d",strtotime($total)); $phone_num = $_POST['phone_num']; $street = $_POST['street']; require_once '\MAMP\db_config.php'; try { // DB接続 $dbh = new PDO('mysql:host=localhost;dbname=employee_db;charset=utf8', $user, $pass); $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "INSERT INTO employee (employee_num, employee_name, sexual, department, birthday, phone_num, street) VALUES (?, ?, ?, ?, ?, ?, ?)"; $stmt = $dbh->prepare($sql); $stmt->bindValue(1, $employee_num, PDO::PARAM_INT); $stmt->bindValue(2, $employee_name, PDO::PARAM_STR); $stmt->bindValue(3, $sexual, PDO::PARAM_INT); $stmt->bindValue(4, $department, PDO::PARAM_INT); $stmt->bindValue(5, $birthday, PDO::PARAM_STR); $stmt->bindValue(6, $phone_num, PDO::PARAM_STR); $stmt->bindValue(7, $street, PDO::PARAM_STR); $stmt->execute(); $dbh = null; echo "社員の登録が完了しました。<br>"; echo "<a href='index.php'>トップページへ戻る</a>"; } catch(Exception $e) { echo "エラー発生: " . htmlspecialchars($e->getMessage(), ENT_QUOTES, 'UTF-8') . "<br>"; die(); }
試したこと
登録ボタンが押されたとき、$errorに格納されていればforeachで格納されているメッセージを吐き出すというところまでの理解まではできているのですが、実装の部分でつまっています。
現状の実装状況を記述しましたので、どのように実装すればよいのかコード等でご教示いただければ幸いです。。
まだ回答がついていません
会員登録して回答してみよう