あーる学習帳

自分が勉強したことや気になることなど、99%自分用です。コードを書いてるのでPCから閲覧を推奨。

PHPまとめ③:会員登録の仕組みを作る

第13章-03

今回編集するのは以下の3ファイル。

f:id:R_de_aru:20180708181807p:plain

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とかに変更できないんだろうか…。