PHP如何正确修改SESSION值 动态赋值当前登录用户ID
PHP用户头像加载脚本Session硬编码问题修复方案
问题描述
当前用于加载/更新用户头像的脚本存在逻辑错误,固定将$_SESSION["id"]赋值为1,导致所有访问用户都会读取tb_user表中ID为1的用户数据,即使用户使用ID为222的账号登录,也无法获取对应账号的信息。
现有问题代码:
<?php $conn = mysqli_connect("local host", "root", "root", "penguin_rus"); $_SESSION["id"] = 1; $sessionId = $_SESSION["id"]; $user = mysqli_fetch_assoc(mysqli_query($conn, "SELECT * FROM tb_user WHERE id = $sessionId")); ?>
问题根因
- 业务脚本中硬编码
$_SESSION["id"] = 1,直接覆盖了登录流程中应该存储的真实用户ID - 缺少
session_start()调用,PHP Session功能默认不会自动开启,不调用该函数无法正常读写$_SESSION变量 - 数据库连接主机名填写错误,
local host存在多余空格,正确主机名应为localhost - SQL语句直接拼接变量,存在SQL注入安全风险
- 缺少登录状态校验逻辑,未登录用户可以直接访问用户数据页面
正确实现逻辑
$_SESSION["id"]的赋值操作只应该在用户登录校验成功的逻辑中执行一次,后续所有业务页面直接读取Session中存储的ID即可,禁止重复赋值覆盖。
1. 登录页逻辑(写入Session)
用户提交账号密码、与数据库校验通过后,将查询到的对应用户ID写入Session,示例代码:
<?php // 所有使用Session的页面,最顶部必须先调用session_start(),调用前不能有任何输出(包括HTML、空格、echo) session_start(); // 连接数据库 $conn = mysqli_connect("localhost", "root", "root", "penguin_rus"); if (!$conn) { die("数据库连接失败:" . mysqli_connect_error()); } // 接收登录表单参数,使用预处理语句防止SQL注入 $username = $_POST['username']; $password = $_POST['password']; $stmt = mysqli_prepare($conn, "SELECT id, avatar FROM tb_user WHERE username = ? AND password = ?"); mysqli_stmt_bind_param($stmt, "ss", $username, $password); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); $loginUser = mysqli_fetch_assoc($result); if ($loginUser) { // 校验通过,将真实用户ID存入Session,不要写固定值 $_SESSION["id"] = $loginUser['id']; // 跳转到用户中心/头像页面 header("Location: user_avatar.php"); exit; } else { echo "用户名或密码错误"; } mysqli_close($conn); ?>
2. 头像加载/更新页逻辑(读取Session)
业务页面不要重新给$_SESSION["id"]赋值,直接读取登录时存储的ID查询用户数据即可,示例代码:
<?php session_start(); // 校验登录状态,未登录直接跳转到登录页 if (!isset($_SESSION["id"])) { header("Location: login.php"); exit; } $conn = mysqli_connect("localhost", "root", "root", "penguin_rus"); if (!$conn) { die("数据库连接失败:" . mysqli_connect_error()); } $userId = $_SESSION["id"]; // 预处理查询当前登录用户数据 $stmt = mysqli_prepare($conn, "SELECT * FROM tb_user WHERE id = ?"); mysqli_stmt_bind_param($stmt, "i", $userId); // i代表参数为整数类型 mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); $user = mysqli_fetch_assoc($result); // 后续可直接使用$user中的数据,比如$user['avatar']为用户头像地址 ?>
注意事项
session_start()必须在所有脚本逻辑的最顶部调用,前面不能存在任何输出内容,否则会导致Session读写异常- 禁止在登录逻辑之外的业务页面给
$_SESSION["id"]等用户标识字段赋值,避免覆盖真实登录状态 - 所有数据库查询操作建议使用预处理语句,不要直接拼接变量到SQL语句中,防范SQL注入风险
- 生产环境不要使用root账号连接数据库,且用户密码必须使用
password_hash()加密存储,不要明文存库
问题参考截图
内容的提问来源于stack exchange,提问作者Fun VK
相关产品推荐
相关产品推荐



