page executee en double et redirection

page executee en double et redirection - PHP - Programmation

Marsh Posté le 17-02-2007 à 20:39:23    

Bonsoir à tous,
 
J'ai un probleme de redirection avec "header" que je ne comprends pas.
 
En gros, ma page est executée deux fois avant de faire effectivement la redirection :
 
1) page1.php affiche le formulaire
2) l'utilisateur soumet le formulaire et les données en post sont envoyées à page1.php
3) page1.php teste les données dans $_POST et s'il n'y a pas d'erreur
4) page1.php fait une redirection avec la fonction "header" vers page2.php
5) Au lieu d'atterir à page2, on revient sur page1.php
$_POST contient toujours les memes données
page1.php refait les meme tests et fait sa redirection vers page2.php
6) on arrive enfin vers page2.php
 
Est ce que vous avez deja eu un probleme similaire ?
 
 
Merci d'avance
 
fluminis


---------------
http://poemes.iceteapeche.com - http://www.simuland.net
Reply

Marsh Posté le 17-02-2007 à 20:39:23   

Reply

Marsh Posté le 17-02-2007 à 20:42:34    

Mets un exit juste après la redirection.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 17-02-2007 à 20:43:08    

il y en a un

Reply

Marsh Posté le 17-02-2007 à 20:55:51    

Ok dans ce cas essaie de réduire ton code à un exemple minimum et poste-le, ce sera plus facile de t'aider.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 17-02-2007 à 21:29:06    

une version epurée du code :
 
Page 1

Code :
  1. <?php
  2. include('includes/utils.inc.php'); //declaration de fonctions utiles
  3. logged(DEBUG, "acces page1.php" );
  4. if (!empty($_POST['ok'])) {
  5. //sumbit form
  6. //check required fields
  7. if(verifyFields('employes',$_POST)) {
  8.  //ok all the required fields are present
  9.  // on enregistre les info en base
  10.  logged(DEBUG, "Traitements de page1" );
  11. }
  12. logged(DEBUG, "Redirect from page1 to page2" );
  13. finalizeLog(); // ecrit tous les messages de log dans un fichier
  14. header('location: page2.php');
  15. exit;
  16. }
  17. ?>
  18. <form name="employes" method="post">
  19. <input type="hidden" name="ok" value="1" />
  20. ... //les champs du formulaires
  21. <input type="submit" name="button" value="GO" />
  22. </form>


 
et page 2

Code :
  1. <?php
  2. include('includes/utils.inc.php');
  3. logged(DEBUG, "acces page page2.php" );
  4. finalizeLog();
  5. ?>


 
j'obtiens dans mon fichier de log :

Code :
  1. acces page1.php
  2. Traitements de page1
  3. Redirect from page1 to page2
  4. acces page1.php
  5. Traitements de page1
  6. Redirect from page1 to page2
  7. acces page page2.php


---------------
http://poemes.iceteapeche.com - http://www.simuland.net
Reply

Marsh Posté le 17-02-2007 à 22:52:12    

Je dirais que c'est ton finalizeLog qui ne vide pas le buffer quand tu l'appelles, et du coup quand tu le fais sur page2 ça réaffiche ce que tu avais déjà loggé dans page1, + la nouvelle ligne.
 
Je vois pas d'autre explication.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 17-02-2007 à 23:29:27    

c'est pas ca...
 
J'ai supprimé du code presenté ici le traitement des données.
 
Et dans ce traitement, je fais :

Code :
  1. if (!empty($_SESSION['monId'])) {
  2.    $sql = "UPDATE ...";
  3.    logged(DEBUG, $sql);
  4. } else {
  5.    $sql = "INSERT ...";
  6.    logged(DEBUG, $sql);
  7. }


 
La premiere fois, l'id n'existe pas en session donc je fais une insertion en base de données et je stock l'id de l'enregistrement en session.
La deuxieme fois l'id existe en session donc je fais un update.
 
Au final, je vois dans mon log, qu'il a fait un insert la 1ere fois et un update la seconde.
 
Bref j'ai deja proccedé de même sur mes autres sites et je ne comprends pas pourquoi ca coince cette fois ci...

Reply

Marsh Posté le 18-02-2007 à 16:35:17    

J'ai testé rapidos chez moi là (en écrivant dans un fichier au lieu du log) et tout se déroule correctement, avec un seul passage dans page1. :spamafote:
 
Essaie avec des chemins absolus dans ton header sinon, on sait jamais. Normalement un header de redirection doit prendre un tel chemin, même si les chemins relatifs semblent marcher partout ou presque.
 
Enfin bon, y a une chance sur 1000 que ce soit ça...


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 18-02-2007 à 20:06:56    

merci d'avoir pris le temps de faire le test chez toi.
 
Je vais essayer avec des chemins absolus on sait jamais.

Reply

Marsh Posté le 19-02-2007 à 11:20:34    

Ouais les navigateurs sont gentils. Maintenant si on veut respecter la norme, c'est chemins absolue et status-code 303 See Other (Donc passage d'une ressource non-cachable vers une ressource cachable)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed