Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Đăng ký người dùng và xác minh email PHP và MySQL

Tôi đã viết một bài đăng trên blog về cách tạo hệ thống đăng ký và đăng nhập người dùng hoàn chỉnh bằng PHP và MySQL nhưng tôi không bao gồm xác minh email.

Hướng dẫn này giống như một bản cập nhật của hướng dẫn trước. Ngoài việc có thể đăng ký, đăng nhập và đăng xuất khỏi tài khoản của mình, người dùng cũng sẽ được gửi một email xác minh đến địa chỉ email của họ với một liên kết để họ có thể nhấp vào và xác minh địa chỉ email của họ.

Trên hầu hết các ứng dụng bạn sẽ xây dựng, điều quan trọng là phải thêm tính năng xác minh email vì nhiều lý do:bạn có thể muốn gửi email sau này cho người dùng và muốn đảm bảo rằng họ sẽ nhìn thấy nó; hoặc người dùng có thể quên mật khẩu của họ và cần đặt lại mật khẩu và để thực hiện việc này, chúng tôi cần gửi cho họ một liên kết đặt lại mật khẩu qua email; có nhiều lý do khác nhưng bạn hiểu chính xác.

Trong hệ thống mà chúng tôi đang xây dựng ngày nay, những người dùng chưa xác minh email của họ sẽ không thể thực hiện một số hành động nhất định (Tôi sẽ chỉ sử dụng một trình diễn đơn giản chẳng hạn như xem một nút. Chỉ những người dùng đã xác minh mới có thể nhìn thấy nút đó).

Để bắt đầu, hãy tạo một dự án PHP mới có tên verify-user và trong thư mục này, tạo hai tệp:signup.php và login.php.

signup.php:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">

  <!-- Bootstrap CSS -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0/css/bootstrap.min.css" />
  <link rel="stylesheet" href="main.css">
  <title>User verification system PHP</title>
</head>
<body>
  <div class="container">
    <div class="row">
      <div class="col-md-4 offset-md-4 form-wrapper auth">
        <h3 class="text-center form-title">Register</h3>
        <form action="signup.php" method="post">
          <div class="form-group">
            <label>Username</label>
            <input type="text" name="username" class="form-control form-control-lg" value="<?php echo $username; ?>">
          </div>
          <div class="form-group">
            <label>Email</label>
            <input type="text" name="email" class="form-control form-control-lg" value="<?php echo $email; ?>">
          </div>
          <div class="form-group">
            <label>Password</label>
            <input type="password" name="password" class="form-control form-control-lg">
          </div>
          <div class="form-group">
            <label>Password Confirm</label>
            <input type="password" name="passwordConf" class="form-control form-control-lg">
          </div>
          <div class="form-group">
            <button type="submit" name="signup-btn" class="btn btn-lg btn-block">Sign Up</button>
          </div>
        </form>
        <p>Already have an account? <a href="login.php">Login</a></p>
      </div>
    </div>
  </div>
</body>
</html>

Nó chỉ là một tệp HTML / CSS đơn giản. Điều duy nhất đáng chú ý là chúng tôi đang sử dụng khung CSS Bootstrap 4 để tạo kiểu cho trang của chúng tôi. Bạn có thể sử dụng bất kỳ khung tạo kiểu nào khác mà bạn chọn hoặc viết CSS của riêng bạn nếu bạn muốn.

Ngay sau Bootstrap CSS, chúng tôi đang bao gồm một tệp main.css để tạo kiểu tùy chỉnh. Hãy tạo tệp đó ngay bây giờ. Trong thư mục gốc của ứng dụng, hãy tạo một tệp có tên là main.css.

main.css:

@import url('https://fonts.googleapis.com/css?family=Lora');
li { list-style-type: none; }
.form-wrapper {
  margin: 50px auto 50px;
  font-family: 'Lora', serif;
  font-size: 1.09em;
}
.form-wrapper.login { margin-top: 120px; }
.form-wrapper p { font-size: .8em; text-align: center; }
.form-control:focus { box-shadow: none; }
.form-wrapper {
  border: 1px solid #80CED7;
  border-radius: 5px;
  padding: 25px 15px 0px 15px;
}
.form-wrapper.auth .form-title { color: #007EA7; }
.home-wrapper button,
.form-wrapper.auth button {
  background: #007EA7;
  color: white;
}
.home-wrapper {
  margin-top: 150px;
  border-radius: 5px;
  padding: 10px;
  border: 1px solid #80CED7;
}

Trên dòng đầu tiên của tệp này, chúng tôi đang nhập và sử dụng một số Phông chữ của Google để làm cho phông chữ của chúng tôi trông đẹp hơn.

Bây giờ, hãy chuyển sang tệp login.php và làm điều tương tự.

login.php:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <!-- Bootstrap CSS -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0/css/bootstrap.min.css" />
  <link rel="stylesheet" href="main.css">
  <title>User verification system PHP - Login</title>
</head>
<body>
  <div class="container">
    <div class="row">
      <div class="col-md-4 offset-md-4 form-wrapper auth login">
        <h3 class="text-center form-title">Login</h3>
        <form action="login.php" method="post">
          <div class="form-group">
            <label>Username or Email</label>
            <input type="text" name="username" class="form-control form-control-lg" value="<?php echo $username; ?>">
          </div>
          <div class="form-group">
            <label>Password</label>
            <input type="password" name="password" class="form-control form-control-lg">
          </div>
          <div class="form-group">
            <button type="submit" name="login-btn" class="btn btn-lg btn-block">Login</button>
          </div>
        </form>
        <p>Don't yet have an account? <a href="signup.php">Sign up</a></p>
      </div>
    </div>
  </div>
</body>
</html>

Trên trình duyệt của bạn, truy cập http://localhost/cwa/verify-user/signup.php, bạn sẽ thấy một biểu mẫu đăng ký đẹp mắt (giống như đăng nhập). Bỏ qua lỗi trong các trường đầu vào, chúng tôi sẽ sớm sửa lỗi đó.

Bây giờ, hãy thiết lập cơ sở dữ liệu. Tạo một cơ sở dữ liệu được gọi là xác minh-người dùng và trong cơ sở dữ liệu này, hãy tạo một bảng người dùng với các thuộc tính như sau:

CREATE TABLE `users` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `username` varchar(100) NOT NULL,
 `email` varchar(100) NOT NULL,
 `verified` tinyint(1) NOT NULL DEFAULT '0',
 `token` varchar(255) DEFAULT NULL,
 `password` varchar(255) NOT NULL,
 PRIMARY KEY (`id`)
)

Không có gì bất thường ngoại trừ, có lẽ, mã thông báo và các trường đã xác minh, mà tôi sẽ giải thích trong giây lát.

Bây giờ chúng ta bắt đầu với logic đăng ký thực tế. Tôi thường đề cập đến phần logic trong ứng dụng của mình với tư cách là bộ điều khiển và đó là những gì tôi sẽ làm ở đây. Trong thư mục gốc của dự án, hãy tạo một thư mục có tên là bộ điều khiển và bên trong bộ điều khiển, hãy tạo một tệp có tên authController.php.

bộ điều khiển / authController.php:

<?php
session_start();
$username = "";
$email = "";
$errors = [];

$conn = new mysqli('localhost', 'root', '', 'verify-user');

