probleme de header et cookie

drskunk
Invité n'ayant pas de compte PHPfrance

19 juin 2007, 13:44

Bonjour à vous tous chers amis dev web.
C est le premier post que je laisse sur ce forum car je suis totalement bloqué voir dégouté.

Je développe une application web de gestion client pour une entreprise et j ai un gros soucis au niveau de l identification:

En effet j utilise un cookie pour récupérer le num d identification de l utilisateur afin qu il n ait pas a se ré identifier a chaque connexion.

le probleme viens de ce message d erreur:
Warning: Cannot modify header information - headers already sent by (output started at C:\Program Files\wamp\www\gestion_clientele_scahp\include\head.php:7) in C:\Program Files\wamp\www\gestion_clientele_scahp\log.php on line 22
Impossible d'écrire le Cookie.

le truc c est que j ai vérifier dans le fichier head.php et il n'y a pas de blanc ni rien d afficher an fait avant la création du cookie:

Code : Tout sélectionner

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title> Application de gesion clientèle SCAHP</title> <link rel="stylesheet" href="style.css" type="text/css" /> <script type="text/javascript" src="script/javascript.js"></script> </head> <body bgcolor="#93A3AA">
et a la ligne 22 de log.php il y a:
setcookie("log", $num, time()+60*60*24*365, "/") or die("Impossible d'écrire le Cookie.<br />");

Please help les amis j en ai marre ca va faire une matinée que je passe dessus c est trop pour un probleme comme ca :D
Very Happy Tchao!!!

Merki d avance a mon sauveur

Mammouth du PHP | 737 Messages

19 juin 2007, 14:53

Salut,

Ce genre d'erreur pour l'avoir rencontrer plus d'une fois vient du fait que tu cherches à écrire, faire, exécuter quelque chose alors que les "entêtes sont déjà parties". Tu n'aurais pas un header (location... quelque part qui traine. Dans ce cas mets cette ligne en commentaire ou place là en haut de page avant le HTML sinon montre nous plus de ton code des 2 pages.

++

Mega :)

Petit nouveau ! | 4 Messages

19 juin 2007, 16:10

Merki d avoir repondu aussi vite.
Comme tu le dis si bien
Ce genre d'erreur pour l'avoir rencontrer plus d'une fois vient du fait que tu cherches à écrire, faire, exécuter quelque chose alors que les "entêtes sont déjà parties"
et le truc c est que j ai l impression (certainement fausse) de ne rien faire avant.

Je vais mettre un peu plus de code:

ma page index.php:
<?php
session_start();
//ouvre une session et détermine un ID
//on inclut la page de connexion a la base de donnee
include('script/connexion_bdd.php');
//afficher l'ID de session
include('include/head.php');
// si il n'y a pas de session ouverte ou existante
if (!isset ($_SESSION['validuser']))
{
  //on inclus la page de connexion si il n y a pas de session active
  echo("<div id='log'>");
  include ('log.php');
  echo("</div>");
}
else
{
  //affichage du gabarit de l application
  echo("<div id='bandeau'>");
	include ('gabarit/recherche.php');
	echo("</div>");	
	echo ("<div id='menu'>");
	include ('gabarit/menu.php');
	echo("</div>");	
	echo("<div id='contenu'>");	
	if (isset ($_REQUEST['page']))
	{		
	     //test qui permet de changer de page dans la partie contenu
	     // AJout de lien:
       //case 'non de la variable passée en url': include('chemin de la page a inclure');break;
			switch ($_REQUEST['page'])
			{
			 ( ... )
			}
	}
	else
	{
	 include('gabarit\accueil.php');
	}
	echo ("</div>");	
	echo ("<div id='pied_page'>");
	include ('include\tail.php');
	echo ("</div>");
}
?>
ma page log.php:
<?php
//Retourne le contenu des variables si elle ne sont pas vides
if (isset($_POST['pseudo']) && isset ($_POST ['mdp']))
{
$pseudo = $_POST['pseudo'];
$mdp = $_POST['mdp'];
//Connexion au serveur
$idconnexion= BDD_Connect();
//test de connexion au serveur
if ($idconnexion)
{
//requete qui verifie que le login et le mot de passe utilisateur existe
$query="select idEmploye from employe where loginEmploye = '".$pseudo."' and passEmploye = '".$mdp."'";
//recuperation du résultat de la requete
$result= mysql_query($query);
if  (mysql_num_rows($result)>0)
{
$numuser=mysql_fetch_row($result);
$_SESSION['validuser'] = $pseudo;
$num=$numuser[0];
// on créé le cookie
setcookie("log", $num, time()+60*60*24*365, "/") or die("Impossible d'écrire le Cookie.<br />");
echo $_SESSION['validuser'];
}
else
{
echo("login ou mot de passe incorrect.<br />");
}
}
//fermeture connexion et vidage de la mémoire
mysql_free_result($result);
mysql_close($idconnexion);
}

