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
相关产品推荐
相关产品推荐

