【PHP】ログインフォームを作る
phpでログインフォームを作る方法をご紹介します。
作業の流れとしては以下のようになります。
①データベースを設定する
②新規登録・ログイン用フォーム画面を作成する
③新規登録機能を追加する
④ログイン機能を追加する
⑤ログアウト機能を追加する
1.データベースの設定
以下のデータベースで登録します。
データベース名:test_login
名前 | 値 |
---|---|
ユーザー名 | hogeUser |
ホスト | localhost |
パスワード | hogehoge |
テーブル名 | UserDeta |
config.php
<?php
//ini_set('display_errors', 1);
define('DSN', 'mysql:host=localhost;dbname=test_login');
define('DB_USER', 'hogeUser');
define('DB_PASS', 'hogehoge');
2.新規登録・ログインフォーム画面の作成
HTMLでページを作る方法と同じように、phpの記述を追加した新規登録・ログイン画面を作成します。
HTMLでサイトを作る方法についてはこちらの記事で紹介しています。
index.php
<?php
function h($s){
return htmlspecialchars($s, ENT_QUOTES, 'utf-8');
}
session_start();
//ログイン済みの場合
if (isset($_SESSION['EMAIL'])) {
echo 'ようこそ' . h($_SESSION['EMAIL']) . "さん<br>";
echo "<a href='/logout.php'>ログアウトはこちら。</a>";
exit;
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Login</title>
</head>
<body>
<h1>ようこそ、ログインしてください。</h1>
<form action="login.php" method="post">
<label for="email">email</label>
<input type="email" name="email">
<label for="password">password</label>
<input type="password" name="password">
<button type="submit">Sign In!</button>
</form>
<h1>初めての方はこちら</h1>
<form action="signUp.php" method="post">
<label for="email">email</label>
<input type="email" name="email">email
<label for="password">password</label>
<input type="password" name="password">
<button type="submit">Sign Up!</button>
<p>※パスワードは半角英数字をそれぞれ1文字以上含んだ、8文字以上で設定してください。</p>
</form>
</body>
</html>
新規登録機能について
signUp.php
<?php
require_once('config.php');
//データベースへ接続、テーブルがない場合は作成
try {
$pdo = new PDO(DSN, DB_USER, DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->exec("create table if not exists userDeta(
id int not null auto_increment primary key,
email varchar(255),
password varchar(255),
created timestamp not null default current_timestamp
)");
} catch (Exception $e) {
echo $e->getMessage() . PHP_EOL;
}
//POSTのValidate。
if (!$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
echo '入力された値が不正です。';
return false;
}
//パスワードの正規表現
if (preg_match('/\A(?=.*?[a-z])(?=.*?\d)[a-z\d]{8,100}+\z/i', $_POST['password'])) {
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
} else {
echo 'パスワードは半角英数字をそれぞれ1文字以上含んだ8文字以上で設定してください。';
return false;
}
//登録処理
try {
$stmt = $pdo->prepare("insert into userDeta(email, password) value(?, ?)");
$stmt->execute([$email, $password]);
echo '登録完了';
} catch (\Exception $e) {
echo '登録済みのメールアドレスです。';
}
ログイン機能
login.php
<?php
require_once('config.php');
session_start();
//POSTのvalidate
if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
echo '入力された値が不正です。';
return false;
}
//DB内でPOSTされたメールアドレスを検索
try {
$pdo = new PDO(DSN, DB_USER, DB_PASS);
$stmt = $pdo->prepare('select * from userDeta where email = ?');
$stmt->execute([$_POST['email']]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
} catch (\Exception $e) {
echo $e->getMessage() . PHP_EOL;
}
//emailがDB内に存在しているか確認
if (!isset($row['email'])) {
echo 'メールアドレス又はパスワードが間違っています。';
return false;
}
//パスワード確認後sessionにメールアドレスを渡す
if (password_verify($_POST['password'], $row['password'])) {
session_regenerate_id(true); //session_idを新しく生成し、置き換える
$_SESSION['EMAIL'] = $row['email'];
echo 'ログインしました';
} else {
echo 'メールアドレス又はパスワードが間違っています。';
return false;
}
ログアウト機能
logout.php
<?php
session_start();
$output = '';
if (isset($_SESSION["EMAIL"])) {
$output = 'Logoutしました。';
} else {
$output = 'SessionがTimeoutしました。';
}
//セッション変数のクリア
$_SESSION = array();
//セッションクッキーも削除
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
//セッションクリア
@session_destroy();
echo $output;