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)

广告
将在 10 秒后关闭
bannerAds