php新增数据怎么批量导入_csv文件数据导入数据库代码【解答】


PHP批量导入CSV到MySQL应采用fgetcsv()逐行读取配合多值INSERT语句,兼顾性能与可控性;避免单条循环插入和LOAD DATA INFILE(权限、路径、编码、调试等限制),需注意UTF-8无BOM编码、分隔符设置、字段类型匹配及小数据量先行验证。

PHP 读取 CSV 文件并批量插入 MySQL 的核心逻辑

直接用 fgetcsv() 逐行读取 + INSERT INTO ... VALUES (),(),() 多值批量插入,是性能和可控性兼顾的方案。别用单条 INSERT 循环,万级数据会慢到超时或内存溢出。

为什么不能直接用 LOAD DATA INFILE

虽然它最快,但多数共享主机禁用该命令;即使有权限,也要求 CSV 文件在数据库服务器本地(不是 PHP 所在机器),且需处理字段转义、编码、行结束符等细节,出错难调试。对日常导入场景,主动控制更稳妥。

  • LOAD DATA INFILE 需要 MySQL 的 FILE 权限,线上环境通常不开放
  • CSV 路径必须是 MySQL 服务端可访问路径,$_FILES['file']['tmp_name'] 上传临时文件不满足条件
  • 遇到中文乱码、引号嵌套、换行符在字段内等情况,LOAD DATA 容易报错中断,且无明确错误行提示

实际可用的 PHP 批量导入代码(含防错)

关键点:设置好字符集、限制单次批量数量(如 1000 行)、跳过表头、过滤空行、转义特殊字符。以下示例使用原生 MySQLi(非 PDO),避免预处理语句在批量场景下的开销。

$file = $_FILES['csv_file']['tmp_name'];
$handle = fopen($file, 'r');
if (!$handle) {
    die('无法打开 CSV 文件');
}

// 假设表结构为 users(id, name, email, created_at)
$values = [];
$batchSize = 1000;
$rowCount = 0;
$headerSkipped = false;

while (($row = fgetcsv($handle)) !== false) {
    if (!$headerSkipped) {
        $headerSkipped = true;
        continue; // 跳过第一行表头
    }
    if (empty(array_filter($row))) continue; // 跳过全空行

    $id = intval($row[0]);
    $name = mysqli_real_escape_string($mysqli, trim($row[1]));
    $email = mysqli_real_escape_string($mysqli, trim($row[2]));
    $created_at = date('Y-m-d H:i:s');

    $values[] = "($id, '$name', '$email', '$created_at')";

    if (count($values) >= $batchSize) {
        $sql = "INSERT INTO users (id, name, email, created_at) VALUES " . implode(',', $values);
        if (!mysqli_query($mysqli, $sql)) {
            die('批量插入失败: ' . mysqli_error($mysqli));
        }
        $values = [];
        $rowCount += $batchSize;
    }
}

// 插入剩余不足 batch 的数据
if (!empty($values)) {
    $sql = "INSERT INTO users (id, name, email, created_at) VALUES " . implode(',', $values);
    mysqli_query($mysqli, $sql);
    $rowCount += count($values);
}

fclose($handle);
echo "成功导入 $rowCount 条记录";

容易被忽略的三个坑

导入失败往往不出错信息,但数据不对——问题多藏在这些地方:

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

  • CSV 文件编码必须是 UTF-8 无 BOM,否则中文变问号;用编辑器(如 VS Code)另存时确认编码选项
  • fgetcsv() 默认以逗号分隔,若原始 CSV 用分号或制表符,需显式传参:fgetcsv($handle, 0, ';')
  • MySQL 字段类型不匹配:比如 CSV 中某列为 "123.45",但数据库字段是 INT,插入时会被截断为 123,且无警告
实际跑通的关键,是先拿 10 行小 CSV 测通路,再扩量。字段映射、空值处理、时间格式转换这些,得按你自己的表结构现场补全,没法靠模板一劳永逸。


