0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[PHP]名前入力フォームにバリデーションをかける

Posted at

#はじめに
今回は入力フォームにバリデーションをかけて、エラーメッセージを表示させる方法を簡単にまとめてみます。
かなりざっくりですのであらかじめご了承ください

#今回行う実装

今回行う実装は、名前が空or21文字以上入力された場合にエラーメッセージを表示させていきます。

バリデーションに関する関数は以下です。

validation.php

<?php
function validation($request){//$?POST連想配列
  $errors=[];

  if (empty($request['your_name']) || 20 < mb_strlen($request['your_name'])){
      $errors[]='氏名は必須です、20文字以内で入力してください';
      return $errors;
  }
}
?>

この関数はとても単純です。
if文によって、引数の文字列が空あるいは21文字以上だった場合に、エラー文配列に、エラー文を格納してそのエラー文配列を返します。

エラー文配列はindex.phpの11行目で定義しています。

index.php
<?php
  session_start();
  require "validation.php";
  header('X-FRAME-OPTIONS:DENY');

  function h($str){
    return htmlspecialchars($str,ENT_QUOTES,'UTF-8');
  }

  $pageFlag=0;
  $errors=validation($_POST); //ここでエラー文配列を作成している!!!

  if(!empty($_POST['btn_confirm']) && empty($errors)){
    $pageFlag=1;
  }
  if(!empty($_POST['btn_submit'])){
    $pageFlag=2;
  }
?>


<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
<?php if($pageFlag===0):?>
<?php 
  if(!isset($_SESSION['csrfToken'])){
    $csrfToken=bin2hex(random_bytes(32));  
    $_SESSION['csrfToken']=$csrfToken;
  }
  $token=$_SESSION['csrfToken'];
?>

<?php if(!empty($errors) && !empty($_POST['btn_conform'])) : ?>
 <?php echo '<ul>' ;?>
   <?php 
    foreach($errors as $error){
      echo '<li>' . $error . '</li>' ;
    }
   ?>
 <?php echo '</ul>';?>
<?php endif;?>
  <form method="POST" action="index.php">
  名前
  <input type="text" name="your_name" value="<?php if(!empty($_POST['your_name'])){echo h($_POST['your_name']);}?>">
  <br>
  メールアドレス
  <input type="email" name="email" value="<?php if(!empty($_POST['email'])){echo h($_POST['email']);}?>">
  <br>
  <input type="hidden" name=csrf value="<?php echo $token;?>">
  <input type="submit" name="btn_confirm" value="確認する">
  </form>
<?php endif; ?>

<?php if($pageFlag===1) :?>
  <?php if($_POST['csrf']===$_SESSION['csrfToken']) :?>
    <form method="POST" action="index.php">
      名前
      <?php echo h($_POST['your_name']);?>
      <br>
      メールアドレス
      <?php echo h($_POST['email']);?>
      <br>
      <input type="submit" name="btn_submit"  value="送信する">
      <input type="submit" name="back" value="戻る  ">
      <input type="hidden" name="your_name"   value="<?php echo h($_POST['your_name']);?>">
      <input type="hidden" name="email" value="<?php echo h($_POST['email']);?>">
      <input type="hidden" name="csrf" value="<?php echo h($_POST['csrf']);?>">
      </form>
    <?php endif; ?>
<?php endif; ?>

<?php if($pageFlag===2):?>
  <?php if($_POST['csrf']===$_SESSION['csrfToken']) :?>
    送信が完了しました
    <?php unset($_SESSION['csrfToken']);?>
  <?php endif;?>
<?php endif;?>
</body>
</html>

また、エラー文の表示については以下の部分で表現しています。

<?php if(!empty($errors) && !empty($_POST['btn_conform'])) : ?>
 <?php echo '<ul>' ;?>
   <?php 
    foreach($errors as $error){
      echo '<li>' . $error . '</li>' ;
    }
   ?>
 <?php echo '</ul>';?>
<?php endif;?>

今回は、あくまで名前入力のみでしたが実際はもっとたくさんのフォームに対してバリデーションをかけることから、リストでの表示をしています。

#おわりに
以上、かなり簡単にバリデーションについてまとめました。
他にも、filter_varメソッドなどもありますので、バリデーションについてもっと学びを深めていこうと思います!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?