【PHP7対応】ログイン・会員登録機能を作る方法【2016年版】
なにごとも基礎が大切ということでPHPを改めて勉強しなおしているのですが、PHP7対応でログイン・会員登録機能つくったので、コードとともに公開します。開発環境はPHP7で作ってますので、多分動作は速いかなと思います。これからPHPがんばるぞ〜って方はぜひご覧ください。
PHPのコードDLはこちら
尚、Web制作の基礎からしっかりやりたい人は【独学でWeb制作マスター】勉強方法のまとめ【初心者向け】をどうぞ。
PHPの会員登録サイトのデモ画面
スクショでご紹介します。
PHP製:会員登録フォーム
PHP製:会員登録フォーム(登録完了画面)
PHP製:会員登録フォーム(エラー画面)
PHP製:会員ログインフォーム
PHP製:会員情報ページ
それでは具体的な方法を見ていきましょう。
PHPのログインシステム用のDBを作成(SQL)
CREATE DATABASE register_func DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE TABLE register_func. users (
user_id INT( 5 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
username VARCHAR( 25 ) NOT NULL ,
email VARCHAR( 35 ) NOT NULL ,
password VARCHAR( 60 ) NOT NULL ,
UNIQUE (email)
);
DB接続のIDとPASSを保管するファイルを作成する
新規作成ファイル:core/config.php
$host = "localhost";
$username = "root";
$password = "root";
$dbname = "register_func";
coreフォルダへのアクセス制限ファイル(.htaccess)を作成
新規作成ファイル:core/.htaccess
<Files ~ ".(dwt|php)$">
Deny from all
</Files>
DBと接続するPHPファイルを作成する
新規作成ファイル:dbconnect.php
require_once('./core/config.php');
$mysqli = new mysqli($host, $username, $password, $dbname);
if ($mysqli->connect_error) {
error_log($mysqli->connect_error);
exit;
}
PHPで会員登録ページを作成する
新規作成ファイル:register.php
まずはDB接続とセッションスタートを記述します。セッションってなにそれ美味しいのって人は、PHPでセッションを使う方法【初心者向け】をどうぞ。
session_start();
if( isset($_SESSION['user']) != "") {
// ログイン済みの場合はリダイレクト
header("Location: home.php");
}
// DBとの接続
include_once 'dbconnect.php';
会員登録ページ内の会員登録フォームを作成する
編集ファイル:register.php
HTMLの時間です。下記のとおり。
<!DOCTYPE HTML>
<html lang="ja">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>PHPの会員登録機能</title>
<link rel="stylesheet" href="style.css">
<!-- Bootstrap読み込み(スタイリングのため) -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.0/css/bootstrap.min.css">
</head>
<body>
<div class="col-xs-6 col-xs-offset-3">
<form method="post">
<h1>会員登録フォーム</h1>
<div class="form-group">
<input type="text" class="form-control" name="username" placeholder="ユーザー名" required />
</div>
<div class="form-group">
<input type="email" class="form-control" name="email" placeholder="メールアドレス" required />
</div>
<div class="form-group">
<input type="password" class="form-control" name="password" placeholder="パスワード" required />
</div>
<button type="submit" class="btn btn-default" name="signup">会員登録する</button>
<a href="index.php">ログインはこちら</a>
</form>
</div>
</body>
</html>
会員登録ページ内の会員登録フォームで入力された情報をDBに保存する
編集ファイル:register.php
会員登録ボタン(signup)が押された時に実行されるPHPスクリプトです。会員登録が成功するとメッセージが表示されます。
// signupがPOSTされたときに下記を実行
if(isset($_POST['signup'])) {
$username = $mysqli->real_escape_string($_POST['username']);
$email = $mysqli->real_escape_string($_POST['email']);
$password = $mysqli->real_escape_string($_POST['password']);
$password = password_hash($password, PASSWORD_DEFAULT);
// POSTされた情報をDBに格納する
$query = "INSERT INTO users(username,email,password) VALUES('$username','$email','$password')";
if($mysqli->query($query)) { ?>
<div class="alert alert-success" role="alert">登録しました</div>
<?php } else { ?>
<div class="alert alert-danger" role="alert">エラーが発生しました。</div>
<?php
}
}
PHPでログインページを作成する
新規作成ファイル:index.php
Emailとパスワードでユーザー認証して、会員登録情報と一致した場合はログインできます。説明するまでもないですよね。よくあるログインページです。まずは下記のようにDBに接続します。
ob_start();
session_start();
if( isset($_SESSION['user']) != "") {
header("Location: home.php");
}
include_once 'dbconnect.php';
ログインページ内のログインフォーム作成する
編集ファイル:index.php
register.phpを作った時とほぼ同じです。
<!DOCTYPE HTML>
<html lang="ja">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>PHPのログイン機能</title>
<link rel="stylesheet" href="style.css">
<!-- Bootstrap読み込み(スタイリングのため) -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.0/css/bootstrap.min.css">
</head>
</head>
<body>
<div class="col-xs-6 col-xs-offset-3">
<form method="post">
<h1>ログインフォーム</h1>
<div class="form-group">
<input type="email" class="form-control" name="email" placeholder="メールアドレス" required />
</div>
<div class="form-group">
<input type="password" class="form-control" name="password" placeholder="パスワード" required />
</div>
<button type="submit" class="btn btn-default" name="login">ログインする</button>
<a href="register.php">会員登録はこちら</a>
</form>
</div>
</body>
</html>
PHPでログインページ内のログインシステムを作成する
編集ファイル:index.php
ちょいややこしいですが、コメント多めに入れています。
// ログインボタンがクリックされたときに下記を実行
if(isset($_POST['login'])) {
$email = $mysqli->real_escape_string($_POST['email']);
$password = $mysqli->real_escape_string($_POST['password']);
// クエリの実行
$query = "SELECT * FROM users WHERE email='$email'";
$result = $mysqli->query($query);
if (!$result) {
print('クエリーが失敗しました。' . $mysqli->error);
$mysqli->close();
exit();
}
// パスワード(暗号化済み)とユーザーIDの取り出し
while ($row = $result->fetch_assoc()) {
$db_hashed_pwd = $row['password'];
$user_id = $row['user_id'];
}
// データベースの切断
$result->close();
// ハッシュ化されたパスワードがマッチするかどうかを確認
if (password_verify($password, $db_hashed_pwd)) {
$_SESSION['user'] = $user_id;
header("Location: home.php");
exit;
} else { ?>
<div class="alert alert-danger" role="alert">メールアドレスとパスワードが一致しません。</div>
<?php }
}
PHPでログイン後のマイページを作成する
新規作成ファイル:home.php
home.phpに訪れたユーザーがログインしているかどうかを判別して、ログイン済みのユーザーには会員登録済みの情報を表示します。
session_start();
include_once 'dbconnect.php';
if(!isset($_SESSION['user'])) {
header("Location: index.php");
}
// ユーザーIDからユーザー名を取り出す
$query = "SELECT * FROM users WHERE user_id=".$_SESSION['user']."";
$result = $mysqli->query($query);
$result = $mysqli->query($query);
if (!$result) {
print('クエリーが失敗しました。' . $mysqli->error);
$mysqli->close();
exit();
}
// ユーザー情報の取り出し
while ($row = $result->fetch_assoc()) {
$username = $row['username'];
$email = $row['email'];
}
// データベースの切断
$result->close();
?>
<!DOCTYPE HTML>
<html lang="ja">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>PHPのマイページ機能</title>
<link rel="stylesheet" href="style.css">
<!-- Bootstrap読み込み(スタイリングのため) -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.0/css/bootstrap.min.css">
</head>
</head>
<body>
<div class="col-xs-6 col-xs-offset-3">
<h1>プロフィール</h1>
<ul>
<li>名前:<?php echo $username; ?></li>
<li>メールアドレス:<?php echo $email; ?></li>
</ul>
<a href="logout.php?logout">ログアウト</a>
</div>
</body>
</html>
さいごに、、PHPでログアウトページの作成する
新規作成ファイル:logout.php
とっても簡単です。下記PHPスクリプトみれば分かるかなと。
session_start();
// logout.php?logoutにアクセスしたユーザーをログアウトする
if(isset($_GET['logout'])) {
session_destroy();
unset($_SESSION['user']);
header("Location: index.php");
} else {
header("Location: index.php");
}
以上で完了!疑問点とかはTwitterからお問い合わせをお願いします。
※参考サイト
User Registration and Login Script with PHP and MySQL | Coding Cage
※メモ:password_verifyでバグったときのデバッグ用
$password = "pass";
$hash = password_hash($password, PASSWORD_DEFAULT);
echo $hash;
var_dump(password_verify("pass", $hash));
※P.S:無料メルマガで発信中:過去の僕は「ブログ発信で5億円」を稼ぎました。次は「30億円」を目指します。挑戦しつつ、裏側の思考を「メルマガ」から発信します。不満足なら1秒で解約できます。無料登録は「こちら」です。