从CSV文件导入数据时如何消除“ Notice:Undefined offset:1”错误

时间:2019-06-21 08:59:03

标签: php mysql

今天在这段代码中,我试图批量更新数据。用户上传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

截屏: http://prntscr.com/o4r9vi

在这种情况下,第21行定义了下一列。

$newdate = $DBcon->real_escape_string($file_data[1]);

在这种情况下可以采取什么措施来避免/修复错误?当文件内容不符合某些要求时,例如文件不包含定义所有必填/期望列的一定数量的逗号时,我正在考虑引发错误。但是我该怎么做呢?我对这部分PHP很陌生。

谢谢您的时间。

1 个答案:

答案 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)
}