Цикл while в сочетании с header () в PHP - PullRequest
1 голос
/ 11 июля 2009

Я написал скрипт для геокодирования некоторых точек, структура которого в основном выглядит следующим образом:

//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? Как мне избежать такого поведения?

Ответы [ 3 ]

5 голосов
/ 11 июля 2009

После header () используйте die (); завершить сценарий и вывести.

3 голосов
/ 11 июля 2009

Как мне избежать такого поведения?

Поставить exit () после header ().

0 голосов
/ 11 июля 2009

Другой эффективный способ - не отправлять заголовки напрямую в цикле. что не является правильным (я не мог найти в руководстве php.net, но я помню, что это обсуждалось ранее в phpusenet). это может действовать неожиданно в разных версиях PHP. & разные версии Apache установок. php as 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_start () ob_get_contents () ob_end () потому что это отличный способ контролировать то, что будет отправлено в браузер. нормальные mimetypes или заголовки ... что угодно. это лучший способ при работе с заголовками и выводом 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;
...