Problème session_start

Mammouth du PHP | 531 Messages

11 oct. 2007, 15:46

Bonjour,

Je viens de tester un de mes sites sur un hébergement mutualité en PHP 4, et j'ai visiblement un truc qui cloche quand j'essaye de me connecter au back office :

Warning: Cannot send session cookie - headers already sent by (output started at /web/Xk/Xr/Xy/.../public/www/.../index.php:33) in /web/Xk/Xr/Xy/.../public/www/.../connexion.php on line 13

Les ... correspondent à des adresses.

Donc dans l'ordre j'initialise la variable de session que j'essaye de passer :
if (!isset($_SESSION['identifiant'])) {
$_SESSION['identifiant']= '';
}
Ensuite le code correspondant à la page de connexion :
<?php
if (isset($_POST['identifiant'])) {
	if ($_POST['identifiant'] != $identifiant) { // SI IDENTIFIANT INCORRECT
		echo '<script langage="text/javascript">document.location.href="index.php?page=connexion&alerte='.$mess_identifiant.'"</script>';
		exit();
	}
	if ($_POST['identifiant'] == $identifiant) { // SI IDENTIFIANT OK
		if ($_POST['passe'] != $passe) { // Si pass incorrect
		echo '<script langage="text/javascript">document.location.href="index.php?page=connexion&alerte='.$mess_motpasse.'"</script>';
		exit();
    }
    else {
		session_start(); // Sinon debut session
  	$_SESSION['identifiant']= $_POST['identifiant'];
		echo '<script langage="text/javascript">document.location.href="administration.php"</script>';
    }
	}
}
?>
<h1>Connexion</h1>
<?php echo $alerte ?>
<form method="post" action="index.php?page=connexion">
<p><label>Identifiant : </label><input type="text" name="identifiant" /></p>
<p><label>Mot de passe : </label><input type="password" name="passe" /></p>
<p><input type="submit" value="OK"</p>
</form>
Voilà
Sinon sous un autre hébergeur mutu en PHP5 ça marche. je pense que j'ai fait une grosse boulette quelque part ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

11 oct. 2007, 16:14

Cannot send session cookie - headers already sent by (output started at /web/Xk/Xr/Xy/.../public/www/.../index.php:33)
:arrow:
Cher utilisateur,

J'ai tenté par tous les moyens de satisfaire votre demande, mais voilà, je n'ai pas pu vous envoyer le cookie associé à la session car mon créateur a déjà envoyé des informations à votre navigateur à la ligne 33 de ce script, alors qu'il sait parfaitement qu'il ne doit rien envoyer avant de faire un header(), un setCookie() ou comme ici un session_start().

Bien sur, il prétendra que chez mon cousin #5 ceci fonctionne correctement, mais il omettra de vous dire qu'il s'agit là d'une question de paramétrage du php.ini qui permet de tolérer un buffer de sortir plus ou moins grand avant de déclencher cette erreur.

Vous priant de bien vouloir l'excuser pour ne pas avoir pensé à mettre cette commande en début de script et nous éviter ainsi ces désagrément, je vous souhaite la bonne journée.

Cordialement,
PHP4
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 531 Messages

11 oct. 2007, 16:36

Ben là faut que je regarde la doc de plus près je crois =)
Par contre je comprends pas le passage sur l'envoi d'infos ligne 33...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

11 oct. 2007, 16:44

bah dans ton fichier index.php, tu dois avoir un envoi de données vers le navigateur à la ligne 33.. donc déjà identifier la ligne en question.

C'est probablement l'un de tes echo '<script>...'; qui est exécuté, et donc envoi du code html au navigateur qui dès lors ne supportera plus de header ou d'envoi de cookie (et donc de session si celle ci est basée sur les cookies, ce qui est le cas par défaut)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 531 Messages

11 oct. 2007, 17:37

bah dans ton fichier index.php, tu dois avoir un envoi de données vers le navigateur à la ligne 33.. donc déjà identifier la ligne en question.

C'est probablement l'un de tes echo '<script>...'; qui est exécuté, et donc envoi du code html au navigateur qui dès lors ne supportera plus de header ou d'envoi de cookie (et donc de session si celle ci est basée sur les cookies, ce qui est le cas par défaut)
Ligne 33 j'ai un echo avec une donnée que j'ai sortie de ma base... mais comme il y a des includes aussi...

Ma page index donne ça :

Code : Tout sélectionner

