2009-07-11 8 views
1

J'ai écrit un script pour géocodage quelques points qui a une structure essentiellement comme suit:While combinée avec en-tête() en 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') 
} 

Le problème est que même lorsque le géocodage est réussie et la base de données est mis à jour, et l'en-tête renvoyé, le script retourne encore dans la boucle while sans recharger la page et recommencer sur un nouvel enregistrement.

Est-ce un comportement normal pour PHP? Comment puis-je éviter qu'il se comporte comme ça?

+1

Je suis un peu confus, pourquoi avez-vous besoin de recharger la page? – xenon

+1

Pour la conformité, pensez à mettre un espace après le: - 'Location: http ...' - et assurez-vous de quitter(); – gahooa

+0

La raison pour recharger la page est que je ne peux pas exécuter php en tant que CGI, et si je dis à une page de l'itérer trop de fois, il expire. Recharger la page me permet de parcourir autant que je veux sans aucun délai. – wheresrhys

Répondre

5

Après l'en-tête(), utilisez die(); pour terminer le script et la sortie.

+1

Si c'est ce que voulait dire la question, c'est correct. – xenon

+0

Le script produira un corps vide, mais l'en-tête aura un autre emplacement afin que le navigateur redirige l'utilisateur vers cet emplacement. – usoban

3

Comment est-ce que j'évite que cela se comporte comme ceci?

Mettez exit() après l'en-tête().

0

un autre moyen efficace n'est pas d'envoyer les en-têtes directement dans une boucle. ce qui n'est pas correct (je n'ai pas pu trouver dans le manuel de php.net mais je me souviens qu'il avait déjà été discuté dans phpusenet). il peut agir de manière inattendue dans différentes versions de php. & différent apache ver. installations. Php comme CGI fera également des problèmes.

vous pouvez l'assigner à revenir sous forme de chaîne vous pouvez envoyer en-tête plus tard ...

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); } 

mais si je vous étais ... je voudrais essayer de travailler ob_start()() ob_get_contents OB_END() car ce sont l'excellent moyen de contrôler ce qui sera envoyé au navigateur. des mimetypes ou des en-têtes normaux ... peu importe. il est préférable de travailler avec les en-têtes & sortie html en même temps.

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; 
Questions connexes