// SIGN UP USER
if (isset($_POST['signup-btn'])) {
    if (empty($_POST['username'])) {
        $errors['username'] = 'Username required';
    }
    if (empty($_POST['email'])) {
        $errors['email'] = 'Email required';
    }
    if (empty($_POST['password'])) {
        $errors['password'] = 'Password required';
    }
    if (isset($_POST['password']) && $_POST['password'] !== $_POST['passwordConf']) {
        $errors['passwordConf'] = 'The two passwords do not match';
    }

    $username = $_POST['username'];
    $email = $_POST['email'];
    $token = bin2hex(random_bytes(50)); // generate unique token
    $password = password_hash($_POST['password'], PASSWORD_DEFAULT); //encrypt password

    // Check if email already exists
    $sql = "SELECT * FROM users WHERE email='$email' LIMIT 1";
    $result = mysqli_query($conn, $sql);
    if (mysqli_num_rows($result) > 0) {
        $errors['email'] = "Email already exists";
    }

    if (count($errors) === 0) {
        $query = "INSERT INTO users SET username=?, email=?, token=?, password=?";
        $stmt = $conn->prepare($query);
        $stmt->bind_param('ssss', $username, $email, $token, $password);
        $result = $stmt->execute();

        if ($result) {
            $user_id = $stmt->insert_id;
            $stmt->close();

            // TO DO: send verification email to user
            // sendVerificationEmail($email, $token);

            $_SESSION['id'] = $user_id;
            $_SESSION['username'] = $username;
            $_SESSION['email'] = $email;
            $_SESSION['verified'] = false;
            $_SESSION['message'] = 'You are logged in!';
            $_SESSION['type'] = 'alert-success';
            header('location: index.php');
        } else {
            $_SESSION['error_msg'] = "Database error: Could not register user";
        }
    }
}

// LOGIN
if (isset($_POST['login-btn'])) {
    if (empty($_POST['username'])) {
        $errors['username'] = 'Username or email required';
    }
    if (empty($_POST['password'])) {
        $errors['password'] = 'Password required';
    }
    $username = $_POST['username'];
    $password = $_POST['password'];

    if (count($errors) === 0) {
        $query = "SELECT * FROM users WHERE username=? OR email=? LIMIT 1";
        $stmt = $conn->prepare($query);
        $stmt->bind_param('ss', $username, $password);

        if ($stmt->execute()) {
            $result = $stmt->get_result();
            $user = $result->fetch_assoc();
            if (password_verify($password, $user['password'])) { // if password matches
                $stmt->close();

                $_SESSION['id'] = $user['id'];
                $_SESSION['username'] = $user['username'];
                $_SESSION['email'] = $user['email'];
                $_SESSION['verified'] = $user['verified'];
                $_SESSION['message'] = 'You are logged in!';
                $_SESSION['type'] = 'alert-success';
                header('location: index.php');
                exit(0);
            } else { // if password does not match
                $errors['login_fail'] = "Wrong username / password";
            }
        } else {
            $_SESSION['message'] = "Database error. Login failed!";
            $_SESSION['type'] = "alert-danger";
        }
    }
}

Nếu bạn đã làm theo các hướng dẫn trước đây của tôi, thì không có gì trong tệp này sẽ là mới đối với bạn. Nhưng vì lợi ích của những người lần đầu tiên, tôi sẽ giải thích một số điều.

Điều đầu tiên là chúng tôi đang bắt đầu phiên bằng cách sử dụng session_start () vì chúng tôi sẽ cần lưu trữ thông tin người dùng đã đăng nhập trong phiên. Sau khi bắt đầu phiên, chúng tôi đang khởi tạo các biến $ tên người dùng và $ email mà chúng tôi đang sử dụng trong các biểu mẫu của mình và cả mảng $ error sẽ chứa các lỗi xác thực biểu mẫu của chúng tôi.

Tiếp theo, chúng tôi kết nối với cơ sở dữ liệu. Hai câu lệnh if tiếp theo sau lần lượt là mã được thực thi khi người dùng nhấp vào nút đăng ký hoặc đăng nhập. Trong trường hợp đăng ký, chúng tôi kiểm tra để đảm bảo rằng tất cả các trường bắt buộc đã được điền chính xác và chỉ sau đó chúng tôi mới tiến hành lưu người dùng vào cơ sở dữ liệu. Chúng tôi cũng đang tạo mã thông báo (một chuỗi ngẫu nhiên, duy nhất) và lưu nó với người dùng dưới dạng thuộc tính. Điều này sẽ được sử dụng để xác minh email của người dùng. Thông tin thêm về nó sau.

Vì tệp authController.php của chúng tôi chịu trách nhiệm đăng ký và đăng nhập, chúng tôi phải đưa nó vào đầu trang signup.php và login.php vì đó là nơi dữ liệu biểu mẫu đang được gửi đến. Như vậy:

