PHPまとめ③:会員登録の仕組みを作る
第13章-03
今回編集するのは以下の3ファイル。
singup.php
- POSTデータを取得し、バリデーション、登録までを行う
signup_view.php
- 会員登録画面。入力値のエラーも出力する
db_helper.php
メールアドレスのバリデーションやデータ挿入機能を作る
「メールアドレスは重複させない」「パスワードは暗号化する」の2つを必ず守ること。
まずはコントローラであるsignup.phpを作成する。
// signup.php
<?php
//必要ファイル読み込み
require_once('config.php');
require_once('./helper/db_helper.php');
require_once('./helper/extra_helper.php');if($_SERVER['REQUEST_METHOD']==='POST'){
$name=get_post('name');
$email=get_post('email');
$password=get_post('password');$dbh=get_db_connection(); //データベース接続
$errs=array();//入力値バリデーション
//エラーがなければデータ挿入
}include_once('./views/signup_view.php'); //ビューファイル読み込み
必要ファイルを先に読み込むことで、それ以降定数や関数が使用できるようになる。
次に入力フォームを作る。デザインは極力排除する。
//signup_view.php
<html>
<head>
<meta charset="UTF-8">
<title>新規ユーザー登録</title>
</head>
<body>
<h1>新規ユーザー登録</h1>
<form action="signup.php" method="POST">
<p>お名前:<input type="text" name="name"><?php echo $errs['name']; ?></p>
<p>メールアドレス:<input type="text" name="email"><?php echo $errs['email']; ?></p>
<p>パスワード:<input type="password" name="password"><?php echo $errs['password']; ?></p>
<input type="submit" value="登録する">
</form>
</body>
</html>
メールアドレスの重複を調べる関数をextra_helper.phpに作成する。
まず、入力するメールアドレスが何件存在しているかを調べる。取得する値は0か1なので、カウント後の値が0より大きければtrueを返すようにする。
//db_helper.php
<?php
//中略
function email_exists($dbh,$email){
$sql="select count(id) from members where email=:email";
$stmt=$dbh->prepare($sql);
$stmt->bindvalue(':email',$email,PDO::PARAM_STR);
$stmt->execute();
$count=$stmt->fetch(PDO::FETCH_ASSOC); //結果を配列で取得
if($count['count(id)']>0){ //件数を取得
return true;
}else{
return false;
}
}
count(id)を取得する。PDOでは$stmt->rowCount()というコードを使うことで行数を取得できるが、これはすべてのデータベースで動作が保証されない。
次に、入力データを挿入するための関数を作る。データベースへの挿入前にパスワードは暗号化しなければならない。
//db_helper.php
<?php
//中略
function insert_member_data($dbh,$name,$email,$password){
$password=password_hash($password,PASSWORD_DRFAULT); //パスワード暗号化
$data=data('Y-m-d H:i:s');
$sql="insert into members (name,email,password,created) values (:name,;email,:password,'{$data}')";
$stmt->bindvalue(':name',$name,PDO::PARAM_STR);
$stmt->bindvalue(':email',$email,PDO::PARAM_STR);
$stmt->bindvalue(':password',$password,PDO::PARAM_STR);
if($stmt->execute()){
return true;
}else{
return false;
}
}
password_hash()はPHPで用意された暗号化用の組み込み関数である。password_verify()を使えば、暗号化後のパスワードと入力したパスワードが一致するか確認できる。
入力値を検証するコードをsignup.phpに加える。
//signup.php
<?php
//中略
//入力値バリデーション
if(!check_words($name,50)){
$errs['name']='お名前欄は必ず50文字以内で入力してください(必須項目)。';
}
if(!filter_var($email,FILTER_VARIDATE_EMAIL)){
$errs['email']='メールアドレスの形式が正しくありません。';
}elseif(email_exists($dbh,$email)){
$errs['email']='このメールアドレスは既に登録されています。';
}elseif(!check_words($email,100)){
$errs['email']='メールアドレスは100文字以内で入力してください(必須項目)。'
}
if(!check_words($password,50)){
$errs['password']='パスワードは50文字以内で入力してください(必須項目)。'
}
エラー文はinputごとに別々に表示する。$errsにキー名を設定し、エラーがあった場合に代入する。filter_var($email,FILTER_VARIDATE_EMAIL)は組み込み関数で、メールアドレスの形式に一致しなかった場合にfalseが返ってくる。
最後に、データ挿入コードを追加する。
//signup.php
<?php
//中略
//エラーがなければデータ挿入
if(empty($errs)){
if(insert_member_data($dbh,$name,$email,$password)){ //データ挿入
header('Location:'.SITE_URL.'login.php'); //ログイン画面へ移動
exit();
}
$errs['password']='登録に失敗しました。';
}
自作した関数を使ってデータを挿入する。このまま同じ画面には留まらせず、ログイン画面に遷移するようにする。
signup.phpをindex.phpへ名前変更してテスト。というか、必ずindex.phpを開こうとするけどmain.phpとかsignup.phpとかに変更できないんだろうか…。