Written by Manabu Bannai

【PHP7対応】ログイン・会員登録機能を作る方法【2016年版】

PHP PROGRAMMING

なにごとも基礎が大切ということでPHPを改めて勉強しなおしているのですが、PHP7対応でログイン・会員登録機能つくったので、コードとともに公開します。開発環境はPHP7で作ってますので、多分動作は速いかなと思います。これからPHPがんばるぞ〜って方はぜひご覧ください。
PHPのコードDLはこちら

尚、Web制作の基礎からしっかりやりたい人は【独学でWeb制作マスター】勉強方法のまとめ【初心者向け】をどうぞ。

PHPの会員登録サイトのデモ画面

スクショでご紹介します。

PHP製:会員登録フォーム

会員登録

PHP製:会員登録フォーム(登録完了画面)

会員登録_完了

PHP製:会員登録フォーム(エラー画面)

会員登録_エラー

PHP製:会員ログインフォーム

ログイン

PHP製:会員情報ページ

プロフィール

それでは具体的な方法を見ていきましょう。

PHPのログインシステム用のDBを作成(SQL)

DB
phpMyAdminの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秒で解約できます。無料登録は「こちら」です。