PHP 实现按登录用户导出 SQL 数据到 Excel 文件

15次阅读

PHP 实现按登录用户导出 SQL 数据到 Excel 文件

本文详解如何在 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();

⚠️ 注意事项:

  • 切勿拼接未过滤的 $_SESSION 变量(如原代码中的 $_SESSION[‘useruid’] 直接拼入 SQL),极易引发 SQL 注入;
  • 始终校验会话变量是否存在且非空,避免 Notice 错误或空查询;
  • 确认数据库字段名准确:通过 DESCRIBE tickets_list 检查实际字段名是 UserName、username、user_name 还是 user_id,大小写与下划线需严格匹配。

导出为 Excel 的轻量方案(无需第三方库):设置正确的 http 头部,输出制表符分隔的 .xls 文件(兼容 Excel 打开):

立即学习PHP免费学习笔记(深入)”;

// 设置响应头,触发下载 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 "IDt标题t状态t创建时间n";  // 输出数据行 while ($row = $result->fetch_assoc()) {     echo implode("t", [         $row['id'],         $row['title'],         $row['status'],         $row['created_at']     ]) . "n"; } exit;

? 进阶建议:

  • 如需 .xlsx 格式或复杂样式(合并单元格、公式等),推荐使用 PhpSpreadsheet 库;
  • 生产环境务必启用错误报告控制(error_reporting(0) 或记录日志),避免敏感信息泄露;
  • 对导出接口添加权限验证(如检查用户是否具有 export 权限),防止越权访问。

总结:问题根源是会话键名与数据库字段语义错配 + 缺乏输入校验与安全防护。修正变量对应关系、采用预处理语句、规范导出流程,即可安全、精准地实现“仅导出当前用户数据”的需求。

text=ZqhQzanResources