Redirection de page après formulaire

Redirection de page après formulaire - PHP - Programmation

Marsh Posté le 11-01-2007 à 09:08:14    

Salut,
 
Je dois me connecter à mon compte via un formulaire. Quand les données entrées ne sont pas valide j'aimerai que l'utilisateur soit redirigé vers une autre page. Seulement, j'ai l'erreur suivante:
 

Citation :

Warning: mysql_connect() [function.mysql-connect]: Access denied for user 'root1'@'localhost' (using password: NO) in /var/www/ouverture.php on line 2
 
Warning: Cannot modify header information - headers already sent by (output started at /var/www/ouverture.php:2) in /var/www/ouverture.php on line 6


 
Donc la première est normale, puisque le login est mauvais OK, mais la deuxième j'ai du mal à piger. Il me dit que quelque chose à déjà était envoyé dans le header. Voici le code:
 

Citation :

<html>
<?php $connexion = mysql_connect($_POST["serveur"], $_POST["utilisateur"], $_POST["password"]);
   if ($connexion>0)
 echo "<br />Connection effectuee le <font color=\"orange\"><b>".date("d/m/y - H:i:s" )."</b></font>";  
   else
 header("location: redir.php" );
 exit;?>  
<head>...


 
Si je met la redirection avant tout forcément elle fonctionne, mais dans mon cas précis je suis obligé de vérifier si les données entrées dans le formulaire sont bonnes. Donc comment pourrais-je faire pour vérifier les données et rediriger si celles ci ne sont pas bonnes ?
 
 :jap:

Reply

Marsh Posté le 11-01-2007 à 09:08:14   

Reply

Marsh Posté le 11-01-2007 à 09:18:59    

Il ne faut jamais envoyer quelque chose au client avant de toucher aux headers, c'est logique. Pour ça, il y a l'output buffering qui permet de tout stocker dans un buffer. Ou alors coder proprement [:dawak] D'abord tester les données, et suivant le résultat inclure le code HTML à générer.

 

Accessoirement, tu utilises un header Location, qui va utiliser un '302 Permanently Moved', ce qui n'est pas conseillé, suivant la recommendation HTTP 1.1. Il faut utiliser un 303 See Other, valide après une requête POST. De plus, l'url doit être absolue :

Code :
  1. header('Location: http://pouet.com/redir.php', true, 303);


Message édité par FlorentG le 11-01-2007 à 09:19:09
Reply

Marsh Posté le 11-01-2007 à 09:29:13    

Merci pour les infos. Enfait J'ai compris le principe qu'il ne fallais rien envoyer avant que ce soit redirigé, mais là, je dois tester si les données sont valides. Si elles y sont j'accède à ma page (le reste du code), soit je redirige vers redir.php. Donc je suis obligé de mettre quelque chose avant le header().

 
Citation :

<html>
<?php $connexion = mysql_connect($_POST["serveur"], $_POST["utilisateur"], $_POST["password"]);
   if ($connexion>0)
 echo "<br />Connection effectuee le <font color=\"orange\"><b>".date("d/m/y - H:i:s" )."</b></font>";
   else
 header('Location: http://localhost/redir.php', true, 303);
 exit;
?>
<head>

 

Puisque je fais un test avant l'éventuel redirection, comment puis-je faire ?
 :sweat:

Message cité 1 fois
Message édité par tease_party le 11-01-2007 à 09:29:23
Reply

Marsh Posté le 11-01-2007 à 10:05:45    

tease_party a écrit :

mais là, je dois tester si les données sont valides. Si elles y sont j'accède à ma page (le reste du code), soit je redirige vers redir.php. Donc je suis obligé de mettre quelque chose avant le header().


C'est qu'il y a un défaut de conception... Dès qu'on envoie quelque chose (un simple <html> suffit), les headers sont envoyés, donc on ne peut plus y toucher. Le truc pas normal :D, c'est que t'affiche un <html>, alors que tu ne sais pas encore si les données sont valides ou pas, donc problème :(

 

On peut reformuler tout ça en :

Code :
  1. <?php
  2.  $connexion = mysql_connect($_POST["serveur"], $_POST["utilisateur"], $_POST["password"]);
  3.  
  4.  if(!$connexion) {
  5.    header('Location: http://localhost/redir.php', true, 303);
  6.    exit();
  7.  }
  8. ?><html>
  9.  
  10. <br />Connection effectuee le <font color="orange"><b><?php echo date('d/m/y - H:i:s') ?></b>


