Page 1 sur 2

Fonction header () pour rediriger

Posté : 06 avr. 2007, 08:23
par dannowel
Bonjour,

J'ai de la difficulté avec la fonction header () pour faire une redirection et ça fais quelque jour que j'essais de trouver en vain pourquoi cela ne fonctionne pas ! :cry:
Warning: Cannot modify header information - headers already sent by (output started at c:\program files\easyphp1-8\www\profil\connexion.php:1) in c:\program files\easyphp1-8\www\profil\connexion.php on line 32
Je précise que je n'ai aucun retour de chariot avant la balise <?php

Code : Tout sélectionner

<?php if(isset($_POST['connexion'])) { $Utilisateur = $_POST['Utilisateur']; $Motpasse = $_POST['MotPasse']; $host = "localhost"; $user = "user"; $pass = "Pass"; $connexion = mysql_connect($host,$user,$pass); if ($connexion>0) { mysql_select_db('profil',$connexion); //On vérifie le user et password $resultatSQL=''; $data=''; $resultatSQL = mysql_query("SELECT Nom FROM membre WHERE membre.NomUtilisateur = '$Utilisateur' and membre.MotDePasse ='$Motpasse'")or die (mysql_error ()); $data = mysql_fetch_array($resultatSQL); if(!empty($data[0])) { ob_start(); header('Location: VotreProfil.html'); ob_end_flush(); exit(); } else { echo 'Mauvais nom dutilisateur ou mot de passe...'; mysql_close($connexion); exit(); } } else { echo 'Connexion impossible...'; exit(); } } ?> <html> <body> <DIV ALIGN=CENTER> <H2>Connexion à votre profil</H2> <HR WIDTH=60% ALIGN=CENTER><BR> <form method="post" action="Connexion.php"> <P ALIGN=CENTER> <pre> <TABLE> <TR><TD ALIGN=RIGHT>Nom d'utilisateur:</TD><TD ALIGN=LEFT><INPUT TYPE="texte" NAME="Utilisateur" SIZE="20" maxlength="20"></TD></TR> <TR><TD ALIGN=RIGHT>Mot de passe:</TD><TD ALIGN=LEFT><INPUT TYPE="password" NAME="MotPasse" SIZE="20" maxlength="20"></TD></TR> <TR><TD>&nbsp;</TD><TD><input type="submit" name="connexion" value="Connecter"/></TD></TR> </TABLE> </pre> </p> </form> </body>
Si vous avez des suggestions je suis preneur ! :wink:

PS: :arrow: Ne pas tenir compte des lacunes de sécurité, je veux régler ma redirection avant de retoucher mon code.

Posté : 06 avr. 2007, 08:31
par orgerix
Vérifie qu'il n'y a rien devans ta balise <?php.

Sinon je vois pas.

Posté : 06 avr. 2007, 08:32
par Ryle
Si ce n'est pas un retour charriot c'est peut être un espace ? En tout cas c'est quelque chose à ce niveau là dixit le message d'erreur :
Warning: Cannot modify header information // ne peut pas modifier l'entête
headers already sent by // l'entête a déjà été envoyé
(output started at c:\...\connexion.php:1) // il a commencé dans le fichier connexion.php à la ligne 1
in c:\...\connexion.php on line 32 // cela a donc généré un avertissement dans le script connexion.php à la ligne 32

Re: Fonction header () pour rediriger

Posté : 06 avr. 2007, 11:12
par Expreg
Pour ton problème, vérifie bien ce que te dit Ryle.
Il doit y avoir un envoi quelconque vers le navigateur.
Cela peut être dans un fichier inclu plus haut, bref...
PS: :arrow: Ne pas tenir compte des lacunes de sécurité, je veux régler ma redirection avant de retoucher mon code.
Sans tenir compte des lacunes de sécu comme tu appelles cela, il faut quand même que je te dise que tu devrais consulter quelques tutos sur le HTML afin d'acquérir les bases qui te permettront de fournir un code présentant une certaine rigueur nécessaire à une bonne exploitation. :wink:

Ceci n'est bien évidemment qu'un conseil, tu en fais ce que tu veux ! :P

Posté : 08 avr. 2007, 08:02
par dannowel
Merci pour vos réponses,

mais je ne comprends toujours pas pourquoi cela ne fonctionne pas... J'ai tenté de contourner le tout avec du javascript afin de pouvoir avancer, mais là j'ai besoin de créer des variables session et j'ai toujours l'irritante erreur:
Warning: session_start(): Cannot send session cookie - headers already sent by (output started at c:\program files\easyphp1-8\www\profil\connexion.php:1) in c:\program files\easyphp1-8\www\profil\connexion.php on line 6

Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at c:\program files\easyphp1-8\www\profil\connexion.php:1) in c:\program files\easyphp1-8\www\profil\connexion.php on line 6
<?php


if(isset($_POST['connexion']) && (!empty($_POST['utilisateur'])) && (!empty($_POST['motpasse'])))
{  
   session_start();
 	
   $Utilisateur = $_POST['utilisateur'];
   $MotPasse = $_POST['motpasse'];
   
   require("Config.php");
   $connexion = mysql_connect($host,$user,$pass) or die('Erreur: Connection au serveur impossible');

   mysql_select_db('profil',$connexion) or die ('Erreur: Connection à la base de données impossible');	
      
   //Vérification de l'identité de l'utilisateur
   $resultatSQL='';
   $data='';

   mysql_real_escape_string($Utilisateur,$connexion);
   mysql_real_escape_string($MotPasse,$connexion);
		
   $resultatSQL = mysql_query("SELECT Nom FROM membre WHERE membre.NomUtilisateur = '$Utilisateur' and membre.MotdePasse ='$MotPasse'")or die('Erreur: Impossible d\'exécuter la requête VÉRIFIER MEMBRE');
   $data = mysql_fetch_array($resultatSQL);
  
   if(!empty($data[0]))
   { 
      $_SESSION['utilisateur']=$Utilisateur;      
      $_SESSION['ID']=$data['NumeroMembre'];

      mysql_close($connexion);

      //Redirection dans 3 secondes vers le profil
      echo " <script language=\"javascript\" type=\"text/javascript\">
             <!--
             window.setTimeout('window.location=\"VotreProfil.html\"; ',3000);
             // -->
             </script>
             <DIV align=CENTER><b>Authentification effectuée avec succès!</b><br>Vous allez être automatiquement redirigé dans 3 secondes.";

      exit;
 
   }
   else   
   {
      echo 'L\'Authentification a échouée. Vérifiez le nom d\'utilisateur et le mot de passe...'; 	
      mysql_close($connexion);
      exit;
   }  		
   
}
?>    

<html>

<body>

<div align=center>
<h2>Connexion à votre profil</h2>
<hr width=60% align=center><br>

<form method="post" action="Connexion.php">
<p align=center>
<pre>
<table>
<tr><td align=right>Nom d'utilisateur:</td><td align=left><INPUT TYPE="texte" name="utilisateur" size="20" maxlength="20"></td></tr>
<tr><td align=right>Mot de passe:</td><td align=left><INPUT TYPE="password" name="motpasse" size="20" maxlength="20"></td></tr>
<tr><td>&nbsp;</td><td><input type="submit" name="connexion" value="Connecter"/></td></tr>
</table>
<input type="checkbox" name="souvenir">Se souvenir de mon profil
<a href="EnregistrementMembre.php">Mot de passe oublié ?</a>
<a href="EnregistrementMembre.php"><b>Créer un compte</b></a>
</pre>
</p>
</form>

</body>
</html>  	

Ce qui est le plus frustrant, c'est que je me suis sur le code ci-dessous et celui-ci fonctionne à merveille...:twisted:
<?php


if(isset($_POST['ValidForm']))
{   
	
	$succes = 'v'; //On peut enregistrer le membre ?
	$MessageErreur = '<DIV align=CENTER><U><B>Erreur</B></U>';

	$Nom = $_POST['Nom'];
	$Prenom = $_POST['Prenom'];
	$Courriel = $_POST['Courriel'];
	$GrandeurPieds = $_POST['G_Pieds'];
	$GrandeurPouces = $_POST['G_Pouces'];
	$Poids = $_POST['Poids'];
	$Utilisateur = $_POST['Utilisateur'];
	$MotPasse = $_POST['MotPasse'];
	$ConfirmationMP = $_POST['ConfirmationMP'];

	$NC_Utilisateur = StrLEN($_POST['Utilisateur']); //Nombre de caractères Utilisateur
	$NC_MP = StrLEN($_POST['MotPasse']); //Nombre de caractères Mot de passe


	//VÉRIFICATION DES DONNEES
	//======================================
	if ($Courriel == "")
   	{
		$MessageErreur .= '<UL type=disc><LI>Vous devez inscrire une adresse de <B>courriel</B></UL>'; 
		$succes = 'f';   
	}
	elseif(!preg_match('`^[[:alnum:]]([-_.]?[[:alnum:]])*@[[:alnum:]]([-_.]?[[:alnum:]])*.([a-z]{2,4})$`',$Courriel))
	{
		$MessageErreur .= '<UL type=disc><LI>L\'adresse <B>courriel</B> est invalide</UL>'; 
		$succes = 'f';   
	}

	
	if ($Utilisateur == "")
	{
		$MessageErreur .= '<UL type=disc><LI>Vous devez inscrire un nom d\'<B>utilisateur</B></UL>'; 
		$succes = 'f';
   	}
	elseif($NC_Utilisateur < 6)
	{		 
   		$MessageErreur .= '<UL type=disc><LI>Le nom d\'<B>utilisateur</B> doit ête composé de 6 caractères minimum</UL>'; 
		$succes = 'f';  
	}

	
	if ($MotPasse == "")
	{	
		$MessageErreur .= '<UL type=disc><LI>Vous devez inscrire un <B>mot de passe</B></UL>'; 
		$succes = 'f';   
	}
	elseif($NC_MP<6)
	{
		$MessageErreur .= '<UL type=disc><LI>Le <B>mot de passe</B> doit être composé de 6 caractères minimum</UL>'; 
		$succes = 'f';   
	}
	elseif($MotPasse!= $ConfirmationMP)
	{
		$MessageErreur .= '<UL type=disc><LI>Le <B>mot de passe</B> et la <B>confirmation</B> ne sont pas identiques</UL>'; 
		$succes = 'f';   
	}

	//LOADER LA PAGE
	if ($succes == 'f')
 	{
		echo $MessageErreur;
		
        } 
	else
	{

		//Succès de la vérification & enregistrement du membre dans la BD
		//===============================================================

		require("Config.php");
  		$connexion = mysql_connect($host,$user,$pass) or die('Erreur: Connection au serveur impossible');

      		mysql_select_db("profil",$connexion) or die ('Erreur: Connection à la base de données impossible');	

   		$requete="INSERT INTO membre (Nom,Prenom,Courriel,Grandeur,Poids,NomUtilisateur,MotdePasse)valueS (\"$Nom\",\"$Prenom\",\"$Courriel\",\"$GrandeurPieds.$GrandeurPouces\",\"$Poids\",\"$Utilisateur\",\"$MotPasse\");";

		mysql_real_escape_string($Nom,$connexion);
		mysql_real_escape_string($Prenom,$connexion);
		mysql_real_escape_string($Courriel,$connexion);
		mysql_real_escape_string($GrandeurPieds,$connexion);
		mysql_real_escape_string($GrandeurPouces,$connexion);
		mysql_real_escape_string($Poids,$connexion);
		mysql_real_escape_string($Utilisateur,$connexion);
		mysql_real_escape_string($MotPasse,$connexion);

		mysql_query($requete,$connexion) or die('Erreur: Impossible d\'exécuter la requête AJOUTER MEMBRE

		mysql_close($connexion);

		//Redirection vers la page de connexion
		header('Location: connexion.html');
		exit;
	}


}
?>

<html> 
<body> 
<br>

<div align=center>
<h2>Étape 1 - Informations du nouveau membre</h2>
<hr width=60% align=center><br>

<i>Les champs marqués d'un * sont obligatoires</i><br>

<form method="post" action="EnregistrementMembre.php">

<p align=center>

<table>
<tr align=left><td>&nbsp;</td><td><H4><U>Informations personnelles</U></H4></td></tr>
<tr><td align=right>Nom:</td><td align=left><input type="texte" name="Nom" size="20" maxlength="30"></td></tr>    
<tr><td align=right>Prénom:</td><td align=left><input type="texte" name="Prenom" size="20" maxlength="30"></td></tr>           
<tr><td align=right>Courriel:</td><td align=left><input type="texte" name="Courriel" size="30" maxlength="30"> *</td></tr>                
<tr><td align=right>Grandeur:</td><td align=left><select name="G_Pieds">
<option value="1"> 1
<option value="2"> 2
<option value="3"> 3
<option value="4"> 4
<option value="5"> 5
<option value="6"> 6
<option value="7"> 7
</select>'<select name="G_Pouces">
<option selectED value="0"> 0
<option value="1"> 1
<option value="2"> 2
<option value="3"> 3
<option value="4"> 4
<option value="5"> 5
<option value="6"> 6
<option value="7"> 7
<option value="8"> 8
<option value="9"> 9
<option value="10"> 10
<option value="11"> 11
<option value="12"> 12
</select>"</td></tr>
<tr><td align=right>Poids:</td><td align=left><select name="Poids"><option selected value="0"> 0

<?php 
  
 for ($I=1;$I<150;$I++)
 {
         echo '<option value="';
         echo $I;
         echo '">';
         echo $I;
 } 
?>
</select> Kg</td></tr>
<tr><td>&nbsp;</td></tr>
<tr><td>&nbsp;</td></tr>

<tr align=left><td>&nbsp;</td><td><h4><u>Informations relatives au compte</u></h4></td></tr>
<tr><td align=right>Nom d'utilisateur:</td><td align=left><input type="texte" name="Utilisateur" size="20" maxlength="20"> * 6 caractères minimum</td></tr>
<tr><td align=right>Mot de passe:</td><td align=left><input type="password" name="MotPasse" size="20" maxlength="20"> * 6 caractères minimum</td></tr>
<tr><td align=right>Confirmation:</td><td align=left><input type="password" name="ConfirmationMP" size="20" maxlength="20"> *</td></tr>
<tr><td>&nbsp;</td></tr>

</table>
</FORM> 
</PRE>
<br>
<input type="submit" name="ValidForm" value="Enregistrer mon profil"/> <input type="reset" value="Annuler">

</p>

</body>

</html> 
Si je n'ai pas d'espace avant php, qu'est-ce qui peut bien me donner cette erreur?

Si je veux tenter du Output Buffer, où dois-je inclure ob_start() et ob_end_flush() ?


Merci pour votre précieuse aide ! :wink:

Posté : 08 avr. 2007, 08:27
par dannowel
Je viens de faire un test avec seulement le code ci-dessous et je l'ai loadé avec EasyPHP et j'ai la même erreur, donc j'ai un gros :?: qui me vient à l'esprit ! :?

Code : Tout sélectionner

<?php header('Location: connexion.php'); ?>
Rendu où j'en suis, je mentionne aussi que je code mes scripts avec le bon vieux Bloc-Note si ça peut aider


Merci !

Posté : 08 avr. 2007, 09:22
par Expreg
Je viens de copier/coller ton premier pavé de code et en dehors d'un problème (de syntaxe il me semble) avec ton js justement, la page s'affiche correctement.

Au lieu d'utiliser ton bloc-note, utilises un outil un peu plus adapté permettant une coloration syntaxique.
Tiens, vas voir ça, c'est gratos et en français :
Notepad++

Posté : 08 avr. 2007, 09:30
par Cyrano
Je serais tenté de croire que si tu obtiens un message d'erreur à la ligne où tu as mis ton session_start(), c'est parce que tu as une erreur envoyée depuis la précédente ligne :
<?php


if(isset($_POST['connexion']) && (!empty($_POST['utilisateur'])) && (!empty($_POST['motpasse'])))
{  
   session_start();
    //.....
Tu utilises empty() mais sans vérifier au préalable si l'index existe : en débuggage strict, ça génère un warning... qui fait planter le session_start().

La solution serait la suivante :
-1- Commencer par mettre le session_start() au début de toutes façons;
-2- vérifier l'existence d'une variable pour pouvoir tester si elle est vide ou non

Ça va donner :
<?php
session_start();
if(isset($_POST['connexion']) && 
  (isset($_POST['utilisateur']) && !empty($_POST['utilisateur'])) && 
  (isset($_POST['motpasse']) && !empty($_POST['motpasse']))
)
{  
    //....

Posté : 08 avr. 2007, 09:33
par Expreg
Tu utilises empty() mais sans vérifier au préalable si l'index existe :
Bah c'est bon !
!empty() vérifie bien que les variables existent ! (pas besoin de isset()) :wink:

Posté : 08 avr. 2007, 09:47
par Cyrano
Tu utilises empty() mais sans vérifier au préalable si l'index existe :
Bah c'est bon !
!empty() vérifie bien que les variables existent ! (pas besoin de isset()) :wink:
Objection votre honneur : isset() vérifie l'existence, empty() vérifie le contenu d'une variable existante et si elle n'existe pas, empty va renvoyer true mais génèrera également un warning.

Posté : 08 avr. 2007, 10:21
par Expreg
Ma config est en error_reporting E_ALL, donc je devrais donc avoir un warning :(
<?php
// $var='';
if(isset($var))
{
echo '$var définie';
}
else
{
echo '$var pas définie';
}
//===============
echo '<hr />';
//===============
if(!empty($var))
{
echo '$var définie';
}
else
{
echo '$var pas définie, ou vaut 0 ou est vide';
}
?>
A l'affichage ça donne :
$var pas définie
$var pas définie, ou vaut 0 ou est vide

Posté : 08 avr. 2007, 11:31
par Ryle
Vous avez raison tous les deux, empty() est différent de isSet() et ne permet pas de savoir si une variable est définie ou non, mais elle ne génère pas de message d'alerte si elle ne l'est pas ;)
empty() est l'opposé de (boolean) var, excepté le fait qu'aucune alerte n'est générée lorsqu'une variable n'est pas définie.
Je suis d'accord avec Cyrano sur le fait que ca soit pas super logique, mais null est bien automatiquement considéré comme une chaine vide et pas comme un null pointer exception...

En revanche pour en revenir au problème, il suffit que l'index appellé dans $_POST n'existe pas pour générer le warning.. mais dans ce cas il le verrait apparaitre à l'écran. S'il ne le voit pas, c'est que les alertes sont désactivées, et les header() et session_start() devraient fonctionner...

Est-ce que ton fichier connexion.php est appellé en direct ? ou bien ne serait-il pas inclu par un autre script qui enverrait les en-têtes (genre pseudo-frames), te privant de ces fonctionnalités ?

Posté : 09 avr. 2007, 08:37
par dannowel
Merci pour votre soutien!

Expreg:
Merci pour le tuyau, il est génial le programme! ;)

Cyrano:
J'ai essayé avec:

Code : Tout sélectionner

if(isset($_POST['connexion']) && (isset($_POST['utilisateur']) && !empty($_POST['utilisateur'])) && (isset($_POST['motpasse']) && !empty($_POST['motpasse'])))


mais ça me donne toujours les erreurs et ce, même si je met session_start(); avant ou après la condition...

Ryle:
Est-ce que ton fichier connexion.php est appellé en direct ? ou bien ne serait-il pas inclu par un autre script qui enverrait les en-têtes (genre pseudo-frames), te privant de ces fonctionnalités ?
Effectivement, j'appèle directement le fichier avec la fonction "Web local" d'Easyphp. Le seul code que je vois qui pourrait être gênant est le code html, mais comme je l'ai mentionné plus tôt le code suivant ne fonctionne pas non plus...

Code : Tout sélectionner

<?php header('Location: connexion.php'); ?>
Existe-il une fonction pour vérifier ce qu'il y a dans le header ? Est-ce que ob_start pourrait régler le problème ? Si oui comment l'utiliser ?


Merci encore !

:wink:

Posté : 09 avr. 2007, 08:55
par Cyrano
Bon attends, procédons par ordre : ton message d'erreur indique une ligne précise dans un fichier clairement identifié : l'erreur se produit donc sur ladite ligne ou avant : ton fichier qui redirige vers connexion.php génère la même erreur, dis-tu : quelle erreur exactement ? Nous montrerais-tu l'intégralité du message ?

Posté : 09 avr. 2007, 09:54
par dannowel
Voilà pour le test que j'ai fais:

Code : Tout sélectionner

<?php header('Location: connexion.php'); ?>
Warning: Cannot modify header information - headers already sent by (output started at c:\program files\easyphp1-8\www\profil\test.php:1) in c:\program files\easyphp1-8\www\profil\test.php on line 2
Et voici pour mon script:

Warning: session_start(): Cannot send session cookie - headers already sent by (output started at c:\program files\easyphp1-8\www\profil\connexion.php:1) in c:\program files\easyphp1-8\www\profil\connexion.php on line 8

Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at c:\program files\easyphp1-8\www\profil\connexion.php:1) in c:\program files\easyphp1-8\www\profil\connexion.php on line 8
:arrow: output started at c:\program files\easyphp1-8\www\profil\test.php:1
Ça pointe étrangement au même endroit...

Merci !