You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP通过CSV导入MySQL表异常:仅导入85行(总行不足300)求排查

排查CSV导入MySQL仅部分成功的问题

兄弟,你这情况我碰到过好几次,300条数据只导入85条,大概率是数据格式、数据库约束或者代码里的小细节没处理好,我给你拆解几个最常见的原因和对应的排查方法:

1. CSV数据格式“踩坑”了

  • 字段分隔符或引号问题:fgetcsv默认用逗号分隔,要是你的CSV里某些字段本身包含逗号(比如"Doe, John"这种),但没加双引号包裹,fgetcsv会把它拆成多个字段,导致INSERT语句的字段数量不匹配,直接跳过这条数据。
  • 换行符不兼容:不同系统的换行符不一样(Windows是\r\n,Linux是\n),fgetcsv可能识别错误,要么提前结束读取,要么把多行当成一条。你可以试试给fgetcsv指定换行符参数:
    $file = fopen($filename, "r");
    while (($data = fgetcsv($file, 1000, ",", '"', "\n")) !== FALSE) {
        // 你的导入逻辑
    }
    

2. 数据库约束把数据“拦住”了

  • 主键重复:customer表的id应该是主键吧?如果CSV里的id有重复值,或者这些id已经存在于数据库中,INSERT会直接失败,而且如果没加错误捕获,你根本看不到报错。
  • 非空/格式约束:比如name或email字段设了NOT NULL,但CSV里对应的行是空值;或者email格式不符合要求、日期字段格式不对,都会被数据库拒绝插入。

最关键的一步:给代码加错误捕获,把失败的行和错误信息打出来,瞬间就能定位问题:

// 假设你的INSERT语句补全字段和值后是这样
$import = "INSERT into customer (id,name,email,...) VALUES ('" . implode("','", $data) . "')";
$result = mysqli_query($con, $import);
if (!$result) {
    // 打印错误信息,方便排查
    echo "第" . $i . "行导入失败:" . mysqli_error($con) . "<br>";
}
$i++;

3. 代码逻辑有遗漏

  • 你代码里初始化了$i=0,会不会有跳过表头的逻辑?比如if($i>0)才执行插入,但可能表头之后的某些行因为判断错误被误跳过了?检查一下有没有这类判断,确认表头行数是否正确。
  • fgetcsv的第二个参数是每行的最大长度(你设的1000),如果某行内容超过1000字符,会导致读取失败,这条数据就被跳过了。可以把这个值改大,或者直接设为0(表示不限制长度):
    $data = fgetcsv($file, 0, ",");
    

4. 文件本身有问题

  • 可能CSV文件在上传过程中损坏了,或者本身就有异常行。你可以手动打开CSV文件,跳到第86行,看看那一行的内容有没有乱码、缺失字段、格式异常的情况。

先按这些步骤排查,尤其是加上错误捕获,把失败的错误信息打出来,很快就能找到问题所在了。

内容的提问来源于stack exchange,提问作者Haris Khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:44:26