signup.php và login.php (ở trên cùng):

<?php include 'controllers/authController.php' ?>

Nếu có bất kỳ thông báo lỗi nào trong mảng $ error, chúng ta cần hiển thị chúng trên biểu mẫu. Để làm điều đó, hãy thêm câu lệnh if này vào bên trong biểu mẫu của bạn ngay bên dưới tiêu đề biểu mẫu cho cả trang đăng ký và trang đăng nhập.

<!-- form title -->
<h3 class="text-center form-title">Register</h3> <!-- or Login -->

<?php if (count($errors) > 0): ?>
  <div class="alert alert-danger">
    <?php foreach ($errors as $error): ?>
    <li>
      <?php echo $error; ?>
    </li>
    <?php endforeach;?>
  </div>
<?php endif;?>

Nếu không có lỗi, tập lệnh của chúng tôi sẽ tiến hành lưu người dùng trong cơ sở dữ liệu. Sau khi lưu người dùng vào cơ sở dữ liệu, chúng tôi đăng nhập họ ngay lập tức. Trong trường hợp của chúng tôi, đăng nhập một người dùng có nghĩa là lưu trữ dữ liệu của họ trong phiên và đó là những gì chúng tôi vừa làm.

Tại thời điểm này, bạn đã có thể đăng ký và thậm chí đăng nhập một người dùng. Nhưng sau khi đăng nhập, bạn sẽ được chuyển đến trang index.php không tồn tại. Chúng tôi sẽ sớm tạo ra nó.

Trong authController.php, chúng tôi đang lưu trữ các biến thông báo và loại trong phiên để được hiển thị ngay sau khi người dùng đăng nhập. Thông báo là văn bản thực của thông báo trong khi kiểu là lớp tạo kiểu Bootstrap sẽ định dạng thông báo với thích hợp. màu sắc tùy thuộc vào giá trị loại.

Thông báo này được hiển thị sau khi người dùng đã đăng nhập và nó được hiển thị trên tệp index.php. Hãy tạo tệp đó ngay bây giờ trong thư mục gốc của dự án của chúng ta.

index.php:

<?php include 'controllers/authController.php'?>
<?php
// redirect user to login page if they're not logged in
if (empty($_SESSION['id'])) {
    header('location: login.php');
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">

  <!-- Bootstrap CSS -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0/css/bootstrap.min.css" />
  <link rel="stylesheet" href="main.css">
  <title>User verification system PHP</title>
</head>

<body>
  <div class="container">
    <div class="row">
      <div class="col-md-4 offset-md-4 home-wrapper">

        <!-- Display messages -->
        <?php if (isset($_SESSION['message'])): ?>
        <div class="alert <?php echo $_SESSION['type'] ?>">
          <?php
            echo $_SESSION['message'];
            unset($_SESSION['message']);
            unset($_SESSION['type']);
          ?>
        </div>
        <?php endif;?>

        <h4>Welcome, <?php echo $_SESSION['username']; ?></h4>
        <a href="logout.php" style="color: red">Logout</a>
        <?php if (!$_SESSION['verified']): ?>
          <div class="alert alert-warning alert-dismissible fade show" role="alert">
            You need to verify your email address!
            Sign into your email account and click
            on the verification link we just emailed you
            at
            <strong><?php echo $_SESSION['email']; ?></strong>
          </div>
        <?php else: ?>
          <button class="btn btn-lg btn-primary btn-block">I'm verified!!!</button>
        <?php endif;?>
      </div>
    </div>
  </div>
</body>
</html>

Trang này chỉ có thể truy cập được đối với những người dùng đã đăng nhập. Đó là lý do tại sao ở phần trên cùng của tệp, chúng tôi đang chuyển hướng người dùng đến trang đăng nhập nếu họ chưa đăng nhập. Ở đâu đó ở giữa trang, chúng tôi đang hiển thị thông báo. Sau khi hiển thị thông báo, chúng tôi hủy đặt thông báo và nhập các biến vì chúng tôi không muốn nó vẫn ở đó trên trang ngay cả sau khi người dùng làm mới trang.

Cuối cùng, ở giữa trang, chúng tôi thực hiện kiểm tra để xem liệu người dùng đã đăng nhập đã xác minh địa chỉ email của họ hay chưa. Hãy nhớ rằng chúng tôi đã thêm biến đã được xác minh trong phiên khi chúng tôi đăng nhập người dùng. Nếu người dùng đã được xác minh, thì chúng tôi hiển thị thông báo "Tôi đã được xác minh !!!" để họ xem. Nếu họ chưa được xác minh, chúng tôi cho họ biết về liên kết xác minh mà chúng tôi đã gửi đến địa chỉ email của họ và chúng tôi yêu cầu họ nhấp vào liên kết đó để xác minh email của họ.

Xác minh Email

Trong tệp authController.php, chúng tôi đã sử dụng một nhận xét để chỉ ra nơi chúng tôi sẽ gửi email xác minh cho người dùng bằng cách gọi sendVerificationEmail (). Đi tới tệp authController.php và bỏ ghi chú lệnh gọi hàm do đó:

// TO DO: send verification email to user
sendVerificationEmail($email, $token);

Chúng tôi sẽ định nghĩa hàm này trong một tệp khác và đưa tệp đó vào bên trong authController.php. Bên trong thư mục bộ điều khiển, tạo một tệp có tên sendEmails.php.

Trước khi chúng tôi thêm bất kỳ mã nào vào tệp này, hãy để tôi nói một chút về PHP SwiftMailer, thư viện phổ biến để gửi email bằng PHP mà chúng tôi sẽ sử dụng trong dự án này để gửi email từ localhost.

SwiftMailer là một thư viện giàu tính năng phổ biến để gửi email trong các ứng dụng PHP.

Để sử dụng Swiftmailer, trước tiên bạn cần cài đặt Composer. Sau khi bạn đã cài đặt composer, hãy mở terminal hoặc dòng lệnh của bạn và điều hướng đến thư mục gốc của dự án và chạy lệnh sau để thêm thư viện Swift Mailer với tất cả các tệp của nó vào dự án của chúng tôi:

composer require "swiftmailer/swiftmailer:^6.0"

Điều này tạo một thư mục nhà cung cấp trong thư mục gốc của ứng dụng của chúng tôi chứa tất cả mã (lớp) cần thiết để gửi email và nó cũng tạo tệp composer.json trong thư mục gốc của ứng dụng trông giống như sau:

{
    "require": {
        "swiftmailer/swiftmailer": "^6.0"
    }
}

Bây giờ, hãy mở tệp sendEmails.php mà chúng ta đã tạo trước đó và viết hàm sendVerificationEmail ():

<?php
require_once './vendor/autoload.php';

// Create the Transport
$transport = (new Swift_SmtpTransport('smtp.gmail.com', 465, 'ssl'))
    ->setUsername(SENDER_EMAIL)
    ->setPassword(SENDER_PASSWORD);

// Create the Mailer using your created Transport
$mailer = new Swift_Mailer($transport);

function sendVerificationEmail($userEmail, $token)
{
    global $mailer;
    $body = '<!DOCTYPE html>
    <html lang="en">

    <head>
      <meta charset="UTF-8">
      <title>Test mail</title>
      <style>
        .wrapper {
          padding: 20px;
          color: #444;
          font-size: 1.3em;
        }
        a {
          background: #592f80;
          text-decoration: none;
          padding: 8px 15px;
          border-radius: 5px;
          color: #fff;
        }
      </style>
    </head>

    <body>
      <div class="wrapper">
        <p>Thank you for signing up on our site. Please click on the link below to verify your account:.</p>
        <a href="http://localhost/cwa/verify-user/verify_email.php?token=' . $token . '">Verify Email!</a>
      </div>
    </body>

    </html>';

    // Create a message
    $message = (new Swift_Message('Verify your email'))
        ->setFrom(SENDER_EMAIL)
        ->setTo($userEmail)
        ->setBody($body, 'text/html');

    // Send the message
    $result = $mailer->send($message);

    if ($result > 0) {
        return true;
    } else {
        return false;
    }
}

Câu lệnh đầu tiên yêu cầu tệp autoload.php vào tệp này. Tệp autoload.php này sẽ tự động bao gồm tất cả các lớp từ thư viện Swift Mailer trong thư mục nhà cung cấp mà chúng tôi sử dụng trong tệp này.

Chúng tôi đang sử dụng Gmail trong ví dụ này. Vì vậy, bạn có thể thay thế SENDER_EMAIL và SENDER_PASSWORD bằng địa chỉ Gmail và mật khẩu mà bạn muốn sử dụng làm địa chỉ email của người gửi. (Địa chỉ email của người nhận là địa chỉ được gửi qua biểu mẫu).

Thông thường, để gửi email cho ai đó, bạn cần đăng nhập vào tài khoản Gmail của mình trước khi soạn thư và gửi. Nó giống như thứ mà thư viện Swift Mailer làm. Vì vậy, khi người nhận ($ userEmail) nhận được email, đó là địa chỉ Gmail của bạn (SENDER_EMAIL), họ sẽ xem là email gửi.

Bây giờ chúng ta đang gọi hàm sendVerificationEmail () trong tệp authController.php nhưng chúng ta đã xác định hàm bên trong tệp sendEmails.php. Hãy bao gồm tệp sendEmails.php bên trong authController.php của chúng tôi để cung cấp chức năng này trong tệp. Ở đầu authController.php, ngay trước session_start (), thêm dòng sau:

require_once 'sendEmails.php';

Đó là tất cả những gì chúng tôi cần, quý ông (và quý bà) gửi email đến người dùng của chúng tôi với liên kết xác minh email. Nhưng chúng tôi đang làm việc trên localhost và Gmail sẽ chặn mọi nỗ lực đăng nhập từ Swift Mailer đang chạy trên localhost.

Gửi email từ máy chủ cục bộ

Nếu bạn muốn điều này chạy trên localhost, bạn sẽ cần phải định cấu hình tài khoản Gmail của mình để chấp nhận đăng nhập từ các ứng dụng kém an toàn hơn. Tất nhiên, điều này có thể gây ra một số lỗ hổng trên tài khoản Gmail của bạn nhưng bạn chỉ có thể làm điều đó trong thời gian ngắn khi bạn cần kiểm tra ứng dụng này trên localhost. Sau khi kiểm tra, bạn có thể hoàn tác cài đặt trên tài khoản Gmail của mình. Khi ứng dụng của bạn đã được lưu trữ trên internet, bạn sẽ làm việc. Chúng tôi chỉ làm điều này vì chúng tôi đang sử dụng localhost.

Bạn thậm chí có thể thận trọng hơn và chỉ tạo một tài khoản Gmail khác cho những mục đích như thế này.

Vì vậy, hãy đăng nhập vào Gmail trên trình duyệt của bạn, truy cập https://myaccount.google.com/security#connectedapps và thay đổi giá trị 'Cho phép ứng dụng kém an toàn hơn' thành BẬT.

Bạn có thể tắt tính năng này sau khi kiểm tra xong dự án trên localhost.

Với điều này, bạn sẽ có thể gửi email từ localhost với liên kết xác minh sau khi người dùng đăng ký. Bây giờ, hãy xem lại phương thức sendVerificationEmail () và bạn sẽ nhận thấy rằng trong phần nội dung của email chúng tôi đang gửi cho người dùng, mã thông báo chúng tôi đã tạo cho người dùng cụ thể đó (mã thông báo là duy nhất) đã được đặt làm tham số trên liên kết để khi người dùng nhấp vào liên kết trong email, họ sẽ được dẫn đến ứng dụng của chúng tôi trên một trang có tên verify_email.php với mã thông báo đó trên URL. Như thế này:

<a href="http://localhost/cwa/verify-user/verify_email.php?token=0a150966418fa3a694bcb3ab8fcacd2063a096accc0ee33c3e8c863538ee825c0b52f2e1535d0e1377558c378ba5fc3106eb">Verify Email!</a>

Vì vậy, chúng tôi có thể nhận được mã thông báo này trong verify_email.php của chúng tôi như thế này (bình tĩnh, chúng tôi sẽ sớm tạo verify_email.php này):

$token = $_GET['token'];

Giờ đây, chúng tôi có thể sử dụng mã thông báo này để tìm nạp người dùng có mã thông báo cụ thể này (hãy nhớ mã thông báo là duy nhất) và nếu chúng tôi có được người dùng đó, chúng tôi cập nhật bản ghi của họ, thay đổi thuộc tính đã xác minh thành true trong cơ sở dữ liệu. Sau đó, chúng tôi có thể tự hào nói rằng chúng tôi đã xác minh địa chỉ email của người dùng đó.

Hãy tạo tệp verify_email.php này trong thư mục gốc của dự án của chúng tôi:

verify_email.php:

<?php
session_start();

$conn = new mysqli('localhost', 'root', '', 'verify-user');

if (isset($_GET['token'])) {
    $token = $_GET['token'];
    $sql = "SELECT * FROM users WHERE token='$token' LIMIT 1";
    $result = mysqli_query($conn, $sql);

    if (mysqli_num_rows($result) > 0) {
        $user = mysqli_fetch_assoc($result);
        $query = "UPDATE users SET verified=1 WHERE token='$token'";

        if (mysqli_query($conn, $query)) {
            $_SESSION['id'] = $user['id'];
            $_SESSION['username'] = $user['username'];
            $_SESSION['email'] = $user['email'];
            $_SESSION['verified'] = true;
            $_SESSION['message'] = "Your email address has been verified successfully";
            $_SESSION['type'] = 'alert-success';
            header('location: index.php');
            exit(0);
        }
    } else {
        echo "User not found!";
    }
} else {
    echo "No token provided!";
}

Lưu ý rằng việc đặt giá trị của giá trị đã xác minh thành 1 cũng giống như đặt giá trị đó thành true vì trong cơ sở dữ liệu MySQL, kiểu Boolean được hiểu là tinyint.

Bây giờ khi người dùng nhấp vào liên kết trong email của họ và đưa họ đến trang này, nó sẽ cập nhật trạng thái đã xác minh của người dùng đó thành true, đăng nhập và chuyển hướng họ đến trang index.php. Trong trang chỉ mục, sau khi xác minh người dùng, bạn sẽ nhận thấy rằng thông báo cảnh báo khuyên người dùng xác minh địa chỉ email của họ giờ đã biến mất và ở vị trí của nó, chúng ta có dòng chữ "Tôi đã xác minh !!!" nút chỉ hiển thị cho người dùng đã xác minh.

Một điều cuối cùng, trên trang index.php sau khi người dùng đăng nhập, có một liên kết đăng xuất trỏ đến tệp logout.php được cho là đăng xuất người dùng. Hãy tạo tệp đó trong thư mục gốc của ứng dụng của chúng tôi:

logout.php:

<?php
session_destroy();
unset($_SESSION['id']);
unset($_SESSION['username']);
unset($_SESSION['email']);
unset($_SESSION['verify']);
header("location: login.php");

Vì vậy, ngoài việc có thể đăng ký, xác minh email, đăng nhập, người dùng giờ đây cũng có thể đăng xuất.

Kết luận

Vì vậy, đó là về nó với đăng ký người dùng và xác minh email. Nếu bạn có bất kỳ bình luận, câu hỏi hoặc lời động viên, xin vui lòng để lại trong bình luận bên dưới. Và xin vui lòng, hãy nhớ chia sẻ bài đăng này hoặc giới thiệu trang web này cho bạn bè của bạn nếu bạn thấy nó hữu ích. Nó khuyến khích tôi rất nhiều!

Chúc một ngày tốt lành!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Giống như Phân biệt chữ hoa chữ thường trong MySQL

  2. Cách lấy bản ghi ngay từ hôm nay trong MySQL

  3. 4 cách để thay thế NULL bằng một giá trị khác trong MySQL

  4. Ví dụ MONTH () - MySQL

  5. Các lựa chọn thay thế MySQL Workbench hàng đầu