PHP 数据库数据导入导出实现方案

4次阅读

php数据库导入导出核心是控制数据流向:导出为“库→格式→文件”,导入为“文件→解析→库”,关键在格式适配、内存控制与错误处理;csv用fputcsv/fgetcsv+响应头+bomexcel依赖phpspreadsheet;大数据需分页、分批、命令行或队列优化。

PHP 数据库数据导入导出实现方案

PHP 实现数据库数据的导入导出,核心在于控制数据流向:导出是“从数据库读取 → 转换格式 → 输出文件”,导入是“接收文件 → 解析内容 → 写入数据库”。关键不在语言本身,而在格式适配、内存控制和错误处理。

导出为 CSV(适合中小量数据)

CSV 简单通用,浏览器可直接下载,无需额外扩展。注意字段包裹、特殊字符转义和中文编码问题。

  • 使用 fputcsv() 自动处理引号、逗号、换行等转义,避免手动拼接出错
  • 输出前设置响应头:header(‘Content-Type: text/csv; charset=utf-8’);header(‘Content-Disposition: attachment; filename=”data.csv”‘);
  • 中文导出需在第一行写入 BOM 头(xEFxBBxBF),否则 Excel 可能乱码
  • 大数据量时用 分页查询 + flush() 防止超内存或超时,不一次性 fetchAll

导入 CSV 文件(带校验与容错)

不能直接信任上传文件内容。需检查 MIME 类型、大小、编码,并逐行解析验证。

  • fgetcsv() 逐行读取,不 file_get_contents 全加载,节省内存
  • 首行通常为字段名,需映射到数据库字段;跳过空行、注释行(如以 # 开头)
  • 对关键字段(如邮箱、手机号、日期)做基础校验,非法数据记录日志并跳过,不中断整个导入
  • 使用事务(BEGIN/COMMIT/ROLLBACK)包裹批量插入,失败时回滚,保持数据一致

支持 Excel(.xlsx)需借助第三方库

PHP 原生不支持 Excel 解析。推荐使用 PhpSpreadsheetphpoffice/phpspreadsheet),轻量且活跃维护。

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

  • 导出:创建 Spreadsheet 对象,写入数据,用 Xlsx writer 输出二进制流,响应头设为 application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
  • 导入:Reader 自动识别格式,支持 .xls/.xlsx/.csv,读取时指定工作表和范围,避免全表加载
  • 注意内存限制——大 Excel 文件建议用 chunk reading(按行迭代),而非 load 全部到内存
  • 单元格值类型(日期、数字、字符串)需用 getCalculatedValue() 或 getFormattedValue() 区分处理

大容量数据导入导出的优化策略

当单表超 10 万行,常规 PHP 流程易超时或爆内存。应绕过 Web 层,交由命令行或异步任务处理。

  • 导出大表:用 mysqldump 命令行工具 直接生成 SQL 或 CSV,PHP 只负责触发和打包下载
  • 导入大文件:拆分为多个小批次(如每次 5000 行),用队列(redis / rabbitmq)分发执行,前端轮询状态
  • 禁用 PHP 的自动类型转换(如 pdo::ATTR_EMULATE_PREPARES = false),防止数值精度丢失
  • 临时关闭外键检查(SET FOREIGN_KEY_CHECKS=0)和唯一索引(导入后再重建),提升写入速度
text=ZqhQzanResources