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

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

#今回行う実装

今回行う実装は、名前が空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
<?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メソッドなどもありますので、バリデーションについてもっと学びを深めていこうと思います！