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

PHP登录脚本中Session未设置错误求助

问题诊断与修复方案

嘿,兄弟,你的问题根源太明显了——你在登录成功后完全没有给$_SESSION['email']赋值!看你login.php里的这段代码:

if($nr==1){
    $_SESSION['email'];  // 这里只是引用变量,没有任何赋值操作!
    header('Location:menu.php');
}

这行$_SESSION['email'];啥也不会做,它只是读取这个Session变量(但此时它还不存在),根本没把用户的邮箱存进去,所以跳转到menu.php后自然会显示“not set”。

第一步:修复Session赋值问题

你需要先从数据库查询结果中取出用户的邮箱,然后赋值给Session变量。修改login.php的登录成功分支:

if($nr==1){
    // 从查询结果中取出用户数据
    $user = mysqli_fetch_assoc($rezultat);
    // 把用户邮箱存入Session
    $_SESSION['email'] = $user['email'];
    header('Location:menu.php');
    exit; // 跳转后一定要加exit,避免后续代码意外执行
}

第二步:顺便修复SQL注入风险(非常重要)

你现在直接把POST的$email和$pass拼进SQL语句里,这是严重的SQL注入漏洞!必须改用预处理语句来避免这个问题,修改后的数据库查询部分应该是这样:

if(isset($_POST['log'])){
    include "database.php";
    $email = $_POST['email'];
    $pass = $_POST['pas'];
    
    // 使用预处理语句防注入
    $query = "SELECT * from users WHERE email=? AND pass=?";
    $stmt = mysqli_prepare($db, $query);
    mysqli_stmt_bind_param($stmt, "ss", $email, $pass);
    mysqli_stmt_execute($stmt);
    $rezultat = mysqli_stmt_get_result($stmt);
    
    if(!$rezultat){
        echo "Failed";
    }
    $nr = mysqli_num_rows($rezultat);
    if($nr==1){
        $user = mysqli_fetch_assoc($rezultat);
        $_SESSION['email'] = $user['email'];
        header('Location:menu.php');
        exit;
    } else {
        echo "invalid";
    }
}

额外提醒(必看)

  1. 密码存储:你现在直接存明文密码是极度不安全的,应该用password_hash()加密后存储,登录时用password_verify()验证。
  2. session_start():确保在所有输出之前调用,你的代码里这部分是对的,保持住。

这样修改后,登录成功后Session里就会有用户邮箱,menu.php就能正常显示了。

内容的提问来源于stack exchange,提问作者Genalb Bajrami

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:42:10