勾选「记住我」时登录Cookie失效问题排查求助
问题排查与修复方案
先梳理下你的问题:未勾选「记住我」时用session能正常登录,但勾选后通过cookie登录失败。结合你给出的代码,我发现几个关键问题:
1. Cookie 路径未全局设置(最可能的直接原因)
在checklogin.php中设置cookie时,你没有指定路径参数:
setcookie("username",$myusername,time()+(86400*10));
默认情况下,cookie的生效路径是当前脚本所在的目录(比如你的checklogin.php可能在/login/目录下),而index.php在上级目录,这就导致index.php无法读取到这个cookie。
修复方法:
给setcookie加上全局路径"/",让整个站点都能访问该cookie:
setcookie("username", $myusername, time() + (86400 * 10), "/");
2. 代码逻辑的潜在风险与优化
除了路径问题,还有几个逻辑点可以优化,避免后续出现其他问题:
- 未处理无用户的情况:在
index.php中,当session和cookie都不存在时,$row是未定义的,直接$myusername = $row['username']会抛出错误。建议在赋值前先判断$row是否存在:if (isset($row)) { $myusername = $row['username']; $mypassword = $row['password']; } - 安全隐患:「记住我」只存储用户名存在风险,若cookie被篡改可能导致非法登录。建议存储一个加密的token而非明文用户名,或者同时存储用户名和加密后的密码片段,在
index.php中验证时匹配该片段。 - SQL注入风险:你的SQL语句直接拼接变量,存在严重的SQL注入风险,建议使用预处理语句来替代:
// 示例:cookie分支的预处理查询 $sql1 = "SELECT * FROM users WHERE username = ?"; $stmt = mysqli_prepare($berikane, $sql1); mysqli_stmt_bind_param($stmt, "s", $username); mysqli_stmt_execute($stmt); $result1 = mysqli_stmt_get_result($stmt); $row = mysqli_fetch_assoc($result1); $count1 = mysqli_num_rows($result1);
3. 调试建议
如果修复路径后仍有问题,可以添加调试代码确认cookie是否被正确读取:
在index.php开头添加:
var_dump($_COOKIE); // 查看是否能获取到username cookie exit;
如果输出中没有username,说明cookie确实没有被传递到index.php,再检查cookie的域名、路径、过期时间是否正确。
内容的提问来源于stack exchange,提问作者sermed
相关产品推荐
相关产品推荐

