新手求教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
相关产品推荐
相关产品推荐