<?php // c // c // c // c include 'var.php'; include 'config.php'; include 'fonc.php'; $req_config= mysql_query("SELECT titre,description,motscles,css FROM bloom_config WHERE id=1"); // CONFIG $data_config= mysql_fetch_array($req_config); $req_menu= mysql_query("SELECT id,nom_lien FROM bloom_pages WHERE visible=1 ORDER BY pos_lien"); // MENU switch($page) { default : // PAR DEFAUT ON AFFICHE LA PAGE D'ACCUEIL (ID=1) $id=1; $url= 'lecturepage.php'; break; case 'connexion': $url= 'connexion.php'; break; case 'lecturepage': $url= 'lecturepage.php'; } ?> <!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" xml:lang="cs" lang="cs"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title><?php echo $data_config['titre'] ?></title> <meta name="description" content="<?php echo $data_config['description'] ?>" /> <meta name="keywords" content="<?php echo $data_config['motscles'] ?>" /> <link rel="stylesheet" href="styles.css" type="text/css" /> <style type="text/css"> <?php echo $data_config['css'] ?> </style> <script language="javascript" type="text/javascript" src="js.js"></script> </head> <body> <div id="containeur"> <div id="head"><h1>BloOm CMS !</h1></div> <div id="gauche"> <div id="menu"> <ul> <?php while ($data_menu= mysql_fetch_array($req_menu)) { // BOUCLE MENU echo '<li><a href="index.php?page=lecturepage&id='.$data_menu['id'].'">'.$data_menu['nom_lien'].'</a></li>'; } ?> </ul> </div> </div> <div id="droite"> <?php include $url ?> </div> <div id="foot"> <?php include'foot.php' ?> </div> </div> </body> </html>
Et la page connexion qui est incluse :

Code : Tout sélectionner

