2011-12-07 8 views
0

다음 코드를 사용하여 CSV 파일을 구문 분석 filegetcsv를 사용하려고 그것으로 물건을 발견 원인 :filegetcsv <a href="http://php.net/manual/en/function.fgetcsv.php" rel="nofollow noreferrer">PHP function definition</a> 페이지를 포함하여, 인터넷을 통해 모든 무한 루프

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. 내가 Mac에서 엑셀에 의해 생성 된 CSV를 사용하지 않는
  4. (there's a quirky error there)
  5. PHP 버전 5.1.6, 내가 파일을 알고
  6. 너무 큰 아니라 기능에 문제가 없어야하므로, 또는 나는 그 마지막 문제이고 있는지 확인하기 위해 원본 파일을 축소 유지하기 때문에 잘못, 그냥 아무것도 메모장에서 사용자 지정 파일을 만든 두 개 이상의 선이 같은 :

    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)) 대신에 bool입니다.

fgetcsvnull (안 false를!) 반환이 오류, 그리고 테스트 당신이 !== false으로 테스트하기 때문에이를 선택하지 않기 때문에. 설명서를 상태로 : 잘못된 핸들 공급 또는 파일의 끝을 포함 기타 오류에 FALSE 경우

fgetcsv()는 NULL을 반환한다.

나는 다른 오류 조건 nullfalse를 반환하는 것은 그것이 다른 많은 기능에 의해 설립 된 전례에 있다는 적합하지 않으며, 또한 동의하지만 그것이 (그리고 일 could beworse) 단지 방법입니다.상황이 그대로 유지되면 테스트를

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

으로 간단히 변경할 수 있으며 두 경우 모두 올바르게 작동합니다.

업데이트 :

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) 

을 했어야 나는 '당신이 여기 무엇이 잘못되었는지 이해 확신 :

당신은 if 조건 내부 할당의 피해자가 있습니다 . 이것이 제가 을 결코 선택하지 않은 이유입니다. 조건부 내에서 과제를 지정하십시오.. 나는 그것이 가능하다는 것을 상관하지 않는다. 나는 그것이 더 짧다는 것을 상관하지 않는다. 할당을 꺼내면 루프를 작성하는 것이 때로는 "우아함"이 때로는 신경 쓰지 않습니다. 너가 너의 온건함을 중요하게 생각하면, 똑같이하는 걸 고려해 보라.

+0

좋아, 근본적으로 나는 모호한 fgetscv 문제를 찾는 것을 멈추고 내 fopen이 내가 기대하는 것을하지 않는 이유를 조사해야 할 필요가있다. (나는 다른 스크립트에서 fopen을 성공적으로 사용하여 해당 경로로 이동할 수 있습니다.) – joshuahedlund

+0

@joshuahedlund : 예. 'file_exists'와'is_readable'가 도움이 될 수 있습니다. 그러나'fopen'이 실패하면 이미'E_WARNING'을 받았어야합니다. 'error_reporting'이 켜져 있습니까? – Jon

+0

@joshuahedlund : 다른 한편으로, 첫 번째'if' 내부에 잘못된 구문을 가지고있는 것으로 나타났습니다. 내 업데이트를 참조하십시오. – Jon