You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

新手求教PHP Mysqli登录脚本实现,附dbconnect.php代码

PHP登录脚本开发入门指南(针对你的dbconnect.php优化)

嗨,作为PHP登录脚本开发的新手,先给你点个赞——开始动手写代码就是最好的学习方式!先看看你现有的dbconnect.php代码,我帮你梳理下可以优化的地方,以及后续登录脚本开发的关键要点:

你的原代码(补全截断部分)

<?php 
//core function 
function dbcon(){ 
    $user = "root"; 
    $pass = ""; 
    $host = "localhost"; 
    $db = "test"; 
    $connect = mysqli_connect($host,$user,$pass,$db); 
    $select = mysqli_select_db($connect,$db); 
} 

function host(){ 
    $h = "http://".$_SERVER['HTTP_HOST']."/test/"; 
    return $h; 
} 

function hRoot(){ 
    $url = $_SERVER['DOCUMENT_ROOT']."/test/"; 
    return $url; 
} 

//parse string 
function gstr(){ 
    $qstr = $_SERVER['QUERY_STRING'];
    // 推测你原本想处理查询字符串,比如过滤转义
    return $qstr;
}
?>

原代码的关键问题&优化方案

1. 数据库连接函数的核心优化

你的dbcon()目前无法复用连接、没有错误处理,这是首先要解决的问题,改进后的版本更实用安全:

<?php
// 建议把数据库凭证单独管理,生产环境用环境变量更安全
define('DB_HOST', 'localhost');
define('DB_USER', 'root');
define('DB_PASS', '');
define('DB_NAME', 'test');

function dbcon() {
    // 创建连接
    $connect = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);
    
    // 检查连接状态
    if (!$connect) {
        // 开发环境可以直接输出错误,生产环境要记录日志并跳转错误页
        die("数据库连接失败: " . mysqli_connect_error());
        // 生产环境替换为:
        // error_log("数据库连接失败: " . mysqli_connect_error());
        // header("Location: error.php");
        // exit;
    }

    // 设置字符集,防止乱码和部分注入风险
    mysqli_set_charset($connect, 'utf8mb4');

    // 返回连接对象,方便其他脚本调用
    return $connect;
}

// 优化host函数,自动适配HTTPS
function host(){
    $protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https://' : 'http://';
    return $protocol . $_SERVER['HTTP_HOST'] . "/test/";
}

function hRoot(){
    return $_SERVER['DOCUMENT_ROOT']."/test/";
}

// 增强查询字符串处理,防止XSS风险
function gstr(){
    if (!isset($_SERVER['QUERY_STRING'])) return '';
    return htmlspecialchars($_SERVER['QUERY_STRING'], ENT_QUOTES, 'UTF-8');
}
?>

2. 登录脚本开发的核心要点

有了可靠的数据库连接后,登录脚本需要覆盖以下关键环节:

  • 输入验证:检查用户名/密码是否为空、格式是否合法
  • 防SQL注入:必须用预处理语句执行查询,绝对不能直接拼接SQL
  • 密码安全:用password_hash()加密存储密码,登录时用password_verify()验证,永远不要明文存密码
  • 会话管理:登录成功后开启会话,存储用户标识并设置过期时间,防止会话劫持
  • 错误提示:不要泄露具体错误(比如统一提示“用户名或密码错误”)

给你一个简单的登录处理示例(login.php):

<?php
session_start();
require 'dbconnect.php';

// 只处理POST请求
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // 获取并过滤用户输入
    $username = trim($_POST['username']);
    $password = trim($_POST['password']);

    // 基础验证
    if (empty($username) || empty($password)) {
        $error = "请填写用户名和密码";
    } else {
        $conn = dbcon();
        // 预处理语句查询用户
        $stmt = mysqli_prepare($conn, "SELECT id, password FROM users WHERE username = ?");
        mysqli_stmt_bind_param($stmt, "s", $username);
        mysqli_stmt_execute($stmt);
        $result = mysqli_stmt_get_result($stmt);
        
        if ($user = mysqli_fetch_assoc($result)) {
            // 验证密码
            if (password_verify($password, $user['password'])) {
                // 登录成功,设置会话
                $_SESSION['user_id'] = $user['id'];
                $_SESSION['username'] = $username;
                // 设置会话1小时后过期
                $_SESSION['expire'] = time() + 3600;
                // 跳转到首页
                header("Location: " . host());
                exit;
            } else {
                $error = "用户名或密码错误";
            }
        } else {
            $error = "用户名或密码错误";
        }
        mysqli_stmt_close($stmt);
        mysqli_close($conn);
    }
}
?>

<!-- 登录表单 -->
<!DOCTYPE html>
<html>
<head>
    <title>登录</title>
</head>
<body>
    <?php if (isset($error)): ?>
        <p style="color: red;"><?php echo htmlspecialchars($error); ?></p>
    <?php endif; ?>
    <form method="POST" action="login.php">
        <label>用户名:</label>
        <input type="text" name="username" required><br>
        <label>密码:</label>
        <input type="password" name="password" required><br>
        <button type="submit">登录</button>
    </form>
</body>
</html>

3. 额外安全建议

  • 生产环境不要用root用户连接数据库,创建一个仅拥有必要权限的数据库用户
  • 开启PHP错误日志,不要直接把错误信息输出给用户
  • 用HTTPS传输登录数据,防止密码被拦截
  • 可以添加验证码功能,防止暴力破解

内容的提问来源于stack exchange,提问作者Tehnik Nusantara Jakarta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:46:08