PHP - MySQL Đăng nhập: Hướng dẫn cho người mới bắt đầu

Xin chào các bạn đang học lập trình web! Hôm nay, chúng ta sẽ bắt đầu một hành trình thú vị vào thế giới của PHP và MySQL để tạo một hệ thống đăng nhập đơn giản nhưng mạnh mẽ. Với vai trò là người đã dạy这门 kỹ năng trong nhiều năm, tôi có thể告诉 bạn rằng việc thành thạo kỹ năng này giống như mở ra một cánh cửa bí mật trong thế giới phát triển web. Hãy cuộn lên áo và nhảy vào!

PHP - MySQL Login

Hiểu tổng quan

Trước khi bắt đầu lập mã, hãy dành một chút thời gian để hiểu chúng ta đang cố gắng đạt được điều gì. Hãy tưởng tượng bạn đang xây dựng một nhà trên cây. Bạn cần một nền tảng vững chắc, tường, mái nhà và một cách để vào ra. Hệ thống đăng nhập PHP-MySQL của chúng ta cũng tương tự:

  • Config.php: Đây là nền tảng của chúng ta, kết nối chúng ta với cơ sở dữ liệu.
  • Login.php: Hãy nghĩ về này như là cửa vào nhà trên cây của chúng ta.
  • Session.php: Đây theo dõi ai đang trong nhà trên cây.
  • Welcome.php: Nội thất ấm cúng nơi người dùng được ủy quyền lui tới.
  • Logout.php: Biển hiệu ra ngoài, chỉ người dùng lối ra.

Bây giờ, hãy xây dựng từng phần một bước một!

Config.php: Đặt nền móng

Tệp này giống như握手 bí mật giữa PHP và MySQL. Đây là nơi chúng ta lưu trữ chi tiết kết nối cơ sở dữ liệu của mình.

<?php
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', '');
define('DB_NAME', 'login_demo');

$conn = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);

if($conn === false){
die("LỖI: Không thể kết nối. " . mysqli_connect_error());
}
?>

Hãy phân tích này:

  • Chúng ta sử dụng define() để đặt các hằng số cho chi tiết cơ sở dữ liệu của mình.
  • mysqli_connect() thiết lập kết nối với cơ sở dữ liệu MySQL của chúng ta.
  • Nếu kết nối thất bại, chúng ta sử dụng die() để dừng thực thi và hiển thị thông báo lỗi.

Mẹo chuyên nghiệp: Đừng bao giờ chia sẻ thông tin kết nối cơ sở dữ liệu thực tế của bạn! Ví dụ này sử dụng giá trị mặc định, nhưng trong dự án thực tế, hãy giữ chúng bí mật!

Login.php: Người giữ cửa

Đây là nơi xảy ra phép màu. Người dùng nhập thông tin đăng nhập của họ và chúng ta kiểm tra xem họ có được phép vào hay không.

<?php
session_start();
require_once "config.php";

if($_SERVER["REQUEST_METHOD"] == "POST"){
$username = trim($_POST["username"]);
$password = trim($_POST["password"]);

$sql = "SELECT id, username, password FROM users WHERE username = ?";

if($stmt = mysqli_prepare($conn, $sql)){
mysqli_stmt_bind_param($stmt, "s", $param_username);
$param_username = $username;

if(mysqli_stmt_execute($stmt)){
mysqli_stmt_store_result($stmt);

if(mysqli_stmt_num_rows($stmt) == 1){
mysqli_stmt_bind_result($stmt, $id, $username, $hashed_password);
if(mysqli_stmt_fetch($stmt)){
if(password_verify($password, $hashed_password)){
session_start();
$_SESSION["loggedin"] = true;
$_SESSION["id"] = $id;
$_SESSION["username"] = $username;
header("location: welcome.php");
} else{
$login_err = "Tên đăng nhập hoặc mật khẩu không hợp lệ.";
}
}
} else{
$login_err = "Tên đăng nhập hoặc mật khẩu không hợp lệ.";
}
} else{
echo "Ồ! Có điều gì đó không đúng. Vui lòng thử lại sau.";
}
mysqli_stmt_close($stmt);
}
mysqli_close($conn);
}
?>

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Đăng nhập</title>
</head>
<body>
<h2>Đăng nhập</h2>
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">
<div>
<label>Tên đăng nhập</label>
<input type="text" name="username" required>
</div>
<div>
<label>Mật khẩu</label>
<input type="password" name="password" required>
</div>
<div>
<input type="submit" value="Đăng nhập">
</div>
</form>
</body>
</html>

