LoginSignup
1
3

More than 3 years have passed since last update.

新規登録機能

Posted at

新規登録機能

処理フロー

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

HTML

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

<!-- メニュー -->
<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">※英数字6文字以上</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;
    }
  }
}

}
}

1
3
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
1
3