新規登録機能

#新規登録機能

処理フロー

POST送信
　↓
バリデーションチェック
　↓　　＊メールを重複してないかもチェック
DB接続
　↓　　＊SQL文：INSERT　INTOでレコードに遷移
任意のページへ遷移
　　　　＊header関数使用

##HTML

- post送信されるようにmethodにpostを入れる。
- inputのname属性に任意の名前を入れる。
- 直下にdivでエラーメッセージエリアを作成
- DB接続エラー用のメッセージエリアを用意


<body class="page-signup page-1colum">

    <!-- メニュー -->
    <header>
      新規登録
    </header>

    <!-- メインコンテンツ -->
    <div id="contents" class="site-width">

      <!-- Main -->
      <section id="main" >

        <div class="form-container">

          <form action="" method="post" class="form">
            <h2 class="title">ユーザー登録</h2>
            <div class="area-msg">
              <?php
              if(!empty($err_msg['common'])) echo $err_msg['common'];
              ?>
            </div>
            <label class="<?php if(!empty($err_msg['email'])) echo 'err'; ?>">
              Email
              <input type="text" name="email" value="<?php if(!empty($_POST['email'])) echo $_POST['email']; ?>">
            </label>
            <div class="area-msg">
              <?php
              if(!empty($err_msg['email'])) echo $err_msg['email'];
              ?>
            </div>
            <label class="<?php if(!empty($err_msg['pass'])) echo 'err'; ?>">
              パスワード <span style="font-size:12px">※英数字６文字以上</span>
              <input type="password" name="pass" value="<?php if(!empty($_POST['pass'])) echo $_POST['pass']; ?>">
            </label>
            <div class="area-msg">
              <?php
              if(!empty($err_msg['pass'])) echo $err_msg['pass'];
              ?>
            </div>
            <label class="<?php if(!empty($err_msg['pass_re'])) echo 'err'; ?>">
              パスワード（再入力）
              <input type="password" name="pass_re" value="<?php if(!empty($_POST['pass_re'])) echo $_POST['pass_re']; ?>">
            </label>
            <div class="area-msg">
              <?php
              if(!empty($err_msg['pass_re'])) echo $err_msg['pass_re'];
              ?>
            </div>
            <div class="btn-container">
              <input type="submit" class="btn btn-mid" value="登録する">
            </div>
          </form>
        </div>

      </section>

    </div>

##PHP
###関数
 ini_set関数でログを取る
ini_set

エラーメッセージ定数を作成　
define

エラーメッセージ用の変数に空の配列を入れる
変数　= array();

各バリデーション関数の作成
未入力
形式
文字数　max min
同値
半角英数字

