用php实现网站登录
PHP 实现网站登录的基本步骤
创建登录表单
使用 HTML 创建一个简单的登录表单,包含用户名和密码输入框,以及提交按钮。表单的 action 属性指向处理登录的 PHP 文件,method 属性设置为 POST。
<form action="login.php" method="POST">
<label for="username">用户名:</label>
<input type="text" id="username" name="username" required>
<label for="password">密码:</label>
<input type="password" id="password" name="password" required>
<button type="submit">登录</button>
</form>
处理登录逻辑
创建一个名为 login.php 的文件,用于处理用户提交的登录请求。验证用户名和密码是否匹配数据库中的记录。
<?php
session_start();
$host = 'localhost';
$dbname = 'your_database';
$username = 'your_db_username';
$password = 'your_db_password';
try {
$conn = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$user = $_POST['username'];
$pass = $_POST['password'];
$stmt = $conn->prepare("SELECT * FROM users WHERE username = :username");
$stmt->bindParam(':username', $user);
$stmt->execute();
$userData = $stmt->fetch(PDO::FETCH_ASSOC);
if ($userData && password_verify($pass, $userData['password'])) {
$_SESSION['user_id'] = $userData['id'];
$_SESSION['username'] = $userData['username'];
header("Location: dashboard.php");
} else {
echo "用户名或密码错误";
}
} catch(PDOException $e) {
echo "数据库连接失败: " . $e->getMessage();
}
?>
密码哈希处理
在用户注册时,使用 password_hash 函数对密码进行哈希处理,确保密码安全存储。

$hashedPassword = password_hash($plainPassword, PASSWORD_DEFAULT);
会话管理
使用 session_start() 开启会话,并在用户登录成功后存储用户信息到 $_SESSION 中。在其他受保护的页面中检查会话是否存在以验证用户是否已登录。
session_start();
if (!isset($_SESSION['user_id'])) {
header("Location: login.php");
exit();
}
安全注意事项
- 使用预处理语句防止 SQL 注入。
- 确保密码使用
password_hash和password_verify处理。 - 在登录表单中使用 HTTPS 协议传输数据。
- 设置会话过期时间并定期更新会话 ID。
完整示例代码
以下是一个完整的登录处理示例:

<?php
session_start();
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$dbHost = 'localhost';
$dbName = 'test_db';
$dbUser = 'root';
$dbPass = '';
try {
$conn = new PDO("mysql:host=$dbHost;dbname=$dbName", $dbUser, $dbPass);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$username = trim($_POST['username']);
$password = trim($_POST['password']);
$stmt = $conn->prepare("SELECT id, username, password FROM users WHERE username = :username");
$stmt->bindParam(':username', $username);
$stmt->execute();
if ($stmt->rowCount() == 1) {
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if (password_verify($password, $user['password'])) {
$_SESSION['user_id'] = $user['id'];
$_SESSION['username'] = $user['username'];
header("Location: welcome.php");
exit();
}
}
$error = "无效的用户名或密码";
} catch (PDOException $e) {
$error = "数据库错误: " . $e->getMessage();
}
}
?>
前端表单增强
可以添加客户端验证和 CSRF 令牌以提高安全性:
<form action="login.php" method="POST">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
<label for="username">用户名:</label>
<input type="text" id="username" name="username" required>
<label for="password">密码:</label>
<input type="password" id="password" name="password" required>
<button type="submit">登录</button>
</form>
密码重置功能
实现一个简单的密码重置功能,通过电子邮件发送重置链接:
// 生成重置令牌
$token = bin2hex(random_bytes(32));
$stmt = $conn->prepare("UPDATE users SET reset_token = :token, reset_expires = DATE_ADD(NOW(), INTERVAL 1 HOUR) WHERE email = :email");
$stmt->bindParam(':token', $token);
$stmt->bindParam(':email', $email);
$stmt->execute();
// 发送电子邮件
$resetLink = "https://example.com/reset-password.php?token=$token";
mail($email, "密码重置", "请点击链接重置密码: $resetLink");
以上代码和步骤提供了一个基本的 PHP 登录系统实现框架,可以根据实际需求进一步扩展和完善。






