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

如何用SESSION获取登录用户信息?托管网站代码故障排查及替代方案

嘿,我来帮你梳理这两个PHP相关的问题:

1. 如何使用SESSION获取网站中已登录用户的姓名和邮箱?

要通过SESSION获取已登录用户的姓名和邮箱,核心思路是先在用户登录时将唯一标识(比如用户名/用户ID)存入SESSION,之后通过这个标识查询数据库获取用户信息,具体步骤如下:

  • 🔑 前提:用户登录成功后,你需要把用户的唯一标识(比如username)存入SESSION,示例代码:
    <?php
    session_start();
    // 假设登录验证通过,$username是验证后的用户名
    $_SESSION['username'] = $username;
    ?>
    
  • 📝 获取用户信息的步骤:
    1. 必须在页面最开头调用session_start()(任何输出之前,包括空格、HTML标签),开启SESSION功能;
    2. 连接数据库(确保连接信息正确);
    3. 通过SESSION中的标识查询用户表,获取姓名和邮箱;
    4. 注意安全问题:绝对不要直接拼接SESSION变量到SQL语句中,避免SQL注入,推荐使用预处理语句。

安全的示例代码:

<?php
session_start();
// 开启错误提示方便调试(生产环境建议关闭)
error_reporting(E_ALL);
ini_set('display_errors', 1);

// 数据库连接
$db = mysqli_connect('localhost', '你的用户名', '你的密码', '你的数据库名');
if (!$db) {
    die("数据库连接失败: " . mysqli_connect_error());
}

// 检查SESSION中是否存在用户名
if (!isset($_SESSION['username'])) {
    die("用户未登录,请先登录");
}

// 使用预处理语句查询,防止SQL注入
$username = $_SESSION['username'];
$sql = "SELECT name, email FROM users WHERE username = ?";
$stmt = mysqli_prepare($db, $sql);
mysqli_stmt_bind_param($stmt, "s", $username);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);

// 获取查询结果
if ($row = mysqli_fetch_assoc($result)) {
    echo "Hello, " . $row['name'] . " (" . $row['email'] . ").";
} else {
    echo "未找到该用户信息";
}

// 关闭连接和语句
mysqli_stmt_close($stmt);
mysqli_close($db);
?>

2. 你的PHP代码问题分析及解决方案

先看你的代码出现内容消失的核心问题,再给你修复方案:

问题点分析:

  1. 混用了mysqli和mysql扩展:你用mysqli_connect()连接数据库(属于mysqli扩展),但查询用的是mysql_query()、mysql_fetch_array()——这两个是已废弃的mysql扩展函数,和mysqli扩展完全不兼容,会导致查询失败,最终没有任何输出。
  2. 缺乏错误处理:没有检查数据库查询是否成功,也没开启错误提示,出问题时看不到报错信息,只能看到内容消失。
  3. SQL注入风险:直接把$_SESSION['username']拼接到SQL语句中,存在安全隐患(即使SESSION存储在服务器端,也不能完全排除被篡改的可能)。

修复方案:

方案1:修正扩展混用问题(基础版本)

把所有mysql_*函数替换为对应的mysqli_*函数,注意mysqli_query()需要传入数据库连接对象作为第一个参数:

<?php
session_start();
// 开启错误提示调试
error_reporting(E_ALL);
ini_set('display_errors', 1);

$db = mysqli_connect('localhost', '******', '*******', '********');
// 检查数据库连接是否成功
if (!$db) {
    die("数据库连接失败: " . mysqli_connect_error());
}

// 检查SESSION是否存在用户名
if (!isset($_SESSION['username'])) {
    die("用户未登录");
}

$sql = "SELECT name, email FROM users WHERE username = '" . $_SESSION['username'] . "' ";
$result = mysqli_query($db, $sql); // 替换为mysqli_query,传入$db

// 检查查询是否成功
if (!$result) {
    die("查询失败: " . mysqli_error($db));
}

$row = mysqli_fetch_array($result); // 替换为mysqli_fetch_array
if ($row) {
    echo "Hello, " . $row['name'] . " (" . $row['email'] . ").";
} else {
    echo "未找到用户信息";
}

mysqli_close($db);
?>

方案2:使用预处理语句(安全推荐版本)

这是更安全的写法,彻底避免SQL注入:

<?php
session_start();
error_reporting(E_ALL);
ini_set('display_errors', 1);

$db = mysqli_connect('localhost', '******', '*******', '********');
if (!$db) {
    die("数据库连接失败: " . mysqli_connect_error());
}

if (!isset($_SESSION['username'])) {
    die("用户未登录");
}

$username = $_SESSION['username'];
$sql = "SELECT name, email FROM users WHERE username = ?";
$stmt = mysqli_prepare($db, $sql);
mysqli_stmt_bind_param($stmt, "s", $username);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);

if ($row = mysqli_fetch_assoc($result)) {
    echo "Hello, " . $row['name'] . " (" . $row['email'] . ").";
} else {
    echo "未找到用户信息";
}

mysqli_stmt_close($stmt);
mysqli_close($db);
?>

其他显示结果的方式:

  • 调试时,可以用var_dump($row)或print_r($row)来输出查询到的数组,直观查看数据;
  • 开启PHP错误显示(如上面代码中的error_reporting(E_ALL); ini_set('display_errors', 1);),这样能看到具体的错误信息,快速定位问题;
  • 可以把结果写入日志文件,方便生产环境排查问题。

内容的提问来源于stack exchange,提问作者Breaking News

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:19:48