如何使用PHP构建一个简单的登录系统

2023-07-15 23:15:11

登录功能在许多业务系统中都是非常重要的基础功能,那么在php中要如何实现呢?


  1. 创建一个数据库表格来存储用户信息。表格应该包含至少以下字段:id(自增主键),用户名,密码(加密存储),电子邮件等。

  2. 创建一个登录页面(login.php),包含一个表单,要求用户输入用户名和密码。

  3. 在login.php中,使用PHP代码来验证用户输入的用户名和密码是否与数据库中的记录匹配。你可以使用SQL查询来检查用户名和密码是否正确。

  4. 如果用户名和密码匹配成功,将用户重定向到受保护的页面(例如,dashboard.php)。

  5. 如果用户名和密码不匹配,显示错误消息并保持用户在登录页面。

以下是一个简单的示例代码:

login.php:

<?php
session_start();

// 检查用户是否已经登录,如果是则重定向到受保护的页面
if(isset($_SESSION["loggedin"]) && $_SESSION["loggedin"] === true){
    header("location: dashboard.php");
    exit;
}

// 包含数据库连接代码
require_once "config.php";

// 定义变量并初始化为空
$username = $password = "";
$username_err = $password_err = "";

// 处理表单提交
if($_SERVER["REQUEST_METHOD"] == "POST"){

    // 检查用户名是否为空
    if(empty(trim($_POST["username"]))){
        $username_err = "请输入用户名。";
    } else{
        $username = trim($_POST["username"]);
    }

    // 检查密码是否为空
    if(empty(trim($_POST["password"]))){
        $password_err = "请输入密码。";
    } else{
        $password = trim($_POST["password"]);
    }

    // 验证用户名和密码
    if(empty($username_err) && empty($password_err)){
        // 准备SQL查询语句
        $sql = "SELECT id, username, password FROM users WHERE username = ?";

        if($stmt = mysqli_prepare($link, $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: dashboard.php");
                        } else{
                            // 密码错误
                            $password_err = "密码错误。";
                        }
                    }
                } else{
                    // 用户名不存在
                    $username_err = "用户名不存在。";
                }
            } else{
                echo "出现了一些问题,请稍后再试。";
            }

            // 关闭语句
            mysqli_stmt_close($stmt);
        }
    }

    // 关闭连接
    mysqli_close($link);
}
?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>登录</title>
    <style>
        .wrapper{ width: 360px; padding: 20px; }
    </style>
</head>
<body>
    <div class="wrapper">
        <h2>登录</h2>
        <p>请输入您的用户名和密码。</p>
        <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">
            <div>
                <label>用户名</label>
                <input type="text" name="username" value="<?php echo $username; ?>">
                <span><?php echo $username_err; ?></span>
            </div>    
            <div>
                <label>密码</label>
                <input type="password" name="password">
                <span><?php echo $password_err; ?></span>
            </div>
            <div>
                <input type="submit" value="登录">
            </div>
            <p>还没有账号?<a href="register.php">注册</a></p>
        </form>
    </div>    
</body>
</html>

在上面的代码中,我们首先检查用户是否已经登录,如果是,则重定向到受保护的页面。然后,我们处理表单提交,验证用户名和密码是否为空,并执行SQL查询来验证用户名和密码是否匹配。如果匹配成功,我们开始一个新的会话,并将用户信息存储在会话变量中。最后,我们重定向用户到受保护的页面。

请注意,上面的代码中使用了一个名为config.php的文件来包含数据库连接代码。你需要创建一个config.php文件,并在其中定义数据库连接变量。例如:

<?php
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'your_username');
define('DB_PASSWORD', 'your_password');
define('DB_NAME', 'your_database_name');

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

if($link === false){
    die("连接数据库失败:" . mysqli_connect_error());
}
?>

这是一个简单的登录系统的基本框架。你可以根据需要进行修改和扩展,例如添加注册页面、密码重置功能等。