前提
PHPでユーザー登録フォームを作っています。
バリデーションの実装後に問題が発生しました。
実現したいこと
ここに実現したいことを箇条書きで書いてください。
- ~ is required.のエラー文章をname,email,passwordが入力されていない時に、フォームがsubmitされたら出るようにしたい。
発生している問題・エラーメッセージ
nameなら、"Only alphabets and white space area allowed."; emailなら、 "Invalid email format"; passwordなら、"Your password must contain at least 8 characters."; が、各inputに何も入力されずに送信されたときに優先されて出てきてしまう。
該当のソースコード
PHP
1register.php 2 3<?php 4require_once "../Encode.php"; 5session_start(); 6//session_destroy(); 7 8$nameError = $emailError = $passwordError = ""; 9$name = $email = $password = $passwordConfirm = ""; 10 11?> 12 13<!DOCTYPE html> 14<html lang="en"> 15 16<head> 17 <meta charset="UTF-8"> 18 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 19 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 20 <title>Sign up</title> 21 <link rel="stylesheet" href="../../css/main.css"> 22</head> 23 24<body class="register"> 25 26 <?php 27 if ($_SERVER["REQUEST_METHOD"] == "POST") { 28 /** 29 * validate name 30 */ 31 if (!isset($_POST["name"])) { 32 $nameError = "Name is required."; 33 } else { 34 $name = e($_POST["name"]); 35 if (!preg_match("/^[a-zA-Z]*$/", $name)) { 36 $nameError = "Only alphabets and white space area allowed."; 37 } 38 } 39 /** 40 * validate email 41 */ 42 if (!isset($_POST["email"])) { 43 $emailError = "Email is required."; 44 } else { 45 $email = e($_POST["email"]); 46 if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { 47 $emailError = "Invalid email format"; 48 } 49 } 50 /** 51 * validate password 52 */ 53 if (isset($_POST["password"], $_POST["password_confirm"])) { 54 $password = e($_POST["password"]); 55 $passwordConfirm = e($_POST["password_confirm"]); 56 if (strlen($password <= 8)) { 57 $passwordError = "Your password must contain at least 8 characters."; 58 } elseif (!preg_match("#[0-9]+#", $password)) { 59 $passwordError = "Your password must contain at least 1 number."; 60 } elseif (!preg_match("#[A-Z]+#", $password)) { 61 $passwordError = "Your password must contain at least 1 capital letter."; 62 } elseif (!preg_match("#[a-z]+#", $password)) { 63 $passwordError = "Your password must contain at least 1 lowercase letter."; 64 } 65 } elseif (!isset($_POST["password"], $_POST["password_confirm"])) { 66 $passwordError = "Password is required."; 67 } elseif ($_POST["password"] !== $_POST["password_confirm"]) { 68 $passwordError = "Both passwords should be matched."; 69 } 70 } 71 ?> 72 73 <form action="<?php echo e($_SERVER["PHP_SELF"]); ?>" method="POST" class="register__form"> 74 <div> 75 <label for="name">Name</label> 76 <input id="name" type="text" name="name" value="<?= e($_SESSION["name"] ?? '') ?>" /> 77 <span class="error"><?php echo $nameError; ?></span> 78 </div> 79 <div> 80 <label for="email">Email</label> 81 <input id="email" type="text" name="email" value="<?= e($_SESSION['email'] ?? '') ?>" /> 82 <span class="error"><?php echo $emailError; ?></span> 83 </div> 84 <div> 85 <label for="password">Password</label> 86 <input id="password" type="password" name="password" value="<?= e($_SESSION['password'] ?? '') ?>" /> 87 </div> 88 <div> 89 <label for="password_confirm">Password</label> 90 <input id="password_confirm" type="password" name="password_confirm" value="<?= e($_SESSION['password_confirm'] ?? '') ?>" /> 91 <span class="error"><?php echo $passwordError; ?></span> 92 </div> 93 <div> 94 <input type="submit" value="Send" /> 95 </div> 96 </form> 97</body> 98 99</html>
PHP
1Encode.php 2 3<?php 4function e(string $str, string $charset = 'UTF-8'): string 5{ 6 $str = trim($str); 7 $str = stripslashes($str); 8 return htmlspecialchars($str, ENT_QUOTES | ENT_HTML5, $charset, false); 9}
試したこと
セッションを利用している為、session_destroy()を追加して動作が変わらないか確認した。
セッションに保存されたinputデータが不具合に関与していると思ったから。
補足情報(FW/ツールのバージョンなど)
MAMP MacOS
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/05/12 10:58
2022/05/12 11:09
2022/05/12 12:55