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

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()加密存储,不要明文存库

问题参考截图

问题截图1
问题截图2
问题截图3

内容的提问来源于stack exchange,提问作者Fun VK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 01:51:43