【PHP【實戰項目】系統性教學】——使用最精簡的代碼完成用戶的登錄與退出

在開始這個 PHP 實戰項目的系統性教學之前,我們需要確保已經安裝了 PHP 和 MySQL(或任何其他支持的數據庫管理系統)環境。此外,我們還需要熟悉基本的 HTML/CSS/JavaScript 前端技術以及 MVC(Model-View-Controller)架構模式。本教程將逐步指導您如何用 PHP 編寫一個簡單的用戶登錄和退出的應用程序。

一. 創建數據庫結構

首先,我們需要建立一個數據庫來存儲我們的用戶信息。打開您的終端或者命令提示符窗口,輸入以下命令來創建一個新的數據庫和一個名爲 `users` 的表:

CREATE DATABASE login_system;
USE login_system;

CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL
);

這裏,`users` 表包含兩個字段:`username` 和 `password`。在實際應用中,我們應該使用更安全的哈希算法來存儲密碼而不是明文。爲了簡化演示,我們將直接存儲經過 MD5 加密後的密碼。請注意,MD5 並不是一種安全的哈希算法,但在本教程中它足以滿足我們的需求。

二. 設計控制器邏輯

接下來,我們定義一些控制器類和方法來處理用戶請求。我們將使用 MVC 模式來分離表示層(HTML/CSS/JS)和業務邏輯(PHP)。在我們的例子中,我們可以有一個 `LoginController` 類來實現登錄和註銷功能。

LoginController.php

<?php
class LoginController {

public function processLogin() {
// 從 POST 數據獲取用戶名和密碼
$username = $_POST['username'];
$password = $_POST['password'];

// 檢查用戶是否存在於數據庫中
if ($this->checkUserExistence($username)) {
// 比較密碼是否匹配
if ($this->comparePasswords($password, $this->getHashedPasswordFromDb($username))) {
$_SESSION['loggedIn'] = true; // 設置會話變量爲已登錄狀態
header('Location: welcome.php'); // 重定向到歡迎頁面
} else {
die('密碼錯誤!'); // 如果密碼不正確,則顯示錯誤消息
}
} else {
die('用戶不存在!'); // 如果用戶不存在,則顯示錯誤消息
}
}

private function checkUserExistence($username) {
// 根據 username 查詢數據庫中的用戶記錄
// 在實際應用中,應該使用 prepared statements 來防止 SQL injection
$query = "SELECT * FROM users WHERE username='" . $username . "' LIMIT 1";
return count($this->fetchData($query)) > 0; // 如果有結果返回,說明用戶存在
}

private function getHashedPasswordFromDb($username) {
// 根據 username 獲取數據庫中的哈希密碼
// 同樣地,在實際應用中,應該使用 prepared statements
$query = "SELECT password FROM users WHERE username='" . $username . "' LIMIT 1";
return end($this->fetchData($query)); // 返回數組中的最後一個元素,即哈希密碼
}

private function comparePasswords($plainTextPassword, $hashedPassword) {
// 將 plainTextPassword 通過相同的算法進行哈希運算,然後與數據庫中的哈希值比較
return md5($plainTextPassword) === $hashedPassword; // 如果不一致,則返回 false
}

private function fetchData($query) {
// 執行數據庫查詢並返回結果集
// 實際應用中可能需要連接數據庫、準備語句等等操作
return array(); // 爲了簡潔起見,此處省略具體實現
}

public function logout() {
session_destroy(); // 銷燬所有 session 數據
header('Location: index.php'); // 重定向回主頁
}
}
?>

在這個示例中,`processLogin()` 是主要的登錄函數,它會驗證用戶憑證並在成功時設置一個 `loggedIn` 會話變量。如果登錄失敗,則會顯示相應的錯誤信息。`logout()` 方法用於註銷當前登錄的用戶,並通過刪除所有的 session 數據來清理會話。

三. 編寫視圖模板

現在我們來編寫登錄和註銷功能的視圖部分。我們將使用基本的 HTML 結構和一些客戶端 JavaScript 來增強用戶體驗。

index.html

<!DOCTYPE html>
<html lang="zh-TW">
<head>
<meta charset="UTF-8">
<title>用戶登入與登出系統</title>
</head>
<body>
<h1>用戶登入</h1>
<p>請輸入用戶名稱和密碼以進行登錄</p>
<form action="login_controller.php" method="post">
<table>
<tr>
<td>用戶名</td>
<td><input type="text" name="username" required/></td>
</tr>
<tr>
<td>密碼</td>
<td><input type="password" name="password" required/></td>
</tr>
<tr>
<td/>
<td><button type="submit">登入</button></td>
</tr>
</table>
</form>
<h2>已經登入?</h2>
<p>如果您已經登入,並且想要登出的話,可以點擊下面的按鈕來執行這個動作:</p>
<a href="logout.php" class="btn btn-primary">登出</a>
</body>
</html>

這段 HTML 包含了登錄表單和登錄後顯示的鏈接,該鏈接指向了一個名爲 `logout.php` 的文件,我們在下一節將會實現它。

logout.php

<?php
require 'LoginController.php'; // 引入 LoginController 類別

$controller = new LoginController(); // 創建一個新的控制器的實例
$controller->logout(); // 調用 logout() 方法來處理登出請求
exit; // 停止腳本的運行,避免進一步的操作
?>

`logout.php` 是一個非常簡單的 PHP 文件,它只做了一件事情:當訪問者點擊「登出」鏈接時,就觸發 `LogoutController` 的 `logout()` 方法來清除會話數據並返回到主頁。

四. 測試與部署

現在我們有了基本的功能模塊,是時候來測試一下我們的應用程序了。打開瀏覽器,訪問 `index.html` 文件所在的路徑,填寫用戶名和密碼,然後嘗試登錄。如果一切順利,您應該能夠看到一條歡迎的信息,並且有一個連結可以讓您登出。單擊該連結後,應重新導向到 `index.html`,且狀態為未登錄。

一旦我們的應用程序通過了本地測試,就可以將其部署到 Web 服務器上以便其他人可以使用。這通常涉及設置虛擬目錄結構、配置 HTTP 伺服器和資料庫連線等步驟。這些細節取決於您使用的特定環境和平臺,例如 Apache + MySQL on Linux/Unix 還是 IIS + MS SQL Server on Windows 等。

總之,這只是一個基礎的 PHP 用戶登入和登出系統的簡化版本。實際應用中,您還應該考慮更多安全性問題,如帳號鎖定機制、防止暴力破解攻擊、Cookie 安全、跨站腳本防護(XSS)和跨站請求僞造(CSRF)保護等。此外,分層式架構、RESTful API 和前端框架(如 jQuery、AngularJS、React 等)也可以幫助提升性能和用戶體驗。

为您推荐