//on test si le cookie existe
if (isset ($_COOKIE['log']))
{
//on recupère la valeur du cookie  
$num=$_COOKIE['log'];
$idconnexion= BDD_Connect();  
//test de connexion au serveur
if($idconnexion)
{
//on recupère les info de l'utilisateur
$query="select nomEmploye, prenomEmploye, loginEmploye from employe where idEmploye = '".$num."'";
//recuperation du résultat de la requete
$exec= mysql_query($query);
if(mysql_num_rows($exec)>0)
{
//affectation des variables session
$result=mysql_fetch_row($exec);
$_SESSION['nom']=$result[0];
$_SESSION['prenom']=$result[1];
$_SESSION['validuser']=$result[2];
}
}
mysql_free_result($exec);
mysql_close($idconnexion);
}


//on test si l'utilisateur est valide pour l authentification
if (isset ($_SESSION['validuser']))
{
//si bon on redirige vers l index
// voici le header qui doit faire planter mais j en ai besoin pour rediriger. Fais ... ce truc
header('Location:index.php');
}
else
{
if(isset ($pseudo))
{
	//Tentative d'ouverture avortée
	echo"Vous ne pouvez pas vous logger.<br />";
	}
else
{
	//L'utilisateur n'a pas de session
	echo "Vous n'avez pas de session.";
	}
	}
//Formulaire d'ouverture de session
	echo 
'
<form method="post" name="login" id="login" onSubmit="return verifLogin()" action="index.php" >
	<table>
	<tr><td>Pseudonyme :</td>
	<td><input type="text" name="pseudo" id="pseudo"></td></tr>
	<tr><td>Mot de passe :</td>
	<td><input type="password" name="mdp" id="mdp"></td></tr>
	<tr><td colspan="2" align="center">
	<input type="submit" value="Log in"></td></tr>
	</table></form>
';

?>
et le head est deja dans le post precedent.

Si vous vouyez qqchose de pourris dans mon code (et je sais qu il y en aura :D ) hesiter pas a corriger lol

Allez les ptits fous du php a bientoto!!

tcho

Eléphant du PHP | 377 Messages

19 juin 2007, 16:27

<?php
if (!isset ($_SESSION['validuser']))
{
  //on inclus la page de connexion si il n y a pas de session active
  echo("<div id='log'>");
  include ('log.php');
  echo("</div>");
} ...
tu envoies du texte avant d'envoyer ton cookie, donc les headers partent
De plus j'ai comme dans l'idée que head.php contient du HTML, qui lui aussi fait partir les headers
donc il faut revoir la structure de la page, pour faire les tests avant toute chose

EDIT : d'ailleurs le message d'erreur parle de lui même :
Warning: Cannot modify header information - headers already sent by (output started at C:\Program Files\wamp\www\gestion_clientele_scahp\include\head.php:7) in C:\Program Files\wamp\www\gestion_clientele_scahp\log.php on line 22
c'est lui le fautif ;)
Petit scarabée deviendra grand

Petit nouveau ! | 4 Messages

21 juin 2007, 09:32

Bon les amis l heure est grave j ais bien revu l organisation de ma page en faisant attention a ne pas envoyer d info, d executer de truc enfin bon que dalle et toujours ce ptit message:
Warning: Cannot modify header information - headers already sent by (output started at C:\Program Files\wamp\www\gestion_clientele_scahp\include\head.php:8) in C:\Program Files\wamp\www\gestion_clientele_scahp\log.php on line 23
Impossible d'�crire le Cookie.
Revoila le code de ma page head.php mais nettoyer (remarquer qu il n ya pas deligne 8 c ouf :shock: ):

Code : Tout sélectionner

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title> Application de gestion clientèle SCAHP</title> </head> <body bgcolor="#93A3AA">
pour voir le code avant nettoyage cf le premier post.

Alors je sais c pas un problemes des plus interessant a resoudre mais la j en peu plus HELP ME!!!!!!!!!!!!!!!!!!!! :lol:

Merci d avance a toutes les bonnes ames qui voudront bien se pencher 5 min sur mon probleme et au pire me faire un ptit topo vite fait sur les headers :D

Tcho les phpeur!!

Eléphant du PHP | 377 Messages

