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

勾选「记住我」时登录Cookie失效问题排查求助

问题排查与修复方案

先梳理下你的问题:未勾选「记住我」时用session能正常登录,但勾选后通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:39:57