# mysql  # php  # 编码  # 中文乱码  # csv  # ai  # vs code  # csv文件  # 为什么  # mysqli  # pdo  # int  # 循环  # bom  # 数据库  # 跳过  # 自己的  # 单条  # 线上  # 报错  # 藏在  # 编辑器  # 服务端  # 不满足  # 无法打开 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: Windows音频驱动无声音原因解析_声卡驱动错误修复步骤  C++中引用和指针有什么区别?(代码说明)  windows系统找不到无线网络怎么办_windows WLAN适配器故障排查  Win11任务栏怎么固定应用 Win11将软件图标固定到底部【步骤】  Win11如何更改用户账户文件夹名称 Win11修改C:Users用户名【终极教程】  如何在Golang中指定模块版本_使用go.mod控制版本号  如何使用Golang实现容器健康检查_监控和自动重启  Win11怎么关闭自动更新 Win11永久关闭系统更新的有效方法【技巧】  如何在JavaScript中动态拼接PHP的base_url与jQuery变量  Python代码测试策略_质量保障解析【教程】  如何使用Golang sort排序切片_Golang sort排序方法示例  如何使用Golang包导出规则_控制函数和变量可见性  Windows蓝屏BAD_POOL_HEADER故障详解_蓝屏池损坏错误修复指南  如何使用Golang优化模块引入路径_Golanggo mod tidy清理与优化方法  php485返回空数组怎么回事_php485数据接收为空排查指南【详解】  如何在Golang中引入测试模块_Golang测试包导入与使用实践  MAC如何设置网卡MAC地址克隆_MAC终端修改物理地址与环境模拟【教程】  如何使用Golang安装依赖库_管理模块和第三方包  Win11怎么清理C盘系统日志_Win11清理系统日志文件【步骤】  Linux如何安装JDK11_Linux环境变量配置与Java开发环境搭建【教程】  Win10怎么限制单程序CPU占用上限_Win10任务管理器亲和性或第三方工具均衡负载【技巧】  Ajax提交表单PHP怎么接收_处理Ajax发送的表单数据技巧【指南】  Win11怎么设置闹钟_Windows 11时钟应用闹钟设置指南【详解】  Win11怎么连接蓝牙耳机_Win11蓝牙设备配对与连接教程【步骤】  Win11麦克风没声音怎么设置_Win11麦克风权限及驱动修复【教程】  Win11如何设置计划任务 Win11定时执行程序教程【详解】  Python大文件处理策略_内存优化说明【指导】  php下载安装选zip还是msi格式_两种安装包对比【教程】  如何使用Golang实现微服务状态监控_Golang服务运行状态采集方法  php控制舵机角度怎么调_php发送pwm信号控制舵机转动【解答】  php后缀怎么变mp4能播放_让php伪装mp4正常播放的技巧【技巧】  Windows10如何更改盘符名称_Win10重命名硬盘分区卷标  Win11如何添加/删除输入法 Win11切换中英文输入法快捷键【设置】  Win11怎么设置任务栏对齐方式_Windows11个性化任务栏行为  Win11怎么激活Windows10_Win11激活Win10系统方法【步骤】  php怎么捕获异常_trycatch结构处理运行时错误的技巧【方法】  PHP接收参数长度超限怎么办_修改postmaxsize设置教程【解答】  Python装饰器复用技巧_通用能力解析【教程】  Win11怎么开启剪贴板历史记录_Windows11 Win+V键使用技巧  Mac怎么进行语音输入_Mac听写功能设置与使用【教程】  Win11怎么关闭定位服务_保护Win11位置隐私设置指南【详解】  Linux如何使用Curl发送请求_Linux下API接口测试与文件下载技巧【步骤】  为什么本地php环境运行php脚本卡顿_php执行效率优化方法与设置【说明】  Win10文件历史记录怎么用 Win10开启自动备份文件教程【防丢】  如何在 Go 后端安全获取并验证前端存储的 JWT?  如何使用Golang实现多重错误处理_Golangerror组合与判断方法  如何外贸网站设计-能留住客户提升用户体验!  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  MySQL 中使用 IF 和 CASE 实现查询字段的条件映射  Django 测试数据库表缺失与字段未创建问题的完整解决方案 

 2026-01-03

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.