本文详解如何在 php 中安全地从 mysql 查询当前登录用户的数据,并导出为 excel 文件,涵盖 sql 条件过滤、会话变量校验、防 sql 注入及基础 excel 导出方法。
在 Web 应用中,常需为当前登录用户导出其专属数据(如工单、订单等)至 Excel。你遇到的问题核心在于:SQL 查询条件与会话变量不匹配——代码中用 $_SESSION['useruid'] 去匹配数据库字段 UserName,但 useruid 通常是用户唯一 ID(如 123),而 UserName 字段存储的是用户名(如 'admin' 或 'john_doe'),类型与语义
均不一致,导致查询无结果。
✅ 正确做法是确保字段与会话变量语义一致。若数据库中用户标识字段为 UserName,则应使用 $_SESSION['username'](而非 useruid):
// ✅ 正确:字段名与会话键名语义对齐
$username = $_SESSION['username'] ?? '';
if (empty($username)) {
die('未登录或用户名不可用');
}
// 使用预处理语句防止 SQL 注入(强烈推荐)
$stmt = $conn->prepare("SELECT id, title, status, created_at FROM tickets_list WHERE UserName = ?");
$stmt->bind_param("s", $username);
$stmt->execute();
$result = $stmt->get_result();⚠️ 注意事项:
导出为 Excel 的轻量方案(无需第三方库):设置正确的 HTTP 头部,输出制表符分隔的 .xls 文件(兼容 Excel 打开):
// 设置响应头,触发下载
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename="my_tickets_' . date('Y-m-d') . '.xls"');
header('Cache-Control: max-age=0');
// 输出 Excel 表头(制表符 \t 分隔)
echo "ID\t标题\t状态\t创建时间\n";
// 输出数据行
while ($row = $result->fetch_assoc()) {
echo implode("\t", [
$row['id'],
$row['title'],
$row['status'],
$row['created_at']
]) . "\n";
}
exit;? 进阶建议:
总结:问题根源是会话键名与数据库字段语义错配 + 缺乏输入校验与安全防护。修正变量对应关系、采用预处理语句、规范导出流程,即可安全、精准地实现“仅导出当前用户数据”的需求。