Probleme session-start() PHP
Zanjutsu
-
aure-kun Messages postés 6 Statut Membre -
aure-kun Messages postés 6 Statut Membre -
BBonjour à tous !
J'ai un problème avec mon site, en effet je souhaites créer un espace membre en utilisant session_start() lorsque je donne le login et mot de passe ca m'affiche ceci:
Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /var/www/Site Mangas/Administration/Ad_Login_Exec.php:3) in /var/www/Site Mangas/Administration/Ad_Login_Exec.php on line 28
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /var/www/Site Mangas/Administration/Ad_Login_Exec.php:3) in /var/www/Site Mangas/Administration/Ad_Login_Exec.php on line 28
Warning: Cannot modify header information - headers already sent by (output started at /var/www/Site Mangas/Administration/Ad_Login_Exec.php:3) in /var/www/Site Mangas/Administration/Ad_Login_Exec.php on line 32
Voici la page Ad_Login_Exec :
<html>
<body>
<?php
require("Connect.php");
//récupération des données de la page login (Ad_Login)
$MonLogin = $_POST["Login"];
$MonPassword = $_POST["MotDePasse"];
$cnx = mysql_connect(SERVEUR,NOM,MOTDEPASSE) or die ("erreur de connexion au serveur mysql :".SERVEUR);
mysql_select_db(BASE, $cnx) or die ("erreur lors de la sélection à la BDD : ".BASE);
//La requête de vérification de l'existence de l'utilisateur
$LaRequete ="SELECT Login FROM T_Utilisateurs
WHERE Login ='". $MonLogin . "'
AND MotDePasse = md5('" . $MonPassword . "');";
//exécution de la requête
$ResultatRequete = mysql_query($LaRequete) or die("Erreur SQL ! <br><br>".$LaRequete."<br><br>".mysql_error);
mysql_close($cnx);
//si aucun retour c'est que l'utilisateur ou le mot de passe n'est pas valide
if (mysql_num_rows($ResultatRequete)==0)
{ //retour à la page login
header("location:Ad_Login.php?Retour=1");
}
else //si les mots de passe et login sont valides
{session_start();//on démarre une session
$_SESSION['NumSession'] = session_id(); //enregistrement du numéro de session
//on enregistre la variable utilisateur en tant que variable session
$_SESSION['Utilisateur']=$MonLogin;
header('location:Ad_MenuAdministration.php'); //redirection vers le menu d'administration
}
?>
</body>
</html>
J'ai un problème avec mon site, en effet je souhaites créer un espace membre en utilisant session_start() lorsque je donne le login et mot de passe ca m'affiche ceci:
Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /var/www/Site Mangas/Administration/Ad_Login_Exec.php:3) in /var/www/Site Mangas/Administration/Ad_Login_Exec.php on line 28
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /var/www/Site Mangas/Administration/Ad_Login_Exec.php:3) in /var/www/Site Mangas/Administration/Ad_Login_Exec.php on line 28
Warning: Cannot modify header information - headers already sent by (output started at /var/www/Site Mangas/Administration/Ad_Login_Exec.php:3) in /var/www/Site Mangas/Administration/Ad_Login_Exec.php on line 32
Voici la page Ad_Login_Exec :
<html>
<body>
<?php
require("Connect.php");
//récupération des données de la page login (Ad_Login)
$MonLogin = $_POST["Login"];
$MonPassword = $_POST["MotDePasse"];
$cnx = mysql_connect(SERVEUR,NOM,MOTDEPASSE) or die ("erreur de connexion au serveur mysql :".SERVEUR);
mysql_select_db(BASE, $cnx) or die ("erreur lors de la sélection à la BDD : ".BASE);
//La requête de vérification de l'existence de l'utilisateur
$LaRequete ="SELECT Login FROM T_Utilisateurs
WHERE Login ='". $MonLogin . "'
AND MotDePasse = md5('" . $MonPassword . "');";
//exécution de la requête
$ResultatRequete = mysql_query($LaRequete) or die("Erreur SQL ! <br><br>".$LaRequete."<br><br>".mysql_error);
mysql_close($cnx);
//si aucun retour c'est que l'utilisateur ou le mot de passe n'est pas valide
if (mysql_num_rows($ResultatRequete)==0)
{ //retour à la page login
header("location:Ad_Login.php?Retour=1");
}
else //si les mots de passe et login sont valides
{session_start();//on démarre une session
$_SESSION['NumSession'] = session_id(); //enregistrement du numéro de session
//on enregistre la variable utilisateur en tant que variable session
$_SESSION['Utilisateur']=$MonLogin;
header('location:Ad_MenuAdministration.php'); //redirection vers le menu d'administration
}
?>
</body>
</html>
4 réponses
-
et oui, evidement, le cookie de sesion est envoyé dans le header (avant l'html). et toi tu nous fait ca :
<html>
<body>
<?php
require("Connect.php");
//récupération des données de la page login (Ad_Login)
$MonLogin = $_POST["Login"];
$MonPassword = $_POST["MotDePasse"];
$cnx = mysql_connect(SERVEUR
tu envoies du html, puis dedan tu déclare l'envoi d'un cookie. ca ne peut pas marcher (sauf en activant la bufferisation). il faut que tu mette ton require("connect.php") au début du fichier:
<?php require("Connect.php"); ?>
<html>
<body>
<?php
//récupération des données de la page login (Ad_Login)
$MonLogin = $_POST["Login"];
$MonPassword = $_POST["MotDePasse"];
$cnx = mysql_connect(SERVEUR
retiens ceci: a partir du moment ou t'as du HTML ou un ECHO qui a été executé, t'as plus le droit d'envoyer de cookie (session ou autre), ni de modifier une autre entete HTTP. Meme une ligne vide ou du commentaire HTML te fera planter. et meme un fichier avec BOM te fera planté (c'est un octet en début de fichier, je sais plus a quoi il sert, mais il m'a déja emmerdé) -
je ne pense pas que ce soit Connect.php qui envoie le session_start();
donc il suffit d'enlever
<html>
<body>
au début du script
pour respecter la règle donnée par Nabla's-
pardon oui, j'avais supposé que c'était dedan, j'avais mal lu tout le code... pusqu'on trouve ces lignes la:
header("location:Ad_Login.php?Retour=1"); } else //si les mots de passe et login sont valides {session_start();//on démarre une session $_SESSION['NumSession'] = session_id(); //enregistrement du numéro de session
qui vont poser problème. Il faut donc pas faire d'echo ou mettre de html avant ces lignes
-
-
Bonjour a vous,
J'ai a peu de choses pres le meme probleme sauf que j'utilise des cookies pour la connexion voici mon code:
<?php require_once("connexion.php"); $co = mysql_connect($serveur,$user,$mdp); mysql_select_db($base); if(isset($_COOKIE["ID"])){ $connecte = 1 } ?> <html> <head> <body> ...(du code html) <?php if($connecte == 1){ //On recupere le pseudo de l'utilisateur en fonction de son ID unique dans la base de donnée $result = mysql_query ("SELECT pseudo FROM compte WHERE ID = '".$_COOKIE["ID"]."' "); while ($line = mysql_fetch_array($result)){ $pseudo = $line["0"]; } ?> <form method="post" action="php_delog.php"> <table width="100%"> <tr> <td class="pseudo"> <?php echo("Bonjour $pseudo"); ?> </td> </tr> <tr> <td> <input type="submit" name="Deconnexion" value="Deconnexion" id="bouton_deco"/> </td> </tr> </table> </form> <?php } else{ ?> <form method="post" action="php_log.php"> <table> <tr> <td colspan="2"> Identifiant </td> </tr> <tr> <td colspan="2"> <input type="text" maxlength="20" size="23" name="pse"/> </td> </tr> <tr> <td colspan="2"> Mot de passe </td> </tr> <tr> <td colspan="2"> <input type="password" maxlength="20" size="23" name="mdp"/> </td> </tr> <tr> <td> <input type="submit" name="Connexion" value="Connexion" /> </td> <td> <a href="inscription.php"><input type="button" name="S'inscrire" value="S'inscrire" /></a> </td> </tr> </table> </form> <?php } mysql_close($co); ?>
Donc lorsque je me connecte aucun message d'erreur n'apparait mais je ne suis pas pas connecté le cookie n'a pas été créer et le message [PHP] Header already sent by (output started at /home/chaudron/public_html/php_log.php:1) in /home/chaudron/public_html/cookie_inc.php on line 5 ... apparait dans le error.log de mon serveur ...
Voici mon php_log.php :
<?php require_once("connexion.php"); //Si les champs pseudo et mot de passe ne sont pas vide if (!empty($_POST['pse']) and !empty($_POST['mdp'])){ //Connexion à la base de donnée et definition de la variable $active a 1 $link = mysql_connect($serveur,$user,$mdp); mysql_select_db($base); //On recupere l'id du compte dont le pseudo et le mot de passe correspondent $result = mysql_query ("SELECT ID, pseudo, mdp FROM compte WHERE pseudo = '".$_POST["pse"]."' AND mdp = md5('".$_POST["mdp"]."') "); //On Stocke l'id de l'utilisateur while ($line = mysql_fetch_array($result)){ $id_user = $line["0"]; $pseudo = $line["1"]; $mdp = $line["2"]; } mysql_close($link); if($_POST['pse'] == $pseudo and $_POST['mdp'] == $mdp){ //On crée le cookie grace a l'id de l'utilisateur et grace auquel l'utilisateur sera logué et redirection vers l'accueil setcookie("ID",$id_user,(time() + 3600)); echo "<script type=\"text/javascript\"> location='accueil.php' </script>"; } //Si l'identifiant et le mot de passe ne correspondent pas on redirige vers l'accueil else { echo "<script type=\"text/javascript\"> alert(\" Votre identifiant ou votre mot de passe est incorrect\"); location='accueil.php' </script>"; } } //Si un des champs est vide on redirige vers l'accueil else { echo "<script type=\"text/javascript\"> alert(\"Attention un ou plusieurs champs sont vides; veuillez bien remplir tous les champs\"); location='accueil.php' </script>"; } ?>
Comment puis-je contourner ce probleme ?
Une chose aussi qui me parait bizarre c'est qu'en local cela fonctionnait très bien pourquoi ?-
réponse de facilité:
au lieu de faire des echo, prints, ou de mettre du html, tu stoques tout ton code html de retour dans une variable php. Ainsi, tu fais echo tavariable ) la fin du code, et ca passe...
ceci dit, en structurant vos programmes, vous devriez arriver à faire d'abord le traitement, ensuite l'affichage
-
-
Merci de ta reponse,
Effectivement si j'aurais mieux raisonner mon code aurait été plus propre ... je pense que quand j'aurais le temps je reprendrai tout depuis le debut