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

Chuyển người dùng từ tên người dùng sang user_group

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àm
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
    ]);
}

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àm
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'];
}

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL CHAR () Hàm và đầu ra UTF8?

  2. Cơ sở dữ liệu đang ngủ và gây ra ngoại lệ

  3. Tạo bảng mới bằng cách chọn dữ liệu từ các bảng khác với TẠO BẢNG NHƯ

  4. MySQL, ĐẶT HÀNG THEO thứ tự chèn, không có cột sắp xếp

  5. Mysqldump có xử lý dữ liệu nhị phân một cách đáng tin cậy không?