Wow, có rất nhiều điều để hấp thụ! Hãy phân tích nó:

  • Chúng ta bắt đầu phiên và bao gồm tệp cấu hình.
  • Chúng ta kiểm tra xem form có được gửi bằng POST hay không.
  • Chúng ta sử dụng câu lệnh chuẩn bị để ngăn chặn SQL injection (một lỗ hổng bảo mật phổ biến).
  • Chúng ta xác minh mật khẩu sử dụng password_verify() (luôn mã hóa mật khẩu trong các dự án thực tế!).
  • Nếu đăng nhập thành công, chúng ta đặt các biến phiên và chuyển hướng đến welcome.php.
  • Chúng ta cũng có một form HTML đơn giản cho người dùng nhập thông tin đăng nhập của họ.

Lưu ý, trong các ứng dụng thực tế, bạn sẽ muốn thêm nhiều biện pháp bảo mật và xử lý lỗi hơn!

Session.php: Người bảo vệ

Tệp này kiểm tra xem người dùng có đăng nhập hay không. Nếu không, nó sẽ chuyển họ trở lại trang đăng nhập.

<?php
session_start();

if(!isset($_SESSION["loggedin"]) || $_SESSION["loggedin"] !== true){
header("location: login.php");
exit;
}
?>

Ngắn gọn và ngọt ngào! Mã này:

  • Bắt đầu phiên.
  • Kiểm tra xem người dùng có đăng nhập hay không.
  • Nếu không, nó chuyển hướng họ đến trang đăng nhập.

Welcome.php: Vùng VIP

Đây là nơi người dùng đến sau khi đăng nhập thành công.

<?php
require_once "session.php";
?>

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Chào mừng</title>
</head>
<body>
<h1>Xin chào, <b><?php echo htmlspecialchars($_SESSION["username"]); ?></b>. Chào mừng bạn đến với trang web của chúng tôi.</h1>
<p>
<a href="logout.php">Đăng xuất</a>
</p>
</body>
</html>

Đây là những gì đang xảy ra:

  • Chúng ta bao gồm session.php để đảm bảo chỉ người dùng đã đăng nhập mới có thể truy cập trang này.
  • Chúng ta hiển thị một thông báo chào mừng cá nhân hóa sử dụng tên người dùng lưu trữ trong phiên.
  • Chúng ta cung cấp một liên kết để đăng xuất.

Logout.php: Lối ra

Cuối cùng, chúng ta cần một cách để người dùng đăng xuất an toàn.

<?php
session_start();
$_SESSION = array();
session_destroy();
header("location: login.php");
exit;
?>

Chương trình này:

  • Bắt đầu phiên.
  • Xóa tất cả các biến phiên.
  • Đ毁灭 phiên.
  • Chuyển hướng người dùng trở lại trang đăng nhập.

Kết hợp tất cả lại

Bây giờ chúng ta đã xây dựng tất cả các mảnh, hãy tóm tắt cách chúng hoạt động cùng nhau:

Tệp Mục đích Chức năng chính
Config.php Kết nối cơ sở dữ liệu mysqli_connect()
Login.php Xác thực người dùng mysqli_prepare(), password_verify()
Session.php Quản lý phiên session_start(), $_SESSION checks
Welcome.php Trang người dùng được ủy quyền Hiển thị nội dung cá nhân hóa
Logout.php Kết thúc phiên người dùng session_destroy()

Và thế là bạn đã tạo xong một hệ thống đăng nhập PHP-MySQL cơ bản. Nhớ rằng, đây chỉ là bước đầu. Trong các ứng dụng thực tế, bạn sẽ muốn thêm các tính năng như:

  • Chức năng đặt lại mật khẩu
  • Tùy chọn ghi nhớ tôi
  • Xử lý lỗi mạnh mẽ hơn
  • Biện pháp bảo mật nâng cao

Tiếp tục thực hành, luôn tò mò và trước khi bạn biết, bạn sẽ dễ dàng xây dựng các ứng dụng web phức tạp. Chúc các bạn may mắn, các pháp sư web tương lai!

Credits: Image by storyset