Message édité par FlorentG le 11-01-2007 à 10:05:57
Reply

Marsh Posté le 11-01-2007 à 10:26:10    

Ah oui j'avais pas vue ca comme ca  :) . Enfait j'avais testé en mettant le HTML après le php, mais ca ne fonctionnait pas non plus. J'avais lu sur le net que c'était à cause de l'utilisation du echo dans mon if. Seulement, même avec ta solution, le truc ne fonctionne pas:
 

Citation :


<?php
 $connexion = mysql_connect($_POST["serveur"], $_POST["utilisateur"], $_POST["password"]);
 if(!$connexion) {
 header('Location: http://localhost/redir.php', true, 303);
 exit();
 }
?>
<html>
<head>[...]


 

Citation :

Warning: mysql_connect() [function.mysql-connect]: Access denied for user 'root1'@'localhost' (using password: NO) in /var/www/ouverture.php on line 2
 
Warning: Cannot modify header information - headers already sent by (output started at /var/www/ouverture.php:2) in /var/www/ouverture.php on line 4


 
Es que ca serai pas du à l'erreur générée par le mauvais login ou mdp ? Puisque le message: Warning: mysql_connect() [func... est écrit automatiquement peut être que sa écrit dans le header, et du coup sa fait pas la redirection . Es qu'il existe un moyen de ne pas afficher ce message d'erreur ?
 
Sinon je ne comprend pas car il n'y a absolument rien devant le <?php, même pas un saut de ligne, un caractère ... rien  :pt1cable:  

Reply

Marsh Posté le 11-01-2007 à 10:27:47    

Et voilà :D L'erreur cause l'envoi des headers :D Là on rentre dans la gestion des erreurs plus complexe :

  • Désactivation par @ (bof)
  • error_handler custom
  • Désactivation des erreurs (nécessaire en prod)

Reply

Marsh Posté le 11-01-2007 à 10:44:30    

:cry:  
 
Bon alors là c'est la merde, j'ai regardé sur le net je trouve rien pour désactiver les messages "warning" de mysql. Le code est compliqué à mettre en oeuvre pour dégager le message qui me gène ?

Reply

Marsh Posté le 11-01-2007 à 12:31:32    

raaa... au lieu de chercher à ne pas afficher les erreurs, cherche plutôt à les résoudre... ici c'est juste un soucis d'autorisation d'accés à ta bdd... résoud ça et tu n'auras plus de soucis ;)
 
sinon pour désactiver le revois d'erreurs 2 soluces.... :
1 - tu as accés au serveur, et tu peux modifier son fichier d'initialisation... ben tu modifie la ligne error reporting il me semble...
 
2 - tu fais un ini_set sur justement l'error reporting.. voir ICI
 
Ce que j'ais pour la phase de test :

Code :
  1. error_reporting (E_ALL | E_STRICT);      //filtrage des erreurs reportées
  2.   ini_set('display_errors', true);      //affichage des erreurs
  3.   ini_set('html_errors', false);       //désactivation des liens html dans les erreurs
  4.   ini_set('display_startup_errors',true);     //affichage des erreurs de démarrage
  5.   ini_set('log_errors', true);       //création d'un fichier de log
  6.   ini_set('error_log', 'journal/error.log');    //localisation du fichier de log
  7.   ini_set('error_prepend_string','<font color="red">'); //début mise en forme erreur
  8.   ini_set('error_append_string','</font>');    //fin mise en forme erreur
  9.   ini_set('ignore_repeated_errors', true);     //ignorer les erreurs répétées


Pour ma phase en prod :

Code :
  1. error_reporting (E_ALL);        //filtrage des erreurs reportées
  2.   ini_set('display_errors', false);      //affichage des erreurs
  3.   ini_set('html_errors', false);       //désactivation des liens html dans les erreurs
  4.   ini_set('display_startup_errors',false);    //affichage des erreurs de démarrage
  5.   ini_set('log_errors', true);       //création d'un fichier de log
  6.   ini_set('error_log', 'journal/error.log');    //localisation du fichier de log
  7.   ini_set('error_prepend_string','<font color="red">'); //début mise en forme erreur
  8.   ini_set('error_append_string','</font>');    //fin mise en forme erreur
  9.   ini_set('ignore_repeated_errors', true);    //ignorer les erreurs répétées

Reply

Sujets relatifs:

Leave a Replay

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