电话
400 9058 355
本文介绍如何使用 php 逐行读取 csv 文件,严格校验指定列(如第 4 列)的字符串长度是否恒为 3;仅当全部行均通过验证时才执行文件上传,否则中止并提示错误。
在 PHP 中处理上传的 CSV 文件时,常见的误区是将 move_uploaded_file() 放在循环外部且无条件执行——这会导致即使某行校验失败,文件仍被上传。正确做法是:先完*量校验,再根据结果决定是否上传。核心思路是引入一个布尔标志变量(如 $valid = true),在循环中一旦发现不符合条件的数据(例如第 4 列 $data[3] 的长度不等于 3),立即将其设为 false 并 break 跳出循环。
以下是优化后的完整逻辑示例(含关键注释):
// 假设已成功打开 CSV 文件句柄 $handle = fopen($_FILES["csv_file"]["tmp_name"], "r"); if ($handle === false) { die("无法打开上传的 CSV 文件"); } $valid = true; while (($data = fgetcsv($handle)) !== false) { // 注意:CSV 索引从 0 开始,$data[3] 表示第 4 列(如 inventory code) $invCode = $data[3] ?? ''; // 使用空合并防止索引不存在导致 Notice // 严格校验长度必须恰好为 3(去除首尾空格后) if (strlen(trim($invCode)) !== 3) { $valid = false; break; // 发现异常立即退出,避免无效遍历 } } fclose($handle); // 校验完成后及时关闭文件句柄 // 根据校验结果统一决策 if ($valid) { $target_file = 'uploads/' . basename($_FILES["csv_file"]["name"]); if (move_uploaded_file($_FILES["csv_file"]["tmp_name"], $target_file)) { echo "✅ CSV 文件校验通过,已成功上传至:{$target_file}"; } else { echo "❌ 文件移动失败,请检查目标目录权限"; } } else { echo "❌ 校验失败:至少有一行的第 4 列值长度不等于 3,请修正后重试。"; }
关键注意事项:
该方案确保了“全量校验优先、动作执行滞后”的健壮流程,彻底解决原代码中“部分成功即上传”的逻辑缺陷。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...