You need to enable JavaScript to run this app. PHP登录后SESSION取用户名为空及跨页面获取用户信息的实现方法
优惠活动
大模型
产品
解决方案
定价
更多

PHP登录后SESSION取用户名为空及跨页面获取用户信息的实现方法

核心问题定位

你遇到的Hey !空值问题根本原因是从未将用户名写入$_SESSION['username']这个键:当前代码在登录验证通过后,仅设置了$_SESSION['loggedin'] = true,没有将数据库查询到的用户名赋值到session中,自然取值为null。

原有代码展示

登录验证脚本(validation.php)

<?php
session_start();

$connection = mysqli_connect('localhost','root','admin');
mysqli_select_db($connection, 'user_registration');

$email = $_POST['email'];
$password = $_POST['password'];

$verify_emailpass = " select * from user_table where email = '$email' && password = '$password'";
$result = mysqli_query($connection, $verify_emailpass);
$num = mysqli_num_rows($result);

if($num == 1){
  $_SESSION['loggedin'] = true;
  // 问题行:此处直接取session中不存在的username值
  $username = $_SESSION['username'];
  echo "Hey $username !";
}else{
  echo "<b>Incorrect Email or Password.</b>";
}
?>

登录表单HTML

<form action="validation.php" method="post">
  <div class="row content">
    <div class="col-12">
      <b><p class="text-align">Se connecter:</p></b>
    </div>
    <div class="col-12">
      <input name="email" type="text" class="input-box shadow-sm" placeholder="Adresse E-mail" required/>
    </div>
    <div class="col-12">
      <input name="password" type="password" class="input-box shadow-sm" placeholder="Mot de passe" required/>
    </div>
  </div>
  <div class="button-2">
    <button id="loginButton" type="submit" class="next-button shadow-sm"><img src="res/icons/button-arrow.svg" width="45px" height="45px" /></button>
  </div>
</form>

修复方案

1. 解决用户名空值问题

登录验证通过后,先从数据库查询结果中取出用户信息,再将需要的字段写入session,修改后的验证逻辑:

if($num == 1){
  // 从查询结果中取出用户数据(关联数组形式)
  $user = mysqli_fetch_assoc($result);
  // 将用户名存入session,对应你数据库user_table里的实际字段名
  $_SESSION['username'] = $user['username'];
  $_SESSION['loggedin'] = true;
  // 此时可以正常从session取到值,也可以直接用$user['username']输出
  echo "Hey " . $_SESSION['username'] . "!";
}else{
  echo "<b>Incorrect Email or Password.</b>";
}

注意:如果你的user_table表里用户名字段不叫username(比如叫name、nickname),要把上面的$user['username']换成实际的字段名。

2. 跨页面获取用户信息的方法

要在个人中心等其他页面使用用户信息,遵循以下规则:

  • 所有需要读取/写入session的PHP页面,必须在代码最开头(任何输出内容之前)调用session_start();,否则无法读取已存储的session值。
  • 登录成功时,提前把后续需要展示的用户字段(比如用户ID、邮箱、头像地址等)存入session,比如:
    $_SESSION['user_id'] = $user['id'];
    $_SESSION['email'] = $user['email'];
    $_SESSION['avatar'] = $user['avatar_path'];
    
  • 其他页面直接从session取值即可,建议加个登录状态校验,避免未登录访问报错:
    <?php
    // 页面开头必须先开启session
    session_start();
    // 未登录直接跳转到登录页
    if(empty($_SESSION['loggedin'])){
      header("Location: login.html");
      exit;
    }
    // 直接取需要的用户信息展示
    $username = $_SESSION['username'];
    echo "欢迎回来,$username";
    ?>
    

现有代码的潜在风险提示
  • 直接拼接POST参数到SQL语句中,存在严重的SQL注入风险,建议改用mysqli预处理语句写查询逻辑。
  • 数据库中明文存储密码非常不安全,建议注册时用password_hash()加密存储密码,登录时用password_verify()校验密码正确性,不要明文比对。
  • 当前代码没有处理数据库连接失败、查询失败的容错逻辑,建议加对应的错误判断,避免异常时无提示。

内容的提问来源于stack exchange,提问作者Abderrahmane Bourri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 04:54:03