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
相关产品推荐
相关产品推荐