<?php if (isset($_POST['identifiant'])) { if ($_POST['identifiant'] != $identifiant) { // SI IDENTIFIANT INCORRECT echo '<script langage="text/javascript">document.location.href="index.php?page=connexion&alerte='.$mess_identifiant.'"</script>'; exit(); } if ($_POST['identifiant'] == $identifiant) { // SI IDENTIFIANT OK if ($_POST['passe'] != $passe) { // Si pass incorrect echo '<script langage="text/javascript">document.location.href="index.php?page=connexion&alerte='.$mess_motpasse.'"</script>'; exit(); } else { session_start(); // Sinon debut session $_SESSION['identifiant']= $_POST['identifiant']; header ('location:administration.php'); } } } ?> <h1>Connexion</h1> <?php echo $alerte ?> <form method="post" action="index.php?page=connexion"> <p><label>Identifiant : </label><input type="text" name="identifiant" /></p> <p><label>Mot de passe : </label><input type="password" name="passe" /></p> <p><input type="submit" value="OK"</p> </form>
Donc bon il faut que je me penche sur les sessions
Mais je comprend toujours pas ce qui est envoyé :cry: [/php]

Eléphant du PHP | 443 Messages

11 oct. 2007, 17:39

Si ton code tourne avec une version de PHP >= 5.10RC1, Utilise la fonction
fputcsv(...);

Mammouth du PHP | 531 Messages

11 oct. 2007, 17:58

Si ton code tourne avec une version de PHP >= 5.10RC1, Utilise la fonction
fputcsv(...);
Alors là je nage, dans l'océan :D
J'ai regardé la doc de la fonction, enfin ce que j'ai trouvé derrière son lien et je suis complètement largué sur le rapport avec mon problème.

Bon donc si j'ai bien compris j'ai envoyé quelquechose au navigateur avant de faire mon session().
Sinon dans mes echo '<script>...' je vois pas lequel peut bien s'éxecutter vu que j'ai mis des conditions... Bon allez j'y retourne, je vais bien trouver
:D

Eléphant du PHP | 443 Messages

11 oct. 2007, 18:05

Wahouu, alors là :afraid: , c'est 'Mystère et boules de gommes...', :afraid: (roulements de tambours)

En fait tu viens de lire la réponse que j'ai faite à un post sur les fichiers CSV ???!!!
Alors je suis incapable de te dire pourquoi c'est tombé chez toi, en tout cas désolé (si un modo pouvait faire migrer ma réponse ou la virer...)

a+
Modifié en dernier par Tracker le 11 oct. 2007, 18:07, modifié 1 fois.

Mammouth du PHP | 531 Messages

11 oct. 2007, 18:07

Wahouu, alors là :afraid: , c'est 'Mystère et boules de gommes...', :afraid: (roulements de tambour)

En fait tu viens de lire la réponse que j'ai faite à un post sur les fichiers CSV ???!!!
Alors je suis incapable de te dire pourquoi c'est tombé chez toi, en tout cas désolé (si un modo pouvait faire migrer ma réponse ou la virer...)

a+
Oui je vois ta réponse.
J'ai bien pensé que c'était une erreur mais bon j'étais pas nomplus sur à 100% :wink:

Eléphant du PHP | 443 Messages

11 oct. 2007, 18:14

tu fais un <?php echo .... à la ligne 33
et ton <?php include $url {connexion.php qui fait le session_start()} est à la ligne 62

??!! Tu vois sans doute le problème, non ?

[edit]
la réponse était pour le faire pardonner d'avoir pourri ton post avec mes boulettes :wink:
Modifié en dernier par Tracker le 12 oct. 2007, 10:41, modifié 1 fois.

Mammouth du PHP | 531 Messages

11 oct. 2007, 19:42

Maintenant oui je comprends... il a fallu le temps

Donc pour remédier au probleme il faut que j'ouvre une session au tout début si aucune n'existe avec une variable identifiant valeur bidon et que lors de la connexion, si tout est bon, je passe remplace la valeur bidon par la correct ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

12 oct. 2007, 10:37

C'est encore plus simple... tu démarres la session au début de ton script, si tu as besoin d'y stocker des paramètres tu le fais, si tu n'en as pas besoin, tu ne le fais pas et ils n'y seront pas, pis c'est tout :)
session_start();
...
    if ($_POST['identifiant'] != $identifiant) { // SI IDENTIFIANT KO 
       ...
    } 
    else { // SI IDENTIFIANT OK 
       if (...) {
          ...
       } 
       else { 
          $_SESSION['identifiant']= $_POST['identifiant']; 
          ...
       } 
    } 
...
Et puis par la suite suffit de regarder dans ton code si $_SESSION['identifiant'] existe pour savoir si l'utilisateur s'est authentifié correctement :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 531 Messages

12 oct. 2007, 11:00

En fait je ne veut pas vérifier que la session est ouverte dès le début.

Je crois que j'ai réussi.

Au tout début sur la page index j'ouvre une session avec rien dedans
session()
Ensuite quand on s'identifie je test si c'est correct, je créé la variable de session et je redirige :
<?php
if (isset($_POST['identifiant'])) {
  if (empty($_POST['identifiant']) || empty($_POST['passe'])) {
	exit();
	}
	if ($_POST['identifiant'] != $identifiant) { // SI IDENTIFIANT INCORRECT
		echo '<script langage="text/javascript">document.location.href="index.php?page=connexion&alerte='.$mess_identifiant.'"</script>';
		exit();
	}
	if ($_POST['identifiant'] == $identifiant) { // SI IDENTIFIANT OK
		if ($_POST['passe'] != $passe) { // Si pass incorrect
		echo '<script langage="text/javascript">document.location.href="index.php?page=connexion&alerte='.$mess_motpasse.'"</script>';
		exit();
    }
    if ($_POST['passe'] == $passe) { // Si pass correct
  	$_SESSION['identifiant']= $identifiant;
		echo '<script langage="text/javascript">document.location.href="administration.php"</script>';
    }
	}
}
?>
Par contre du coup vu que la variable $_SESSION['utilisateur'] n'existe pas avant , dois-je l'initialiser auparavant ? $_SESSION['utilisateur']= ''

Maintenant j'ai un autre problème : Mes variables contenant les message d'erreur (ex : $mess_motpasse) ne s'affiche plus sur la page mais ils apparaissent dans l'url.
Ca aussi il me semble que ça a un rapport avec la config php et les variables globales ? Enfin je crois...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

12 oct. 2007, 11:19

Ben vi, c'est ça :)

Et tu n'es pas obligé de l'initialiser $_SESSION['identifiant'] avant dans la mesure où tu la déclares et l'initialise en même temps. En revanche le fait de l'initialiser te permettra d'être sur de la trouver en session (même si elle est vide), et tu ne seras pas obligé de tester si elle est présente (avec isSet) pour l'utiliser :) (juste faire un empty() pour vérifier qu'elle n'est pas vide :))


Pas compris la seconde question par contre....
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 531 Messages

12 oct. 2007, 11:24

Ben vi, c'est ça :)

Et tu n'es pas obligé de l'initialiser $_SESSION['identifiant'] avant dans la mesure où tu la déclares et l'initialise en même temps. En revanche le fait de l'initialiser te permettra d'être sur de la trouver en session (même si elle est vide), et tu ne seras pas obligé de tester si elle est présente (avec isSet) pour l'utiliser :) (juste faire un empty() pour vérifier qu'elle n'est pas vide :))


Pas compris la seconde question par contre....
Oki merci pour l'explication.

Pour le deuxième point c'est simple; Comme tu vois quand il ya erreur d'identification je recharge la page en passant une variable. (cette variable est défini dans un fichier var.php qui contient un message) : echo '<script langage="text/javascript">document.location.href="index.php?page=connexion&alerte='.$mess_motpasse.'"</script>';

Dans la page en question j'ai un echo $alerte, qui n'affiche rien en tant normal, mais qui devrais afficher le contenu de la variable passé par le lien quand j'en passe une.

Ca marche aléatoirement. Je teste le sript sur deux hébergement. Sur l'un le echo renvois bien le message sur l'autre non.