2

現在、ユーザーがファイルをアップロードするフォームを処理する以下のコードブロックがあります。ユーザーが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);
}

参考までに-私はテスト目的で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';
    }

以下のコメントと回答に基づいて上記のコードブロックを更新し、正しく機能するようにしました。

4

1 に答える 1

2

ユーザーがfgetcsvで処理できないファイルをアップロードした場合に、これでエラーを返すにはどうすればよいですか?

それはおそらく間違った質問です。任意のfgetcsvファイルを処理できます。したがって、それは常に真実であるため、そのような関数は常に成功を返し、エラーを返すことはありません。

おそらく、CSVファイルを調べて、探している種類のCSVファイルである可能性が高い場合は、その内容をある程度確認したいということです。

これには、ファイルが実際に特定の性質のものである必要があるかどうかを明確にする必要もあります。たとえば、常に同じ数の列を探している場合があります。

次のコード例では、CSVファイルの最初の10行に、少なくとも1行が含まれていることを確認します。これらの10行(空でない場合)はそれぞれまったく同じカウントであり、カウントは1より大きくなります。

$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);
于 2012-12-31T17:03:25.023 に答える