
PHPでバリデーションを共通化してまとめたいです。
具体的には下記のコードを
php
1// 名前の未入力チェック 2 if (empty($name)) { 3 $errors[] = "名前を入力してください。"; 4 } 5 6 // メールアドレスの未入力チェック 7 if (empty($email)) { 8 $errors[] = "メールアドレスを入力してください。"; 9 } 10 11 // パスワードの未入力チェック 12 if (empty($password)) { 13 $errors[] = "パスワードを入力してください。"; 14 } 15 16 // 電話番号の未入力チェック 17 if (empty($tel)) { 18 $errors[] = "電話番号を入力してください。"; 19 } 20 21 // 都道府県の未入力チェック 22 if ($prefectures == "選択") { 23 $errors[] = "都道府県を選択してください。"; 24 } 25 26 // 27 // 文字数チェック 28 // 29 30 // 名前の文字数チェック 31 if (strlen($name) >= 60) { 32 $errors[] = "氏名が長すぎます。"; 33 } 34 35 // パスワード文字数チェック(8文字以上か) 36 if (preg_match("/^[a-zA-Z1-9]{1,7}$/", $password)) { 37 $errors[] = "パスワードは8文字以上で入力してください。"; 38 } 39 40 // 電話番号の文字数チェック(10文字 or 11文字) 41 if (strlen($tel) >= 1 && strlen($tel) <= 9 && preg_match("/^[0-9]+$/", $tel)) { 42 $errors[] = "電話番号は10文字か11文字で入力してください。"; 43 } elseif (strlen($tel) >= 12 && preg_match("/^[0-9]+$/", $tel)) { 44 $errors[] = "電話番号は10文字か11文字で入力してください。"; 45 } 46 47 // 48 // 形式チェック 49 // 50 51 // メールアドレス形式チェック 52 if (!preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9._-]+)+$/", $email) && $email !== "") { 53 $errors[] = "メールアドレスに間違いがあります。"; 54 } 55 56 // 電話番号の形式チェック 57 if (preg_match("/[-]+/", $tel)) { 58 $errors[] = "電話番号はハイフンなしで入力してください。"; 59 } 60 61 // 電話番号の半角チェック 62 if (preg_match("/[a-zA-Z]/", $tel) && $tel !== "") { 63 $errors[] = "電話番号は半角数字で入力してください。"; 64 } 65 66 67 68 if (count($errors) >= 1) { 69 $_SESSION['errors'] = $errors; 70 71 header("location: registration_form.php"); 72 exit; 73 74 } else { 75 76 $errors = array(); 77 78 }
下記のようにまとめてみました。
まとめたやつは
php
1require_once('./validation.php'); 2name_validation();
みたいに使っていこうと思っています。
ですが、1個1個メソッドを作るのがとてもめんどうなのですが、
1つ1つメソッドを作る以外に、もっとまとめられる方法はありますか?
validation.php
php
1<?php 2require_once('../config/config.php'); 3 4 5 function name_validation() { 6 7 // 名前の未入力チェック 8 if (empty($_SESSION['name'])) { 9 $errors[] = "名前を入力してください。"; 10 } 11 12 } 13 14 function email_validation() { 15 16 // メールアドレスの未入力チェック 17 if (empty($_SESSION['email'])) { 18 $errors[] = "メールアドレスを入力してください。"; 19 } 20 21 } 22 23 function password_validation() { 24 25 // パスワードの未入力チェック 26 if (empty($_SESSION['password'])) { 27 $errors[] = "パスワードを入力してください。"; 28 } 29 30 } 31 32 function tel_validation() { 33 34 // 電話番号の未入力チェック 35 if (empty($_SESSION['tel'])) { 36 $errors[] = "電話番号を入力してください。"; 37 } 38 39 } 40 41 function prefectures_validation() { 42 43 // 都道府県の未入力チェック 44 if ($_SESSION["prefectures"] == "選択") { 45 $errors[] = "都道府県を選択してください。"; 46 } 47 48 } 49 50 51 52 // 53 // 文字数チェック 54 // 55 56 function name_length_validation() { 57 58 // 名前の文字数チェック 59 if (strlen($_SESSION['name']) >= 60) { 60 $errors[] = "氏名が長すぎます。"; 61 } 62 63 } 64 65 function password_length_validation() { 66 67 // パスワード文字数チェック(8文字以上か) 68 if (preg_match("/^[a-zA-Z1-9]{1,7}$/", $_SESSION['password'])) { 69 $errors[] = "パスワードは8文字以上で入力してください。"; 70 } 71 72 } 73 74 function tel_length_validation() { 75 76 // 電話番号の文字数チェック(10文字 or 11文字) 77 if (strlen($_SESSION['tel']) >= 1 && strlen($_SESSION['tel']) <= 9 && preg_match("/^[0-9]+$/", $_SESSION['tel'])) { 78 $errors[] = "電話番号は10文字か11文字で入力してください。"; 79 } elseif (strlen($_SESSION['tel']) >= 12 && preg_match("/^[0-9]+$/", $_SESSION['tel'])) { 80 $errors[] = "電話番号は10文字か11文字で入力してください。"; 81 } 82 83 } 84 85 86 // 87 // 形式チェック 88 // 89 90 function email_format_validation() { 91 92 // メールアドレス形式チェック 93 if (!preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9._-]+)+$/", $_SESSION['email']) && $_SESSION['email'] !== "") { 94 $errors[] = "メールアドレスに間違いがあります。"; 95 } 96 97 } 98 99 function tel_format_validation() { 100 101 // 電話番号の形式チェック 102 if (preg_match("/[-]+/", $_SESSION['tel'])) { 103 $errors[] = "電話番号はハイフンなしで入力してください。"; 104 } 105 106 } 107 108 function te_halfSize_validation() { 109 110 // 電話番号の半角チェック 111 if (preg_match("/[a-zA-Z]/", $_SESSION['tel']) && $_SESSION['tel'] !== "") { 112 $errors[] = "電話番号は半角数字で入力してください。"; 113 } 114 115 } 116 117
validation.php
<?php require_once('../config/config.php'); // バリデーションクラス class Validation { // コンストラクタ(construct) function check_Validation($input_control = [], $input_data = []) { $result = []; //チェック結果配列 foreach ($input_control as $control_name => $info) { // 入力情報が存在するか if (array_key_exists($control_name, $input_data)) { $value = $input_data[$control_name]; $rules = explode("|", $info["rule"]); // バリデーションルールの引き出し foreach ($rules as $r) { // 指定されたルールをループ $rule = explode("-", $r); // ルール設定の切り出し $rule_name = $rule[0]; // ルール名 $rule_setting = $rule[1]; // ルール設定 switch ($rule_name) { // 入力が空の場合 case "empty": if ($this->empty_check($value)) { $result[$control_name][] = $info["name"].'を入力してください。'; } break; // 最大文字数のチェック case "max": if ($this->max_check($value, $rule_setting)) { $result[$control_name][] = $info["name"].'は'.$rule_setting.'文字以内で入力してください。'; } break; } } } } return $result; } // 空のチェック public function empty_check($value = "") { return empty($value); } // 入力文字数のチェック public function max_check($value = "", $max = 60) { return mb_strlen($value) > $max; } }
registration_confirm.php 一部抜粋
// POST時 if (filter_input(INPUT_SERVER, 'REQUEST_METHOD') == 'POST') { $_SESSION["name"] = filter_input(INPUT_POST, 'name'); $_SESSION["email"] = filter_input(INPUT_POST, 'email'); $_SESSION["password"] = filter_input(INPUT_POST, 'password'); $_SESSION["tel"] = filter_input(INPUT_POST, 'tel'); $_SESSION["prefectures"] = filter_input(INPUT_POST, 'prefectures'); $_SESSION["hobby"] = filter_input(INPUT_POST, 'hobby', FILTER_DEFAULT,FILTER_REQUIRE_ARRAY); $_SESSION["gender"] = filter_input(INPUT_POST, 'gender'); $_SESSION["contact"] = filter_input(INPUT_POST, 'contact'); $name = $_SESSION["name"]; $email = $_SESSION["email"]; $password = $_SESSION["password"]; $tel = $_SESSION["tel"]; $prefectures = $_SESSION["prefectures"]; $hobby = $_SESSION["hobby"]; $gender = $_SESSION["gender"]; $contact = $_SESSION["contact"]; // 対象コントロール→バリデーションルール $input_control = [ "name" => [ "name" => "氏名", "rule" => "empty|max-60" ], "tel" => [ "name" => "電話番号", "rule" => "empty|min-10|-|halfSize" ], "password" => [ "name" => "パスワード", "rule" => "empty|min-8" ], //・・・・以下、対象の入力項目とルールを定義 ]; $result = new Validation($input_control, $_SESSION); if (count($result) > 0) { $_SESSION['result'] = $result; header("location: registration_form.php"); } else { $result = array(); } } // // Twig // // Composerで作成されたautoload.phpを読み込む require_once ('../vendor/autoload.php'); // Twig_Loader_Filesystem と Twig instance の生成を読み込む require_once('../config/twig.php'); // render echo $twig->render('registration_confirm.html', array ( 'name' => $name, 'email' => $email, 'password' => $password, 'tel' => $tel, 'prefectures' => $prefectures, 'hobby' => $hobby, 'gender' => $gender, 'contact' => $contact, 'result' => $result, 'string' => $string, ) );
・registaration_form.php (登録フォーム) 一部抜粋
上の確認フォームからエラーメッセージをリダイレクトで受け取っています。
順番は registration_form.php → registration_confirm.php
registration_confirm.php でエラーがあれば registration_form.php にリダイレクト
// エラーメッセージ if (isset($_SESSION['result'])) { if (count(array($_SESSION['result'])) >= 1) { $result = $_SESSION['result']; } }

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。