Làm cách nào để đăng ký người dùng đơn giản và đăng nhập vào biểu mẫu?
Điều đầu tiên bạn nên xem xét khi tạo cổng đăng ký người dùng là bạn sẽ lưu trữ tài khoản người dùng ở đâu và như thế nào. Với mục đích này, chúng tôi sẽ sử dụng cơ sở dữ liệu MySQL với bảng sau:
CREATE TABLE IF NOT EXISTS `accounts` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`Username` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`Hash` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`UserType` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Trong bảng này, chúng ta sẽ lưu trữ tên người dùng và mật khẩu băm. Chúng tôi cũng có một cột sẽ cho chúng tôi biết loại tài khoản; cho dù đó là người dùng bình thường hay quản trị viên.
Kết nối cơ sở dữ liệu
Rõ ràng là chúng ta cần kết nối với cơ sở dữ liệu và bắt đầu một phiên làm việc. Chủ đề này nằm ngoài phạm vi của câu trả lời này. Chúng tôi sẽ sử dụng PDO để kết nối với cơ sở dữ liệu chứa bảng mới của chúng tôi.
<?php
session_start();
$pdo = new PDO('mysql:host=localhost;charset=utf8mb4;dbname=test', 'dbuser', 'password', [
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
\PDO::ATTR_EMULATE_PREPARES => false
]);
Để được giải thích sâu hơn về cách hoạt động của PDO, hãy xem bài viết này: https://phpdelusions.net/pdo
Đăng ký chức năng
Bây giờ chúng ta có thể tạo một hàm đơn giản sẽ đăng ký một người dùng trong cơ sở dữ liệu. Hàm này sẽ chấp nhận 3 tham số:kết nối DB, tên người dùng và mật khẩu.
Hàm này sẽ tạo một hàm băm của mật khẩu, sau đó loại bỏ mật khẩu này. Đó là một ví dụ đơn giản, nhưng trong thực tế, bạn có thể muốn thêm nhiều kiểm tra hơn và làm cho điều này trở nên dễ hiểu hơn.
Thanh ghi hàmfunction register(PDO $db, string $username, string $password)
{
if (!$username || !$password) {
throw new Exception('Username and password is required!');
}
$hash = password_hash($password, PASSWORD_DEFAULT);
$stmt = $db->prepare('INSERT INTO accounts(Username, Hash, UserType) VALUES(?,?,?)');
$stmt->execute([
$username,
$hash,
'user' // or admin
]);
}
Chức năng đăng nhập
Giống như chúng ta đã làm với hàm đăng ký, chúng ta sẽ tạo một hàm để đăng nhập. Hàm sẽ chấp nhận các tham số tương tự, nhưng thay vì INSERT
nó sẽ SELECT
từ cơ sở dữ liệu dựa trên tên người dùng phù hợp.
Nếu có một bản ghi phù hợp trong cơ sở dữ liệu và mật khẩu được xác minh dựa trên hàm băm được lưu trữ thì chúng tôi sẽ lưu trữ thông tin người dùng trong một phiên. Phiên sẽ lưu thông tin này trên ổ cứng và nó sẽ cung cấp cho người dùng một cookie để sử dụng khi thực hiện các yêu cầu trong tương lai. Sử dụng cookie đó PHP sẽ mở cùng một phiên mỗi khi trang được yêu cầu.
Đăng nhập hàmfunction login(PDO $db, string $username, string $password)
{
if (!$username || !$password) {
throw new Exception('Username and password is required!');
}
$stmt = $db->prepare('SELECT Id, Hash, UserType FROM accounts WHERE Username=?');
$stmt->execute([ $username ]);
$user = $stmt->fetch();
if (!$user || !password_verify($password, $user['Hash'])) {
throw new Exception('Username or password incorrect!');
}
$_SESSION['loggedUserId'] = $user['Id'];
$_SESSION['UserType'] = $user['UserType'];
}
Mã đầy đủ
Bây giờ chúng ta có thể kết nối tất cả những thứ này lại với nhau và thêm một số biểu mẫu HTML. Phần HTML nằm ngoài phạm vi nhưng bạn muốn giữ nó tách biệt với logic PHP của mình. Có thể hoàn toàn nằm trong một tệp riêng biệt.
<?php
session_start();
$pdo = new PDO('mysql:host=localhost;charset=utf8mb4;dbname=test', 'inet', '5432', [
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
\PDO::ATTR_EMULATE_PREPARES => false
]);
function register(PDO $db, string $username, string $password)
{
if (!$username || !$password) {
throw new Exception('Username and password is required!');
}
$hash = password_hash($password, PASSWORD_DEFAULT);
$stmt = $db->prepare('INSERT INTO accounts(Username, Hash, UserType) VALUES(?,?,?)');
$stmt->execute([
$username,
$hash,
'user' // or admin
]);
}
function login(PDO $db, string $username, string $password)
{
if (!$username || !$password) {
throw new Exception('Username and password is required!');
}
$stmt = $db->prepare('SELECT Id, Hash, UserType FROM accounts WHERE Username=?');
$stmt->execute([ $username ]);
$user = $stmt->fetch();
if (!$user || !password_verify($password, $user['Hash'])) {
throw new Exception('Username or password incorrect!');
}
$_SESSION['loggedUserId'] = $user['Id'];
$_SESSION['UserType'] = $user['UserType'];
}
if (isset($_POST['register'])) {
register($pdo, $_POST['username'], $_POST['password']);
}
if (isset($_POST['login'])) {
login($pdo, $_POST['username'], $_POST['password']);
}
if (!isset($_SESSION['loggedUserId'])):
?>
<!-- Register form -->
<form method="post">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit" name="register" value="Register">
</form>
<!-- Login form -->
<form method="post">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit" name="login" value="Log in">
</form>
<?php
else:
echo 'Here be something after login. You are a '.$_SESSION['UserType'];
endif;
Đây là một ví dụ rất đơn giản về cách đăng ký và đăng nhập hoạt động trong PHP. Tôi không khuyên bạn nên sử dụng nó như hiện tại trên một trang web trực tiếp, nhưng cho mục đích học tập, nó sẽ chứng minh cách hoạt động của chức năng này.
Bạn có thể xây dựng trên nó và làm điều gì đó khi kiểu người dùng khác nhau. Hiển thị nhiều nội dung hơn cho nhiều người dùng có đặc quyền hơn.