从fgetcsv返回错误

时间:2012-12-31 16:42:35

标签: php csv

我目前有以下代码块处理用户上传文件的表单。如果用户上传fgetcsv无法处理的文件,如何才能返回错误?现在,当我尝试让它处理图像时,我的脚本继续运行,我从未收到错误消息。

我尝试测试$ data以确定它是否为null但我得到的只是错误。

if (($handle = fopen($_FILES['fileUpload']['tmp_name'], 'r')) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $total = count($data);

        for ($e=0; $e < $total; $e++) {
            echo $data[$e] . "<br />";
        }
        echo "<br />";
    }
    fclose($handle);
}

作为一个FYI - 我只打印出csv内容用于测试目的。在最后的脚本中,我将把数组保存在一个会话中。

更新: 正如@hakre建议的那样,我问了一个错误的问题。我已经接受了他的回答,因为我遇到了麻烦而我并没有完全理解它,我修改它就是你在下面看到的。

一切都很好除了,因为行if ($row === null) continue;不起作用。我在null周围使用和不使用括号尝试过它。空行是否位于文件的中间或者它是否是最后一行似乎并不重要。这是基于@harke注释修复的。 if ($row === null) continue;替换为if ($row === array(null)) continue;

$uploadTempfile = $_FILES['fileUpload']['tmp_name'];
$file = new SplFileObject($uploadTempfile);
$file->setFlags(SplFileObject::READ_CSV);
$limit = new LimitIterator($file, 0, 10); // scan the first 10 lines only
foreach ($limit as $row) {
    if ($row === array(null)) continue; // skip empty lines
    $columnCount[] = count($row);
    }
if(count(array_unique($columnCount)) === 1){
    echo 'file is valid';
    } else {
    echo 'file is INVALID';
    }

我已根据以下评论和答案更新了上述代码块,以便现在可以正常使用。

1 个答案:

答案 0 :(得分:2)

  

如果用户上传fgetcsv无法处理的文件,如何让它返回错误?

这可能是错误的问题。 fgetcsv可以处理任何文件。因此,总是如此,这样的函数将始终返回成功,永远不会出错。

你可能意味着你想检查CSV文件并稍微验证它的内容,如果它可能是你正在寻找的那种CSV文件。

这还要求您明确该文件是否应该具有某种特定性质,例如:总是相同数量的列,这可能是你正在寻找的。

以下代码示例检查CSV文件的前10行,它至少包含一行,这10行中的每一行(如果不为空)具有完全相同的计数且计数大于1: / p>

$uploadTempfile = $_FILES['fileUpload']['tmp_name'];

$file = new SplFileObject($uploadTempfile);
$file->setFlags(SplFileObject::READ_CSV);

$limit = new LimitIterator($file, 0, 10); // scan the first 10 lines only

foreach ($limit as $row) {

    if ($row === [null]) continue; // skip empty lines

    $rowCount = count($row);

    if (!isset($count)) {
        $count = $rowCount;
    }

    if ($rowCount !== $count) {
        break;
    }
}

$valid = (isset($count) and $rowCount === $count and $count > 1);