2009-07-11 5 views
1

PHP에서 헤더()와 함께 루프는 기본적으로 같은 구조를 가지고 몇 가지 포인트를 지오 코딩하는 동안 :내가 스크립트를 작성했습니다

//get an unupdated record 
$arr_record; 
while(count($arr_record) > 0) 
{ 
//strings are derived from $arr_record 
geocode($string1); 
geocode($string2); 
geocode($string3); 
array_pop($arr_record); 
} 

function geocode($string) { 
    //if successful 
     update($coords) 
} 

function update($coords) { 
    //update the database 
    header('Location:http://localhost/thisfile.php') 
} 

문제는입니다 지오 성공하고 데이터베이스 경우에도 이 헤더가 다시 보내지면 스크립트는 페이지를 다시로드하고 새 레코드에서 다시 시작하지 않고 while 루프로 돌아갑니다.

PHP의 정상적인 동작입니까? 어떻게 이런 식으로 행동하지 않습니까?

+1

약간 혼란 스럽습니다. 왜 페이지를 새로 고침해야합니까? – xenon

+1

적합성을 위해 다음과 같이 공백을 두는 것을 고려하십시오. -'Location : http ...'- exit(); – gahooa

+0

페이지를 다시로드하는 이유는 CGI로 PHP를 실행할 수 없으며 한 페이지에 너무 많은 시간을 반복하도록 지시하면 시간이 초과된다는 것입니다. 페이지를 다시로드하면 시간 초과없이 원하는만큼 반복 할 수 있습니다. – wheresrhys

답변

5

header() 사용 후 die(); 스크립트를 종료하고 출력합니다.

+1

이것이 질문의 의미라면 이것이 맞습니다. – xenon

+0

스크립트는 빈 본문을 출력하지만 헤더는 다른 위치를 가지므로 브라우저는 사용자를이 위치로 리디렉션합니다. – usoban

3

어떻게 이런 행동을하지 않습니까?

header() 뒤에 exit()를 삽입하십시오.

0

또 다른 효과적인 방법은 헤더를 루프에서 직접 보내지 않는 것입니다. 어떤 적절한 (나는 php.net 매뉴얼에서 찾을 수 없지만 phpusenet에서 이전에 논의되었다는 것을 기억한다). 다른 PHP 버전에서는 예기치 않게 작동 할 수 있습니다. & 다른 apache ver. 설치. PHP로 cgi도 문제가됩니다.

당신이 다음 헤더 나중에 보낼 수있는 문자열로 반환에 할당 할 수 있습니다 ...

function update($coords) { 
     //update the database 

     if(statement to understand update is ok){ 
     return 'Location:http://localhost/thisfile.php'; 
     } else { 
      return false; 
     } 
    } 

    if($updateresult=update($cords)!=false){ header($updateresult); } 

을하지만 난 당신이라면 ... 난) (ob_get_contents() ob_end를위한 ob_start 작업을 시도 할 것입니다() 은 브라우저로 보내지는 것을 제어하는 ​​훌륭한 방법이기 때문입니다. 정상적인 MIME 타입이나 헤더 ... 뭐든간에. 머리글을 동시에 작업하는 동안 더 나은 방법입니다. & html 출력.

ob_start(); /* output will be captured now */ 
    echo time(); /* echo test */ 
    ?> 
    print something more... 
    <?php /* tag test */ 

/* do some stuff here that makes output. */ 

$content=ob_get_contents(); 
ob_end_clean(); 
/* now everything as output with echo, print or phptags. 
    are now stored into $content variable 
    then you can echo it to browser later 
*/ 

echo "This text will be printed before the previous code"; 
echo $content; 
관련 문제