
本文详细讲解如何安全地从 mysql 数据库中查询并导出当前登录用户的专属数据(基于 session)到 excel,涵盖 sql 条件过滤、防注入优化、csv 导出实现及常见错误排查。
在 php Web 应用中,将数据库中当前登录用户专属数据导出为 excel 是常见需求。但很多开发者遇到类似问题:WHERE UserName = $_session[‘useruid’] 查询无结果,而全表查询却正常——这通常源于会话键名与数据库字段不匹配或SQL 注入风险未处理。
✅ 正确做法:核对 Session 键名与字段语义
你原始代码的问题在于:
WHERE UserName = '".$_SESSION['useruid']."' // ❌ useruid 通常是用户ID(如 123),而 UserName 字段存的是用户名(如 "john_doe")
若数据库 tickets_list 表中 UserName 列存储的是用户名(如 “alice”),而 $_SESSION[‘useruid’] 存的是数字型用户 ID(如 5),则条件永远不成立。
✅ 正确写法应确保语义一致:
立即学习“PHP免费学习笔记(深入)”;
// 方案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 变量存在严重安全隐患。
? 导出为 Excel 兼容格式(csv)
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, "xEFxBBxBF"); // 写入表头 fputcsv($output, ['ID', '标题', '状态', '创建时间']); // 写入数据行 while ($row = mysqli_fetch_assoc($result)) { fputcsv($output, [ $row['id'], $row['title'], $row['status'], $row['created_at'] ]); } fclose($output); exit;
⚠️ 关键注意事项
- Session 必须已启动:导出脚本顶部需有 session_start();
- 字段名严格校验:通过 DESC tickets_list 确认 UserName 实际存储内容(用户名?邮箱?UUID?),再匹配对应 Session 键(如 $_SESSION[’email’] 或 $_SESSION[‘login_name’])
- 空值防御:始终检查 $_SESSION 变量是否存在且非空,避免 Notice 错误和逻辑漏洞
- 权限隔离:确保该导出接口仅对登录用户开放,且不能被篡改 WHERE 条件(如通过 URL 参数绕过)
✅ 总结
导出用户专属数据的核心是:语义一致 + 参数安全 + 响应规范。不要依赖字符串拼接,优先使用预处理;不要假设 Session 键名含义,务必与数据库设计对齐;导出时用 CSV + BOM 是最稳妥的 Excel 兼容方案。完成以上步骤后,用户点击导出按钮,即可下载仅含自己工单的 Excel 文件。