phpで会員登録、ログイン機能の実装2

前回
marino.hatenadiary.jp
の続きです。

引き続きphpで会員登録、ログイン機能の実装をしていきましょう。

参考本

よくわかるPHPの教科書 【PHP5.5対応版】

よくわかるPHPの教科書 【PHP5.5対応版】



前回は会員登録の各画面と入力内容の表示、確認まで行いました。
この続きで今回は確認して登録ボタンを押したらデータベースへ登録、その情報をもとにログイン機能の実装を行っていきます。

データベースへの登録手続き

データベースの接続を管理するファイルを直下に作ります。
/dbconnect.php

<?php
	$db = mysqli_connect('localhost', 'root', 'root', 'Loginpage') or die(mysqli_connect_error());
	mysqli_set_charset($db, 'utf8');
?>

mysqli_connectの中身は、初期設定の場合のMAMPのものです。
XAMPPの場合は3つめが空白、変更している場合は変更したものを記述してください。

実際にこのファイルを読み込んで使っていきます。
check.phpを変更していきます。

<?php
session_start();
require('../dbconnect.php');

if(!isset($_SESSION['join'])){
	header('Location: index.php');
	exit();
}

if($_SERVER['REQUEST_METHOD'] == 'POST'){
	//登録処理をする
	$sql = sprintf('INSERT INTO users SET name="%s", mail="%s", pass="%s"',
		mysqli_real_escape_string($db, $_SESSION['join']['name']),
		mysqli_real_escape_string($db, $_SESSION['join']['mail']),
		mysqli_real_escape_string($db, sha1($_SESSION['join']['pass']))
	);
	mysqli_query($db, $sql) or die(mysqli_error($db));
	unset($_SESSION['join']);

	header('Location: thanks.php');
	exit();
}

?>

登録処理のif文条件がisset($_POST)となっていましたが、これだとGETで来た場合でも、この画面が表示される前に登録処理が行われてしまうため、if($_SERVER['REQUEST_METHOD'] == 'POST')に訂正しました(2016.10.17)

簡単に説明すると上から
requireでデータベースを読み込み、$_SESSIONに中身があればセッション内容からクエリを生成・送信、
unsetでセッションを削除し、headerでthanks.phpにとばすという流れになっています。
また、パスワードは安全のためにsha1を利用して暗号化して送信しています。見づらいですが数字の1ですので気をつけてください。

これで実際に登録できれば完了です。
情報を入力してデータベースを確認してみてください。

f:id:marinok:20150401174229p:plain

できていますね。
これで会員登録機能は完成です。
メールアドレスの重複確認の機能もありますがこれは補足でまた別の機会に。

ログインの仕組みを作成する

データベースの内容から情報を照合しログイン機能を作成します。
直下にlogin.phpを作成します。まずはビューを作っていきます。
/login.php

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>ログイン</title>
  </head>
  <body>
  	<p>メールアドレスとパスワードを記入してログインしてください。</p>
  	<p>入会手続きがまだの方はこちらからどうぞ。</p>
  	<p>&raquo;<a href="join/">入会手続きをする</a></p>
  	<form action="" method="post">
  		<dl>
  			<dt>メールアドレス</dt>
  			<dd>
  				<input type="text" name="mail" size="35" maxlength="255">
  			</dd>
  			<dt>パスワード</dt>
  			<dd>
  				<input type="password" name="pass" size="35" maxlength="255">
  			</dd>
  		</dl>
  		<input type="submit" value="ログインする">
  	</form>
  </body>
</html>

そのままログインの仕組みを作成していきます。
/login.php

<?php
require('dbconnect.php');

session_start();

if(!empty($_POST)){
  //ログインの処理
  if($_POST['mail'] != '' && $_POST['pass'] != ''){
    $sql = sprintf('SELECT * FROM users WHERE mail="%s" AND pass="%s"',
      mysqli_real_escape_string($db, $_POST['mail']),
      mysqli_real_escape_string($db, sha1($_POST['pass']))
    );
    $record = mysqli_query($db, $sql) or die(mysqli_error($db));
    if($table = mysqli_fetch_assoc($record)){
      //ログイン成功
      header('Location: index.php');
      exit();
    }else{
      $error['login'] = 'failed';
    }
  }else{
    $error['login'] = 'blank';
  }
}
?>

入力された情報からクエリを作成しデータベース内から検索、検索が成功した場合ログイン成功、
それ以外の場合は対応したエラーを$errorに格納するというものです。
この$errorの内容を表示するように少しビューに追加していきます。
以下のように変更。
/login.php

<dl>
	<dt>メールアドレス</dt>
	<dd>
		<input type="text" name="mail" size="35" maxlength="255"
				value="<?php echo htmlspecialchars($_POST['mail']); ?>">
		<?php if(!empty($error['login']) && $error['login'] == 'blank'): ?>
			<p><font color="red">* メールアドレスとパスワードをご記入ください</font></p>
		<?php endif; ?>
		<?php if(!empty($error['login']) && $error['login'] == 'failed'): ?>
			<p><font color="red">* ログインに失敗しました。正しくご記入ください。</font></p>
		<?php endif; ?>
	</dd>
	<dt>パスワード</dt>
	<dd>
		<input type="password" name="pass" size="35" maxlength="255"
				value="<?php echo htmlspecialchars($_POST['pass']); ?>">
	</dd>
</dl>

これでログイン失敗時に対応したエラー文が表示されるようになりました。

実際にログインできるか確認してみてください。
ログイン後のindex.phpをまだ作成していないのでログイン成功できても
Not Foundが表示されるかと思いますがとりあえずそこまでリンクできていれば
簡単なログイン機能は完成です。
ここまでできれば簡単なデーターベースとのやり取りも理解できたのではないでしょうか。

以上、phpで会員登録、ログイン機能の実装終了です。