2011-12-07 56 views
0

嘗試使用filegetcsv解析一個CSV文件,並做的東西有了它,使用下面的代碼中找到的所有在互聯網上,包括PHP function definition頁:filegetcsv造成無限循環

if (($handle = fopen("test.csv", "r")) !== FALSE) { 
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
     print_r($data); 
    } 
    fclose($handle); 
} 

但代碼給了我一個在$data =行警告的無限循環:

PHP Warning: fgetcsv() expects parameter 1 to be resource, boolean given in... 
  1. 我知道我打開的文件是一個有效的文件,因爲如果我添加無效字符的文件名,我收到了不同錯誤和沒有循環。
  2. 該文件位於具有完全權限的文件夾中。
  3. 我不使用的Excel在Mac上生成CSV(there's a quirky error there
  4. PHP版本5.1.6,所以應該有與功能沒有問題
  5. 我知道該文件不是太大,或畸形的,因爲我一直在萎縮原始文件看,如果這是一個問題,最後只是在什麼記事本中創建一個自定義文件超過兩行,如:

    Value1A,Value1B,Value1C,Value1D

仍然循環和不提供數據。下面是完整的代碼,我與現在的工作(使用一個變量,它比行數較大,所以我可以證明它會無限循環,而不實際給我的服務器的無限循環)

if ($handle = fopen($_SERVER['DOCUMENT_ROOT'].'/tmp/test-csv-file.csv', 'r') !== FALSE) { 
    while ((($data = fgetcsv($handle, 1000, ',')) !== FALSE) && ($row < 10)) { 
     print_r($data); 
     $row++; 
    } 
    fclose($handle); 
} 

所以,我真的有兩個問題。

1)我可能忽略了什麼導致了這個循環?我半信半疑地認爲這是真正的「面掌」的簡單...

2)爲什麼推薦的代碼爲這個函數的東西,如果文件存在但可能會導致無限循環,但有一些未知的問題?我會認爲!== FALSE等等的目的是防止這種東西。

+0

這就是你的代碼的精確複製/粘貼,你沒有手動重新輸入它? – Crontab

+0

我複製並粘貼了一些評論,所以我只複製並粘貼了整個內容,並刪除了註釋,以防我的原始內容出現錯誤。 – joshuahedlund

回答

6

這裏沒有問題發生了什麼:文件未成功打開。這就是爲什麼$handlebool而不是資源(var_dump($handle)自己來確認這一點)。

fgetcsv然後返回null(不false!),因爲有一個錯誤,你的測試不挑這個,因爲你與!== false測試。正如文檔所述:

如果提供了無效句柄,則fgetcsv()返回NULL,或者在其他錯誤(包括文件結尾)上返回FALSE。

我同意返回nullfalse針對不同的錯誤條件不理想,而且是違反由很多其他的功能,確立了先例,但是這只是它是如何(以及東西could beworse)。根據情況,您可以簡單地將測試更改爲

while ($data = fgetcsv($handle, 1000, ",")) 

並且它在兩種情況下都能正常工作。

更新:

您是分配的if條件裏面的受害者:

if ($handle = fopen($_SERVER['DOCUMENT_ROOT'].'/tmp/test-csv-file.csv', 'r') !== FALSE) 

應該已經

// wrap the assignment to $handle inside parens! 
if (($handle = fopen($_SERVER['DOCUMENT_ROOT'].'/tmp/test-csv-file.csv', 'r')) !== FALSE) 

我敢肯定,你明白了什麼錯在這裏。這就是爲什麼我選擇永遠不會在條件內作出任務。我不在乎這是可能的。我不在乎它更短。我甚至不關心,如果分配被取出,編寫循環有時不那麼「優雅」。如果你重視你的理智,考慮一下。

+0

好的,所以基本上我需要停止尋找晦澀難懂的fgetscv問題,並調查爲什麼我的fopen沒有做我期待的事情? (我在其他腳本上成功使用fopen,所以我可以沿着這條路線走下去) – joshuahedlund

+0

@joshuahedlund:是的。 'file_exists'和'is_readable'可能會有所幫助。然而,如果fopen失敗,你應該已經收到了'E_WARNING'。是(error_reporting)(應該是)? – Jon

+0

@joshuahedlund:另一方面,事實證明,你在第一個「if」中只是有錯誤的語法。查看我的更新。 – Jon