如何用SESSION获取登录用户信息?托管网站代码故障排查及替代方案
嘿,我来帮你梳理这两个PHP相关的问题:
1. 如何使用SESSION获取网站中已登录用户的姓名和邮箱?
要通过SESSION获取已登录用户的姓名和邮箱,核心思路是先在用户登录时将唯一标识(比如用户名/用户ID)存入SESSION,之后通过这个标识查询数据库获取用户信息,具体步骤如下:
- 🔑 前提:用户登录成功后,你需要把用户的唯一标识(比如
username)存入SESSION,示例代码:<?php session_start(); // 假设登录验证通过,$username是验证后的用户名 $_SESSION['username'] = $username; ?> - 📝 获取用户信息的步骤:
- 必须在页面最开头调用
session_start()(任何输出之前,包括空格、HTML标签),开启SESSION功能; - 连接数据库(确保连接信息正确);
- 通过SESSION中的标识查询用户表,获取姓名和邮箱;
- 注意安全问题:绝对不要直接拼接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代码问题分析及解决方案
先看你的代码出现内容消失的核心问题,再给你修复方案:
问题点分析:
- 混用了
mysqli和mysql扩展:你用mysqli_connect()连接数据库(属于mysqli扩展),但查询用的是mysql_query()、mysql_fetch_array()——这两个是已废弃的mysql扩展函数,和mysqli扩展完全不兼容,会导致查询失败,最终没有任何输出。 - 缺乏错误处理:没有检查数据库查询是否成功,也没开启错误提示,出问题时看不到报错信息,只能看到内容消失。
- 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
相关产品推荐
相关产品推荐

