PHP实现数据库连接并为登录用户设置用户名Cookie求助
嘿,作为PHP新手能自己动手写功能已经超棒啦!我先梳理你代码里的问题,再给你一个完整可运行的实现方案,顺便讲讲关键注意事项~
你的原始代码整理
function storeUsername{ $sql = "SELECT username, id FROM users WHERE email = '".escape($email)."' AND active = 1"; $result = query($sql); if(row_count($result) == 1) { $row = fetch_array($result); $username = $row['username']; { setcookie('username', $username, time() + 500000); } $_SESSION['username'] = $username; return true; } else { return false; } return true; } else { return false; }
代码里的核心问题
- 语法错误:函数定义缺少括号(应该是
function storeUsername()),大括号完全不匹配,多余的嵌套和末尾无效的else块导致逻辑混乱 - 变量未传入:
$email变量没有作为参数传入函数,函数根本不知道要查询哪个用户 - SQL安全风险:直接拼接SQL语句,哪怕用了
escape,也不如预处理语句稳妥,容易被注入攻击 - 逻辑冗余:多个重复的
return语句,实际只需要一层if-else就能完成判断
修正后的完整实现(含数据库连接)
我给你写一个基于mysqli扩展的完整版本,包含安全的数据库查询、Cookie/Session存储,适合新手理解:
// 必须在任何输出之前开启Session(否则会报错) session_start(); // 数据库连接函数(可以单独存到配置文件里) function connectDB() { $host = 'localhost'; // 你的数据库主机地址 $dbname = 'your_database'; // 你的数据库名称 $dbUser = 'your_user'; // 数据库用户名 $dbPwd = 'your_password'; // 数据库密码 $conn = mysqli_connect($host, $dbUser, $dbPwd, $dbname); if (!$conn) { die("数据库连接失败: " . mysqli_connect_error()); } return $conn; } // 自定义函数:根据邮箱查找已激活用户,存储用户名到Cookie和Session function storeUsername($email) { $conn = connectDB(); // 使用预处理语句,彻底避免SQL注入 $sql = "SELECT username, id FROM users WHERE email = ? AND active = 1"; $stmt = mysqli_prepare($conn, $sql); mysqli_stmt_bind_param($stmt, "s", $email); // "s"表示参数是字符串类型 mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); // 检查是否找到匹配的用户 if (mysqli_num_rows($result) == 1) { $row = mysqli_fetch_assoc($result); $username = $row['username']; // 设置Cookie:有效期7天,根目录生效(全站可用) setcookie('username', $username, time() + 60*60*24*7, "/"); // 同时存入Session(比Cookie更安全,数据存在服务器) $_SESSION['username'] = $username; // 清理资源 mysqli_stmt_close($stmt); mysqli_close($conn); return true; } else { // 未找到用户或用户未激活 mysqli_stmt_close($stmt); mysqli_close($conn); return false; } } // 示例:用户登录时调用该函数 if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['email'])) { $userEmail = trim($_POST['email']); // 注意:实际登录还要验证密码!这里可以加密码参数和验证逻辑 $loginSuccess = storeUsername($userEmail); if ($loginSuccess) { echo "登录成功!用户名已保存"; } else { echo "未找到该用户或用户未激活"; } }
新手必看的关键细节
- Session必须提前开启:
session_start()要放在所有HTML输出之前,哪怕是空格也不行 - 密码安全提示:你的代码里没加密码验证!正常登录要检查密码,记得用
password_hash()存密码,password_verify()验证密码,绝对不能明文存密码 - 优先用Session:Cookie存在用户浏览器,可能被篡改,显示用户名时优先从
$_SESSION取,Cookie只做备用 - 防XSS攻击:显示用户名时要用
htmlspecialchars()转义,比如:echo "欢迎回来," . htmlspecialchars($currentUsername) . "!"
如何在其他页面显示用户名?
在任何页面开头开启Session,然后这样获取:
session_start(); $currentUsername = ''; // 优先从Session取,没有再从Cookie取 if (isset($_SESSION['username'])) { $currentUsername = $_SESSION['username']; } elseif (isset($_COOKIE['username'])) { $currentUsername = $_COOKIE['username']; } // 显示用户名 if (!empty($currentUsername)) { echo "欢迎回来," . htmlspecialchars($currentUsername) . "!"; } else { echo "请先登录"; }
内容的提问来源于stack exchange,提问作者Lavesh Pillay
相关产品推荐
相关产品推荐