21 juin 2007, 10:54

Hello
Poste nous le code de la page index.php et de toutes les pages qui sont incluses, parce que là il nous manque trop d'informations pour pouvoir t'aider efficacement
Petit scarabée deviendra grand

Petit nouveau ! | 4 Messages

25 juin 2007, 14:02

Désolé pour la longueur de temps mais j ai continuer le dev de mon appli' et la j ai decide de revenir sur ce probleme.

Donc voici les codes des pages index et celle incluses dedans:

Code : Tout sélectionner

<?php session_start(); //ouvre une session et détermine un ID //on inclut la page de connexion a la base de donnee include('script/connexion_bdd.php'); //afficher l'ID de session include('include/head.php'); // si il n'y a pas de session ouverte ou existante if (!isset ($_SESSION['validuser'])) { //on inclus la page de connexion si il n y a pas de session active require ('log.php'); } else { //affichage du gabarit de l application echo("<div id='bandeau'>"); include ('recherche/recherche.php'); echo("</div>"); echo ("<div id='menu'>"); include ('gabarit/menu.php'); echo("</div>"); echo("<div id='contenu'>"); if (isset ($_REQUEST['page'])) { //test qui permet de changer de page dans la partie contenu // AJout de lien: //case 'non de la variable passée en url': include('chemin de la page a inclure');break; switch ($_REQUEST['page']) { case 'acc': include('gabarit/accueil.php'); break; case 'gest': include ('gestion/menu_gestion.php'); break; case 'gest_tut': include ('gestion/gest_tut.php'); break; case 'mod_tut': include ('gestion/mod_tut.php'); break; case 'gest_empl': include ('gestion/gest_empl.php'); break; case 'mod_empl': include ('gestion/mod_empl.php'); break; case 'gest_etab': include ('gestion/gest_etab.php'); break; case 'mod_etab': include ('gestion/mod_etab.php'); break; case 'gest_cont': include ('gestion/gest_cont.php'); break; case 'mod_cont': include ('gestion/mod_cont.php'); break; case 'gest_typ': include ('gestion/gest_typ.php'); break; case 'mod_typ': include ('gestion/mod_typ.php'); break; case 'gest_prod': include ('gestion/gest_prod.php'); break; case 'mod_prod': include ('gestion/mod_prod.php'); break; case 'gest_scap': include ('gestion/gest_scap.php'); break; case 'mod_scap': include ('gestion/mod_scap.php'); break; case 'gest_inter': include ('interventions.php'); break; case 'gest_dev': include ('gestion_developpement.php'); break; case 'rech_etab': include ('recherche/rech_etab.php'); break; case 'rech_cont': include ('recherche/rech_cont.php'); break; case 'rech_cp': include ('recherche/rech_cp.php'); break; case 'rech_tel': include ('recherche/rech_tel.php'); break; case 'fich_etab': include ('fiche/fich_etab.php'); break; case 'fich_cont': include ('fiche/fich_cont.php'); break; case 'fich_empl': include ('fiche/fich_empl.php'); break; case 'cahier': include ('cahier.php'); break; case 'int': include ('interventions/menu_int.php'); break; case 'gest_int': include ('interventions/gest_int.php'); break; case 'cons_int' : include ('interventions/list_int.php'); break; case 'annu' : include ('annu.php'); break; default : include ('gabarit\accueil.php'); break; } } else { include('gabarit\accueil.php'); } echo ("</div>"); echo ("<div id='pied_page'>"); include ('include\tail.php'); echo ("</div>"); } ?>
la page head.php:

Code : Tout sélectionner

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <script src="script/javascript.js"></script> <script type="text/javascript"> /*test du navigateur*/ if (navigator.appName=='Netscape') { document.write('<link rel="stylesheet" href="style_fire.css" type="text/css" />'); } else { document.write('<link rel="stylesheet" href="style_ie.css" type="text/css" />'); } </script> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title> Application de gestion clientèle SCAHP</title> </head> <body bgcolor="#93A3AA">
la page connexion_BDD.php:

Code : Tout sélectionner

