フォーム~入力データのチェック~

PHPのシンタックス

  1. HOME
  2. フォーム~データチェック~

値が入っているかどうかチェック


入力フォーム

<form method="POST" action="nameCheck.php">
  <ul class="nolist">
    <li><label>名前:<input type="text" name="name"></label></li>
    <li><input type="submit" value="送信する"></li>
  </ul>
</form>

入力フォームに値が入っているかどうかで分岐する

<?php
function es($data)
//xss 対策のための HTML エスケープ
{
  if (is_array($data)) { //$dataが配列の時
    return array_map(__METHOD__, $data); //値を1つずつ引数にして、再帰呼び出し
  } else {
    return htmlspecialchars($data, ENT_QUOTES, "UTF-8");
  }
}

//配列の文字エンコードのチェック
function checkEn(array $data)
{
  $result = true;
  foreach ($data as $key => $value) {
    if (is_array($value)) { //含まれている値が配列のとき文字列に連結
      $value = implode("", $value);
    }
    if (!mb_check_encoding($value)) { //文字コードが一致しないときfalce代入し繰り返しをブレイク
      $result = false;
      break;
    }
  }
  return $result;
}

<?php
require_once("es.php");
if (!checkEn($_POST)) { //文字エンコードの検証
  $encoding = mb_internal_encoding(); //PHPが使うエンコードを調べる
  $err = "Encoding Error! The espected encoding is" . $encoding;
  exit($err); //エラーメッセージを出してコードのキャンセルする
}
$_POST = es($_POST); //HTMLエスケープ(xss対策)
?>

<?php
$isError = false; //エラーフラグ
if (isset($_POST['name'])) { //名前を取り出す
  $name = trim($_POST['name']);
  if ($name === "") { //空白のときエラー
    $isError = true;
  }
} else { //未設定のときエラー
  $isError = true;
}
?>

<?php if ($isError) : ?>
  <!-- エラーがあったとき -->
  <span class="error">名前を入力してください。</span>
  <form method="POST" action="formDetaCheck.php">
    <input type="submit" value="戻る">
  </form>
<?php else : ?>
  <!-- エラーがなかったとき -->
  <span>こんにちは、<?php echo $name; ?>さん。</span>
<?php endif; ?>

  • exit()とdie()は同じ機能です。どちらも引数を与えたメッセージを出力した後に、続くコードの実行を全てキャンセルします。コードの実行を突然終えるexit()は多用すべきではない。
  • isset()で$_POST['name']に値が設定されているかどうかをチェック。空白が入っている場合があるので、trim()を使って値の前後の空白を取り除いた後でチェックする
  • 制御構造の別の構文
    if:else:endif;だけでなく、switch:case:endswitch;、foreach:endforeach;、for:endfor;、while:endwhile;のように同様の構文がある

    入力された値が数値かどうか、0ではないかチェック

    入力ホーム

    <form method="POST" action="warikan.php">
      <ul class="nolist">
        <li><label>合計金額:<input type="number" name="goukei"></label></li>
        <li><label> 人数 :<input type="number" name="ninzu"></label></li>
        <li><input type="submit" value="割り勘する"></li>
      </ul>
    </form>
    

    入力フォームに値が計算できる数値かどうかで分岐

    <?php
    require_once("es.php");
    if (!checkEn($_POST)) {
      $encoding = mb_internal_encoding();
      $err = "Encoding Error! The espected encoding is" . $encoding;
      exit($err); //エラーメッセージを出してコードのキャンセルする
    }
    $_POST = es($_POST); //HTMLエスケープ(xss対策)
    ?>
    
    <?php
    $errors = []; //エラーメッセージを入れる配列の初期化
    ?>
    
    <?php
    //合計金額チェック
    if (isset($_POST['goukei'])) {
      $goukei = $_POST['goukei'];
      if (!ctype_digit($goukei)) { //関数の引数に指定された文字列に数字だけが含まれているかどうか
        $errors[] = "整数で金額を入力してください!";
      }
    } else { //未設定のエラー
      $errors[] = "合計の金額を設定してください!\(-.-)/";
    }
    
    //人数チェック
    if (isset($_POST['ninzu'])) {
      $ninzu = $_POST['ninzu'];
      if (!ctype_digit($ninzu)) {
        $errors[] = "人数を入力してください!";
      } else if ($ninzu == 0) {
        $errors[] = "0人では割り勘できません。";
      }
    } else { //未設定のエラー
      $errors[] = "人数が設定されていません!\(-.-)/";
    }
    ?>
    
    <?php
    if (count($errors) > 0) { //配列$errorsの値が1個でもある場合
      echo '<ol class = "error">';
      foreach ($errors as $value) { //エラー内容をリスト表示
        echo "<li>", $value, "</li>";
      }
      echo "</ol>";
    ?>
    
      <!-- 戻るボタン -->
      <form method="POST" action="formDetaCheck.php#warikan">
        <ul class="nolist">
          <li><input type="submit" value="戻る"></li>
        </ul>
      </form>
    
    <?php
    } else { //エラーがなかった時の処理
      $amari = $goukei % $ninzu;
      $price = ($goukei - $amari) / $ninzu;
    
      $goukei_fm = number_format($goukei); //3桁区切り
      $price_fm = number_format($price);
    
      echo "{$goukei_fm}円を{$ninzu}人で割り勘します。", "<br>";
      echo "1人当たり{$price_fm}円のお支払いで、不足分は{$amari}円です。";
    }
    ?>
    

    数値かどうかのチェック

    フォームからの入力は文字列になるので、ctype_digit()〖0以上の整数〗または is_numeric()〖+-の符号を含んだ数字〗を使って判定します。
    ※is_float()やis_int()はそのままでは使えません。

    正規表現を使って郵便番号のチェック

    入力フォーム

    <form method="POST" action="postCheck.php">
      <ul class="nolist">
        <li><label>郵便番号:<input type="text" name="postno"></label></li>
        <li><input type="submit" value="送信する"></li>
      </ul>
    </form>
    

    郵便番号のフォーム

    <?php
    require_once("es.php");
    if (!checkEn($_POST)) {
      $encoding = mb_internal_encoding();
      $err = "Encoding Error! The espected encoding is" . $encoding;
      exit($err); //エラーメッセージを出してコードのキャンセルする
    }
    $_POST = es($_POST); //HTMLエスケープ(xss対策)
    ?>
    
    <?php
    $errors = [];
    if (isset($_POST['postno'])) {
      $postno = trim($_POST['postno']);
      $pattern = "/^[0-9]{3}-[0-9]{4}$/";
      if (!preg_match($pattern, $postno)) { //郵便番号の形式じゃない
        $errors[] = "郵便番号を正しく入力してください。";
      }
    } else { //未設定エラー
      $errors[] = "郵便番号の入力をお願いします。";
    }
    ?>
    
    <?php
    if (count($errors) > 0) { //エラーがあったら
      echo '<ol class = "error">';
      foreach ($errors as $value) {
        echo "<li>", $value, "</li>";
      }
      echo "</ol>";
    } else { //エラーがないとき
      echo "郵便番号は{$postno}です。";
    }
    ?>
    
    <!-- 戻るボタン -->
    <form method="POST" action="formDetaCheck.php#postNo">
      <ul class="nolist">
        <li><input type="submit" value="戻る"></li>
      </ul>
    </form>