17370845950

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 打开):

// 设置响应头,触发下载
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;

? 进阶建议:

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

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