PHP登陆功能
从使用PHP进行新用户注册到登录和登出
粗略的流程:
◆在注册页面进行用户注册
→确认用户是否已存在
◆登录处理
→如果输入的信息与数据库匹配,则登录
◆显示主页画面
→根据登录与非登录状态切换显示
##注册新用户
提供表格
<h1>新規会員登録</h1>
<form action="register.php" method="post">//処理を行う宛先を指定
<div>
<label>
名前:
<input type="text" name="name" required>
</label>
</div>
<div>
<label>
メールアドレス:
<input type="text" name="mail" required>
</label>
</div>
<div>
<label>
パスワード:
<input type="password" name="pass" required>
</label>
</div>
<input type="submit" value="新規登録">
</form>
<p>すでに登録済みの方は<a href="login.php">こちら</a></p>
根据表单传输的值执行新用户注册处理
<?php
//フォームからの値をそれぞれ変数に代入
$name = $_POST['name'];
$mail = $_POST['mail'];
$pass = password_hash($_POST['pass'], PASSWORD_DEFAULT);
$dsn = "mysql:host=localhost; dbname=xxx; charset=utf8";
$username = "xxx";
$password = "xxx";
try {
$dbh = new PDO($dsn, $username, $password);
} catch (PDOException $e) {
$msg = $e->getMessage();
}
//フォームに入力されたmailがすでに登録されていないかチェック
$sql = "SELECT * FROM users WHERE mail = :mail";
$stmt = $dbh->prepare($sql);
$stmt->bindValue(':mail', $mail);
$stmt->execute();
$member = $stmt->fetch();
if ($member['mail'] === $mail) {
$msg = '同じメールアドレスが存在します。';
$link = '<a href="signup.php">戻る</a>';
} else {
//登録されていなければinsert
$sql = "INSERT INTO users(name, mail, pass) VALUES (:name, :mail, :pass)";
$stmt = $dbh->prepare($sql);
$stmt->bindValue(':name', $name);
$stmt->bindValue(':mail', $mail);
$stmt->bindValue(':pass', $pass);
$stmt->execute();
$msg = '会員登録が完了しました';
$link = '<a href="login.php">ログインページ</a>';
}
?>
<h1><?php echo $msg; ?></h1><!--メッセージの出力-->
<?php echo $link; ?>
【1】接收通过表单提交的值,并使用$_POST将其分别赋值给变量。
【2】检查提交的值是否已经在数据库中注册。
→ 使用邮件地址作为WHERE条件执行SQL的SELECT语句。
使用$member = $stmt->fetch()来提取执行结果的数据。
数据以类似[“name”]=> string(12) “田中太郎”的数组形式提取。
可以通过$member[‘列名’]来提取该列的值。
【3】如果未注册,则使用INSERT将通过表单提交的值注册到数据库中。
请登录
准备表格
<h1>ログインページ</h1>
<form action="login.php" method="post">
<div>
<label>
メールアドレス:
<input type="text" name="mail" required>
</label>
</div>
<div>
<label>
パスワード:
<input type="password" name="pass" required>
</label>
</div>
<input type="submit" value="ログイン">
</form>
通过与数据库对比发送的表单,如果是已注册的用户,则进行登录处理。
<?php
session_start();
$mail = $_POST['mail'];
$dsn = "mysql:host=localhost; dbname=xxx; charset=utf8";
$username = "xxx";
$password = "xxx";
try {
$dbh = new PDO($dsn, $username, $password);
} catch (PDOException $e) {
$msg = $e->getMessage();
}
$sql = "SELECT * FROM users WHERE mail = :mail";
$stmt = $dbh->prepare($sql);
$stmt->bindValue(':mail', $mail);
$stmt->execute();
$member = $stmt->fetch();
//指定したハッシュがパスワードにマッチしているかチェック
if (password_verify($_POST['pass'], $member['pass'])) {
//DBのユーザー情報をセッションに保存
$_SESSION['id'] = $member['id'];
$_SESSION['name'] = $member['name'];
$msg = 'ログインしました。';
$link = '<a href="index.php">ホーム</a>';
} else {
$msg = 'メールアドレスもしくはパスワードが間違っています。';
$link = '<a href="login.php">戻る</a>';
}
?>
<h1><?php echo $msg; ?></h1>
<?php echo $link; ?>
【1】为了开始会话,请声明session_start();
【2】检查从表单发送的指定哈希是否与数据库中的密码匹配
【3】如果用户已经注册,将用户名保存到会话中以便在主页上显示已登录的用户名称
【4】如果不存在,则显示错误信息
退出登陆
<?php
session_start();
$_SESSION = array();//セッションの中身をすべて削除
session_destroy();//セッションを破壊
?>
<p>ログアウトしました。</p>
<a href="login.php">ログインへ</a>
【1】通过$_SESSION = array()来清空会话内容。
【2】通过session_destroy()来销毁会话。
主屏幕
<?php
session_start();
$username = $_SESSION['name'];
if (isset($_SESSION['id'])) {//ログインしているとき
$msg = 'こんにちは' . htmlspecialchars($username, \ENT_QUOTES, 'UTF-8') . 'さん';
$link = '<a href="logout.php">ログアウト</a>';
} else {//ログインしていない時
$msg = 'ログインしていません';
$link = '<a href="login.php">ログイン</a>';
}
?>
<h1><?php echo $msg; ?></h1>
<?php echo $link; ?>
##参考文献
1. “$stmt->fetch()” 意味是什么?(来源:https://blog.senseshare.jp/stmtfetch.html)
2. 【PHP入门】彻底解析!如何在PHP中使用会话(session)的方法~从基础到应用 (来源:https://www.sejuku.net/blog/25276)
3. PHP、PDO的「bindValue」和「bindParam」有什么区别?(来源:http://piyopiyocs.blog115.fc2.com/blog-entry-656.html)