例えば、希望するアカウント名(半角英数字)を5つ入力してください…といった場合に配列を使って入力内容をチェックするプログラムをメモしました。
要件
要件は以下です。
・入力フィールドは5つ
・入力フィールドの変数名はnum1〜num5
・いずれかに入力が必須
・重複した内容はエラー
・半角英数字以外はエラー
この場合、num1〜num5を一つづつ中身を確認するのもいいですが、数が増えれば結構面倒臭い…ので配列を使ってシンプルに実行してみます。
プログラム
form.php
<p><input name="num[]" type="text" maxlength="30" value="<?php echo htmlspecialchars(isset($_POST['num'][0]) ? $_POST['num'][0] : '', ENT_QUOTES); ?>"></p> <p><input name="num[]" type="text" maxlength="30" value="<?php echo htmlspecialchars(isset($_POST['num'][1]) ? $_POST['num'][1] : '', ENT_QUOTES); ?>"></p> <p><input name="num[]" type="text" maxlength="30" value="<?php echo htmlspecialchars(isset($_POST['num'][2]) ? $_POST['num'][2] : '', ENT_QUOTES); ?>"></p> <p><input name="num[]" type="text" maxlength="30" value="<?php echo htmlspecialchars(isset($_POST['num'][3]) ? $_POST['num'][3] : '', ENT_QUOTES); ?>"></p> <p><input name="num[]" type="text" maxlength="30" value="<?php echo htmlspecialchars(isset($_POST['num'][4]) ? $_POST['num'][4] : '', ENT_QUOTES); ?>"></p>
変数を$_POST[‘num’][0]〜$_POST[‘num’][5]とします。
check.phpで情報を受け取り内容をチェックします。
check.php
if ($_SERVER['REQUEST_METHOD'] === 'POST') { $nums = $_POST['num']; $num_err = ''; $num_err_flag = 0; $non_empty_count = 0; foreach ($nums as $num) { if (!empty($num)) { $non_empty_count++; } } if ($non_empty_count == 0) { $num_err = "<p>いずれかに入力してください</p>"; } if (empty($num_err)) { $filtered_nums = array_filter($nums); // 空の値を取り除く if (count($filtered_nums) !== count(array_unique($filtered_nums))) { $num_err = "<p>入力情報が重複しています</p>"; } } if (empty($num_err)) { foreach ($filtered_nums as $num) { if (!preg_match('/^[a-zA-Z0-9]+$/', $num)) { $num_err = "<p>半角英数字で入力してください</p>"; break; } } } //メッセージ処理 if (empty($num_err)) { $num_ok = []; foreach ($nums as $num) { if (!empty($num)) { $num_ok[] = "<p>" . htmlspecialchars($num, ENT_QUOTES) . "</p>"; } } $num_ok = implode("", $num_ok); } else { $num_err_flag = 1; } } //出力 if ($num_err_flag == 1) { echo <<<EOF $num_err <p><input name="num[]" type="text" size="20" maxlength="30" style="ime-mode:inactive;" value=" EOF; echo htmlspecialchars(isset($_POST['num'][0]) ? $_POST['num'][0] : '', ENT_QUOTES); echo <<<EOF "></p> <p><input name="num[]" type="text" size="20" maxlength="30" style="ime-mode:inactive;" value=" EOF; echo htmlspecialchars(isset($_POST['num'][1]) ? $_POST['num'][1] : '', ENT_QUOTES); echo <<<EOF "></p> <p><input name="num[]" type="text" size="20" maxlength="30" style="ime-mode:inactive;" value=" EOF; echo htmlspecialchars(isset($_POST['num'][2]) ? $_POST['num'][2] : '', ENT_QUOTES); echo <<<EOF "></p> <p><input name="num[]" type="text" size="20" maxlength="30" style="ime-mode:inactive;" value=" EOF; echo htmlspecialchars(isset($_POST['num'][3]) ? $_POST['num'][3] : '', ENT_QUOTES); echo <<<EOF "></p> <p><input name="num[]" type="text" size="20" maxlength="30" style="ime-mode:inactive;" value=" EOF; echo htmlspecialchars(isset($_POST['num'][4]) ? $_POST['num'][4] : '', ENT_QUOTES); echo <<<EOF "></p> EOF; } else { echo <<<EOF $num_ok EOF; }
全てが空かどうかをチェック
foreach ($nums as $num) { if (!empty($num)) { $non_empty_count++; } } if ($non_empty_count == 0) { $num_err = "<p>いずれかに入力してください</p>"; }
重複した情報を入力してないかチェック
if (empty($num_err)) { $filtered_nums = array_filter($nums); if (count($filtered_nums) !== count(array_unique($filtered_nums))) { $num_err = "<p>入力情報が重複しています</p>"; } }
半角英数字で入力しているかチェック
if (empty($num_err)) { foreach ($filtered_nums as $num) { if (!preg_match('/^[a-zA-Z0-9]+$/', $num)) { $num_err = "<p>半角英数字で入力してください</p>"; break; } } }
上記のチェックをした上で出力となります。
以上です。
エスケープについてはもっとシンプルなやり方ありますが、今回はメモと言うことでご容赦ください。