今天在这段代码中,我试图批量更新数据。用户上传CSV文件,系统检查文件类型是否正确,然后在WHILE循环的帮助下获取数据并相应地更新数据。看看下面的代码。
if(isset($_POST['upload'])) {
if($_FILES['theFile']['name']) {
$filename = explode(".", $_FILES['theFile']['name']);
if(end($filename) == "csv") {
$handle = fopen($_FILES['theFile']['tmp_name'], "r");
while($file_data = fgetcsv($handle)) {
$id = $DBcon->real_escape_string($file_data[0]);
$newdate = $DBcon->real_escape_string($file_data[1]);
$newdate = strtotime($newdate);
$newdate = date('Y-m-d', $newdate);
$query = "UPDATE IGNORE products SET expirydate='".$newdate."' WHERE id='".$vc."'";
if ($DBcon->query($query)) {
$serror = "Customer Updatation Successful";
} else {
$error = "Something Went Wrong - Contact Support";
}
}
fclose($handle);
$serror = "Successfully Fetched Details";
} else {
$error = "Please select a CSV file";
}
} else {
$error = "Please select a CSV file";
}
}
事情是一切都正常,直到我们遵守规则。我们来看一下效果很好的CSV文件。
123,11-06-2019
124,11-06-2019
125,11-06-2019
126,11-06-2019
127,11-06-2019
但是,当CSV输出在列之间不包含“”时,会引发不必要的错误。 这是CSV文件示例
123 11-06-2019
124 11-06-2019
125 11-06-2019
126 11-06-2019
127 11-06-2019
出现此错误:
Okay
Notice
: Undefined offset: 1 in
D:\server\filepath\htdocs\filename.php
on line
21
在这种情况下,第21行定义了下一列。
$newdate = $DBcon->real_escape_string($file_data[1]);
在这种情况下可以采取什么措施来避免/修复错误?当文件内容不符合某些要求时,例如文件不包含定义所有必填/期望列的一定数量的逗号时,我正在考虑引发错误。但是我该怎么做呢?我对这部分PHP很陌生。
谢谢您的时间。
答案 0 :(得分:0)
您可以简单地通过对$ file_data变量进行计数来确保您期望的字段数存在。您还可以进一步检查您期望的数据类型是否有效。有一个名为spaghetti code的库可以执行此操作。实际上,最好的全面处理方法是先对CSV进行绒毛处理,以确保其符合CSVUtils。还应注意,关于PHP fputcsv有RFC 4180,因此,如果首先由PHP生成CSV,则在某些情况下可能会出现问题。要添加此内容,甚至可以先检查文件的mime类型,然后将您的通知转为异常。解决方法可以在issues中找到。
计数示例。
if (count($file_data) < 2) {
// do something (e.g. fill error array or throw exeption)
}