DB接続
SQL実行    
    
    <?php
     //ログ
    ini_set('log_errors','On');

    ini_set('error_log','php.log');

    //エラーメッセージ用定数
    define('MSG01','入力必須です。');
    define('MSG02','Emailの形式ではありません。');
    define('MSG03','255文字以内で入力してください。');
    define('MSG04','6文字以内で入力してください。');
    define('MSG05','パスワードと際入力が同じではありません。');
    define('MSG06','半角英数字で入力してください。');
    define('MSG07','エラーが発生しました。しばらく経ってからやり直してください。');
    define('MSG08','そのEmailアドレスはすでに使われています。');

    //エラーメッセージ用変数
    //空の変数を用意
    $err_msg =array();

    // バリデーション関数

    function validRequired($str,$key){
      if(empty($str)){
        global $err_msg;
        $err_msg[$key] = MSG01;
      }
    }
    function validEmail($str,$key){
      if(!preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA- 
      Z0-9\._-]+)+$/", $str)){
         global $err_msg;
        $err_msg[$key] = MSG02;
      }
    }
    function validEmailDup($email){
        global $err_msg;

      try{
        $dbh = dbConnect();
        $sql = 'SELECT count(*) FROM users WHERE email = :email';
        $data = array(':email' => $email);

        $stmt = queryPost($dbh, $sql, $data);

        $result = $stmt->fetch(PDO::FETCH_ASSOC);

        if(!empty(array_shift($result))){
          $err_msg['email'] = MSG08;
        }
          }catch (Execption $e){
            error_log('エラー発生：'.$e->getMessage());
          $err_msg['common'] = MSG07;
          }
    }

    function validMaxlen($str,$key,$max = 256){
      if(mb_strlen($str) > $max){
        global $err_msg;
        $err_msg[$key] = MSG03;
      }
    }
    function validMinlen($str,$key,$min = 6){
      if(mb_strlen($str) > $min){
        global $err_msg;
        $err_msg[$key] = MSG04;
      }
    }
    function validMatch($str1,$str2,$key){
      if($str1 !== $str2){
        global $err_msg;
        $err_msg[$key] = MSG05;
      }
    }
    function validHalf($str,$key){
      if(!preg_match("/^[a-zA-Z0-9]+$/", $key)){
        global $err_msg;
        $err_msg[$key] = MSG06;
      }
    }

    //DB接続関数
    function dbConnect(){
      $dsn = 'mysql:dbname=freemarket;host:localhost;charset=utf8';
      $name = 'root';
      $passward = 'root';
      $options = array(
        PDO::ATTR_ERRMODE => PDO::ERRMODE_SILENT,
        // デフォルトフェッチモードを連想配列形式に設定
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        // バッファードクエリを使う(一度に結果セットをすべて取得し、サーバー負荷を軽減)
        // SELECTで得た結果に対してもrowCountメソッドを使えるようにする
        PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
      );
      $dbh = new PDO($dsn, $name, $passward, $options);
      return $dbh;
    }
    //SQL実行関数
    function queryPost($dbh, $sql, $data){

     $stmt = $dbh->prepare($sql);

      $stmt->execute($data);
      return $stmt;
    }

###実行

- emptyでpost送信のチェック
- post送信されていたらバリデーションチェック
- emptyで$err_msgに値が入っていなければtry,catchでDB接続、SQL実行INSERT　INTOでテーブルに遷移
- $err_msgをバリデーション間で入れるのはメッセージの上書き防止（未入力なのにEmailエラーがでる）

   if(!empty($_POST)){


      //変数にユーザー情報を代入
      $email = $_POST['email'];
      $pass  = $_POST['pass'];
      $pass_re = $_POST['pass_re'];

     validRequired($email,'email');
     validRequired($pass,'pass');
     validRequired($pass_re,'pass_re');

     if(empty($err_msg)){
     //emailの形式チェック
     validEmail($email, 'email');
     //emailの最大文字数チェック
     validMaxLen($email, 'email');
     //email重複チェック
     validEmailDup($email);

    //パスワードの半角英数字チェック
    validHalf($pass, 'pass');
    //パスワードの最大文字数チェック
    validMaxLen($pass, 'pass');
    //パスワードの最小文字数チェック
    validMinLen($pass, 'pass');

    //パスワード（再入力）の最大文字数チェック
    validMaxLen($pass_re, 'pass_re');
    //パスワード（再入力）の最小文字数チェック
    validMinLen($pass_re, 'pass_re');

    if(empty($err_msg)){

      validMatch($pass,$pass_re,'pass_re');

      if(empty($err_msg)){

        try{

          $dbh = dbConnect();
          $sql = 'INSERT INTO users (email,password,login_time,create_date) VALUES(:email,:pass,:login_time,:create_date)';
          $data = array(':email' => $email,':pass' => password_hash($pass,PASSWORD_DEFAULT),
                        ':login_time' => date('Y-m-d H:i:s'),
                        ':create_date' => date('Y-m-d H:i:s'));

           queryPost($dbh,$sql,$data);

          header("location:mypage.html");

        }catch (Exception $e){
          error_log('エラー発生：' .$e->getMessage());
          $err_msg['common'] = MSG07;
        }
      }
    }
  }
}