1

基本的に次のような構造を持ついくつかのポイントをジオコーディングするスクリプトを作成しました。

//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の通常の動作ですか?このような動作を回避するにはどうすればよいですか?

4

3 に答える 3

5

header()の後にdie();を使用します。スクリプトと出力を終了します。

于 2009-07-11T11:47:33.807 に答える
3

このような動作を回避するにはどうすればよいですか?

header()の後にexit()を置きます。

于 2009-07-11T11:47:56.677 に答える
0

もう1つの効果的な方法は、ヘッダーをループで直接送信しないことです。これは適切ではありません(php.netのマニュアルでは見つかりませんでしたが、以前にphpusenetで説明されたことを覚えています)。異なるphpバージョンでは予期しない動作をする可能性があります。&別のapachever。インストール。cgiとしてのphpも問題を引き起こします。

文字列として返すように割り当てることができ、後でヘッダーを送信できます...

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()を操作しようとします。これは、ブラウザーに送信される内容を制御するための優れた方法だからです。通常のmimetypeまたはヘッダー...何でも。ヘッダーと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;
于 2009-07-11T12:51:37.683 に答える