Page 1 sur 1

PRB de session

Posté : 17 juin 2005, 11:59
par matteo17
Bonjour,
J'essaye d'utiliser les sessions pour mon site mais je ne comprend pas trop pourkoi celui-ci m'affiche parfois le message d'erreur ci-dessous.
Kelkun peut m'expliquer l'histoire des session car bien que j'ai parcouru certains tutoriaux certains point reste un peut flou.

Dans la logique des choses j'ai mis un session_start() dans mon fichier index.php, et lorsque je souhaite réutiliser certaines informations tel que l'identifiant de session je fais session_start() et puis après session_id().
Donc je ne comprend pas ce message d'erreur.
Si kelkun a la gentillesse de me répondre et de m'expliquer un peut, de grand merci il recevra ...


Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at c:\program files\easyphp1-8\www\siteweb\CTRL_maSelection.php:12) in c:\program files\easyphp1-8\www\siteweb\CTRL_maSelection.php on line 18

Posté : 17 juin 2005, 12:01
par Cyrano
Il ne doit rien y avoir avant le session_start() qui soit envoyé au navigateur. Un simple espace avant le <?php suffit à faire générer l'erreur. Si tu envoie le moindre espace ou du html avant, ça plante.

Posté : 17 juin 2005, 12:08
par matteo17
J'utilise des classes.
Est-ce ke je dois mettre mon session_start() dans le constructeur et le tour et joué?

Posté : 17 juin 2005, 12:28
par Cyrano
Non, parce qu'à priori, au moment de l'instanciation de classe, tu as déjà du contenu envoyé, au moins les en-têtes http de la page.

Si ta page est constituée de plusieurs morceaux, par exemple entete.php puis contenu,php puis piedpage.php, tu ne dois mettre le session_start() que sur le premier fichier, entete.php, mais pas sur les autres sous peine de générer une erreur.

Posté : 17 juin 2005, 15:42
par matteo17
Oui mais si je met pas de session_start() dans mon constructeur ou dans une des fonctions de cette classe comment je fais pour ajouter des infos dans mes variable de sessions?

Posté : 17 juin 2005, 16:04
par RE
J'ai résolu mon probleme mais la solution est un pe tiré par le cheveu.
Je passe en parametre du constructeur une variable booléen, qui a l'initialisation de l'instance fait le session_start(), comme ca je peu réutiliser les objets de la classe.
Néanmoins, c tiré par les cheveu.
Personne à une idée ou a deja planché sur ce sujet pour me fournir une solution plus propre.
Merci.

Posté : 17 juin 2005, 17:04
par cerber
as-tu déja vu comment le serveur envoie une page web au client ?
Sait tu ce qu'est un header http ? pas la balise HTML <HEAD>, nonnon, un header HTTP ?

En fait, juste avant de lui envoyer la page web le serveur envoie des infos au client, entre autre les cookies (session_start() ajoute un cookie c'est de là que viens ton erreur). Ces infos ne sont jamais affichées par le client mais sont réellement utiles...
PHP sait comment les gerer (header(), session_start(), setcookie(), ....) et il les envoie automatiquement quand c'est nécéssaire. L'envoi s'effectue dès qu'un morceau de code html est placé hors du php, ou lors d'un echo.

LA SOLUTION : activer la gestion de buffer avec ob_start() (si tu as le droit)
ob_start() va mettre en mémoire les header et le html dans deux buffers séparés et ne les enverra qu'en quittant le script php (si l'option auto flush est activée ce qui est le cas à 99.99%)

Posté : 17 juin 2005, 17:15
par matteo17
j'ai pas trop compris. :?
Je ne souhaite pas utiliser les coockies car les variables de sessions ne peuvent etre modifier par les utilisateur, enfin d'apré ce ke g lu et compris.
C confus je suis désolé.
Suis-je obliger d'en utiliser?

Posté : 17 juin 2005, 19:21
par Cyrano
Peux-tu nous décrire sommairement le schéma de construction de ta page: quelque chose du style:
1 appel de tel fichier qui fait telle chose
2 appel de telle classe qui fait telle autre chose
etc...
Là, on saura à peu près te guider pour te dire où mettre ton session_start()

Posté : 21 juin 2005, 23:11
par matteo17
En fait j'ai un fichier index.php dans lequel je fais un premier session_start().
Sur click d'un lien dans mon menu j'ai une page qui se charge dans un tableau de mon fichier index.php
Sur cette page une fois chargé, je click sur un nouveau lien qui me permet
d'ajouter à mes favoris l'article que je viens de selectionner.
Le traitement de l'action se fait via une sorte de pop up qui affiche à l'utilisateur un message.

Donc pour le moment ma méthode marche mais je la trouve un peu Kaka.

Posté : 22 juin 2005, 07:18
par Cyrano
J'ai relevé un détail en relisant rapidement le sujet: tu n'as pas besoin de faire un nouveau session_start pour ajouter une nouvelle variable de session ou en mettre une à jour.

Il y a deux choses : d'une part la session qui englobe le site, d'autre part les variables de sessions. La session elle même est maintenue "en vie" avec session_start à l'ouverture de toute nouvelle page, et les variables de session peuvent être créée, modifiées ou supprimées ensuite à n'importe quel endroit de la page.

SI tu initialises une variable de session en début d'un script, tu peux la modifier dans le milieu du script et la supprimer à la fin du script: le session_start n'a besoin d'être utilisé qu'un seule fois au début soit du script si ce script est la première chose qui est chargée quand on appelle la page, soit dans la partie de code qui démarre cette page.

Fais-tu bien la distinction ?

Posté : 23 juin 2005, 15:18
par matteo17
Oui, je crois.
Je m'étais deja aperçu que le session_start() de l'index restait actif pour
ce que je voulais faire.
Néanmoins, un autre problème m'embête au meme endroit.
Je souhaite mettre dans mes variable de session des infos et impossible de faire un array_push.
Je capte pas! Alors kan local ca marche nickel. D'ou vient la boulette?

code:
print_r($_SESSION['maSelection']);
array_push($_SESSION['maSelection']['ref'], $reference);
array_push($_SESSION['maSelection']['categorie'], $categorie);
print_r($_SESSION['maSelection']);


erreur:
Array ( )
Warning: array_push(): First argument should be an array in blabla on line 48

Warning: array_push(): First argument should be an array in blabla on line 49
Array ( [ref] => [categorie] => )

Posté : 27 juin 2005, 09:56
par cerber
j'ai pas trop compris. :?
Dsl pour le retard : j'était en vacances 8)

pour l'histoire de l'ob_start() c'est super simple, y'a pas *vraiment* a comprendre, il suffit d'ajouter en début de chaque script PHP les lignes suivantes (j'ai inclu le session_start() tant qu'a faire ;) ) :
<?
ob_start();
session_start();
........
LA SEULE CONTRAINTE est qu'il ne faut pas un seul espace ni morceau de html ou de php avant le <?

Ensuite, pour ton array_push, essaye de les remplacer par un :
$_SESSION['maSelection']['ref'][]=$reference;
ou alors, modifie ton script comme ca :
print_r($_SESSION['maSelection']);
if(!isset($_SESSION['maSelection']['ref'])){
  $_SESSION['maSelection']['ref']=array();
}
array_push($_SESSION['maSelection']['ref'], $reference);
if(!isset($_SESSION['maSelection']['categorie'])){
  $_SESSION['maSelection']['categorie']=array();
}
array_push($_SESSION['maSelection']['categorie'], $categorie);
print_r($_SESSION['maSelection']);