<?php $hote= "localhost"; $user= "root"; $pwd= "admin"; $bdd= "baseclient"; function BDD_Connect() { global $hote,$user,$pwd,$bdd; //Connexion base de donnees $cnx=mysql_connect($hote, $user, $pwd) or die("Connexion Impossible"); if (!$cnx) { return false; } else { $cnx2=mysql_select_db($bdd) or die ("Base Inexistante"); if (!$cnx2) { return false; } else { return $cnx; } } return $cnx; } ?>
la page de log.php:

Code : Tout sélectionner

<?php //Retourne le contenu des variables si elle ne sont pas vides if (isset($_POST['pseudo']) && isset ($_POST ['mdp'])) { $pseudo = $_POST['pseudo']; $mdp = $_POST['mdp']; //Connexion au serveur $idconnexion= BDD_Connect(); //test de connexion au serveur if ($idconnexion) { //requete qui verifie que le login et le mot de passe utilisateur existe $query="select idEmploye from employe where loginEmploye = '".$pseudo."' and passEmploye = '".$mdp."'"; //recuperation du résultat de la requete $result= mysql_query($query); if (mysql_num_rows($result)>0) { $numuser=mysql_fetch_row($result); $_SESSION['validuser'] = $pseudo; $num=$numuser[0]; // on créé le cookie setcookie("log", $num, time()+60*60*24*365, "/") or die("Impossible d'écrire le Cookie.<br />"); //echo $_SESSION['validuser']; } else { echo("login ou mot de passe incorrect.<br />"); } } //fermeture connexion et vidage de la mémoire mysql_free_result($result); mysql_close($idconnexion); } //on test si le cookie existe if (isset ($_COOKIE['log'])) { //on recupère la valeur du cookie $num=$_COOKIE['log']; $idconnexion= BDD_Connect(); //test de connexion au serveur if($idconnexion) { //on recupère les info de l'utilisateur $query="select nomEmploye, prenomEmploye, loginEmploye from employe where idEmploye = '".$num."'"; //recuperation du résultat de la requete $exec= mysql_query($query); if(mysql_num_rows($exec)>0) { //affectation des variables session $result=mysql_fetch_row($exec); $_SESSION['num']=$num; $_SESSION['nom']=$result[0]; $_SESSION['prenom']=$result[1]; $_SESSION['validuser']=$result[2]; } } mysql_free_result($exec); mysql_close($idconnexion); } //on test si l'utilisateur est valide pour l authentification if (isset ($_SESSION['validuser'])) { //si bon on redirige vers l index header('Location:index.php'); } else { if(isset ($pseudo)) { //Tentative d'ouverture avortée echo"Vous ne pouvez pas vous logger.<br />"; } else { //L'utilisateur n'a pas de session echo "Vous n'avez pas de session."; } } echo '<div id="log">'; //Formulaire d'ouverture de session echo ' <form method="post" name="login" id="login" onSubmit="return verifLogin()" action="index.php" > <table> <tr><td>Pseudonyme :</td> <td><input type="text" name="pseudo" id="pseudo"></td></tr> <tr><td>Mot de passe :</td> <td><input type="password" name="mdp" id="mdp"></td></tr> <tr><td colspan="2" align="center"> <input type="submit" value="Log in"></td></tr> </table></form> '; echo '</div>'; ?>
voila car les autres pages ne sont pas incluses lors de la premiere connexion.

Encore merci d avance et desole pour continuer a vous embeter avec ce probleme de debutant :oops:

Eléphant du PHP | 377 Messages

25 juin 2007, 14:41

ok, alors voici ce qu'il faut que tu fasses :
la page log.php doit être scindée en deux parties, l'une (checklog.php) qui ne s'occupera que de la validation des données (donc tous tes tests $_POST, $_SESSION, setcookie()...) et qui SURTOUT n'affichera aucune donnée, et la seconde (afflog.php) qui s'occupera de l'affichage de la boite de login et des messages d'erreur eventuels

ensuite, la structure de ta page doit etre la suivante :
//index.php
session_start(); 
include('script/connexion_bdd.php'); 
include("checklog.php"); // <---- ici et nulle part ailleurs
include('include/head.php'); // <----- a partir de cette ligne, tu as affiché des données, tu ne peux donc plus modifier tes headers 
if (!isset ($_SESSION['validuser'])) 
{ 
  require ('afflog.php'); // <----- ceci n'est que de l'affichage
} 
else 
{ 
...
en espérant t'avoir aidé ;)
Petit scarabée deviendra grand

Petit nouveau ! | 4 Messages

26 juin 2007, 10:46

Merci a toi cher ami c est cool ca marche enfin !!!!

on maintenant j ai d autre problemes de session qui ne prend pas encompte les info que je rentre dans les variables session, l appli me créer 2 cookie mais ne prend pas le bon en compte enfin bon je vais essayer de me debrouiller.

En tous cas encore merci ca depanne grave lol.

A bientot amis phpeur!!


C EST GOOD TOUT MARCHE NICKEL C COOLOS YAHOOOOOOOOOO!!!! :lol: