#新規登録機能
処理フロー
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; } }
}
}
}