

新闻资讯
技术学院本文详细讲解如何安全地从 mysql 数据库中查询并导出当前登录用户的专属数据(基于 session)到 excel,涵盖 sql 条件过滤、防注入优化、csv 导出实现及常见错误排查。
在 PHP Web 应用中,将数据库中当前登录用户专属数据导出为 Excel 是常见需求。但很多开发者遇到类似问题:WHERE UserName = $_SESSION['useruid'] 查询无结果,而全表查询却正常——这通常源于会话键名与数据库字段不匹配或SQL 注入风险未处理。
你原始代码的问题在于:
WHERE UserName = '".$_SESSION['useruid']."' // ❌ useruid 通常是用户ID(如 123),而 UserName 字段存的是用户名(如 "john_doe")
若数据库 tickets_list 表中 UserName 列存储的是用户名(如 "alice"),而 $_SESSION['useruid'] 存的是数字型用户 ID(如 5),则条件永远不成立。
✅ 正确写法应确保语义一致:
// 方案1:假设 SESSION 中存的是用户名(推荐命名清晰)
$username = $_SESSION['username'] ?? '';
if (empty($username)) {
die('未登录或会话失效');
}
$query = "SELECT id, title, status, created_at FROM tickets_list WHERE UserName = ?";
$stmt = mysqli_prepare($conn, $query);
mysqli_stmt_bind_param($stmt, 's', $username);
mysqli_stmt_
execute($stmt);
$result = mysqli_stmt_get_result($stmt);? 强烈建议使用预处理语句(Prepared Statement),避免 SQL 注入攻击。直接拼接 $_SESSION 变量存在严重安全隐患。
PHP 原生不直接生成 .xlsx,但 CSV 文件可被 Excel 完美打开,且实现轻量、兼容性高:
// 设置响应头,触发下载
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename="my_tickets_' . date('Y-m-d') . '.csv"');
$output = fopen('php://output', 'w');
// 写入 UTF-8 BOM(解决 Excel 中文乱码)
fprintf($output, "\xEF\xBB\xBF");
// 写入表头
fputcsv($output, ['ID', '标题', '状态', '创建时间']);
// 写入数据行
while ($row = mysqli_fetch_assoc($result)) {
fputcsv($output, [
$row['id'],
$row['title'],
$row['status'],
$row['created_at']
]);
}
fclose($output);
exit;导出用户专属数据的核心是:语义一致 + 参数安全 + 响应规范。不要依赖字符串拼接,优先使用预处理;不要假设 Session 键名含义,务必与数据库设计对齐;导出时用 CSV + BOM 是最稳妥的 Excel 兼容方案。完成以上步骤后,用户点击导出按钮,即可下载仅含自己工单的 Excel 文件。