PHP 导出当前登录用户数据到 Excel 文件的完整教程

19次阅读

PHP 导出当前登录用户数据到 Excel 文件的完整教程

本文详细讲解如何安全地从 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 文件。

text=ZqhQzanResources