Quelles sont les erreurs possibles ?
Répertoire de session inaccessible
Warning: open(/tmp\sess_3c80883ca4e755aa72803b05bce40c12, O_RDWR) failed: m (2) in c:\phpdev\www\bp\header.php on line 2
ou encore
PHP Warning: Unknown(): open(/tmp\sess_3c80883ca4e755aa72803b05bce40c12, O_RDWR) failed: No such file or directory (2) in Unknown on line 0
PHP Warning: Unknown(): Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/tmp) in Unknown on line 0
Cette erreur est due à l'absence du répertoire de sauvegarde (ici /tmp) des sessions ou bien au manque du droit d'écriture dans ce répertoire pour les visiteurs (utilisateur nobody, www-data ou autre... sous Apache).
Le répertoire de sauvegarde est défini dans le
php.ini : session.save_path = /tmp
Il faut donc:
- Créer un répertoire
- Lui donner les droits d'écriture pour tous
- En spécifier le chemin dans le php.ini
PHP n'est pas autorisé à utiliser les sessions
Il faut s'assurer que le PHP est bien autorisé a créer des sessions. C'est juste un paramètre à activer. Faire un
phpinfo() pour voir ces paramètres. La commande
phpinfo() se contente d'afficher dans le navigateur le contenu du fichier de configuration
php.ini.
Avoir déjà écrit dans la page
Warning: Cannot send session cookie - headers already sent by (output started at /home/SiteWeb/SiteAnalyse/index.php:3) in /home/SiteWeb/SiteAnalyse/index.php on line 6 Cette erreur survient lorsqu'on tente d'ouvrir une session après avoir déjà écrit dans le document, ce qui interdit, bien sûr.
Tentative d'envoie d'entêtes
Warning: Cannot add header information - headers already sent by (output started at /home/SiteWeb/SiteAnalyse/index.php:3) in /home/SiteWeb/SiteAnalyse/index.php on line 25 Cette erreur survient lorsqu'on tente d'envoyer des entêtes grâce à la fonction
header() après avoir écrit dans la page.
On ne peut pas commencer une session après que le serveur ait envoyé au client les entêtes HTTP/1.0 (ou supérieures) de la page.
Ainsi, la commande
session_start() doit impérativement être exécutée avant tout envoi par le serveur d'entêtes HTTP au navigateur.
L'identifiant de session étant envoyées sous forme de cookies au client, ce dernier doit être envoyé avant que la page ne s'affiche car l'affichage force l'envoie d'entêtes.
Tout contenu texte placé avant
session_start() (même un saut de ligne) provoque un affichage et donc l'envoie d'entêtes qui doivent précéder contenu de la page.
Ce qu'il ne faut pas faire :
<html>
<body>
<?php session_start();
...
ceci non plus : <?php echo "<html>";
...
session_start();
Car cela provoque l'envoi d'entêtes au navigateur. Donc ces deux essais sont erronés. Il faut faire le
session_start() avant toute chose !!! Même un simple saut de ligne dans le script avant
session_start() provoque cette erreur.
Défaut de déclaration de classe
Fatal error: The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition utilisateur of the object you are trying to operate on was loaded _before_ the session was started in /home/SiteWeb/SiteAnalyse/test.php on line 12 Lorsqu'une variable que l'on veut enregistrer dans une session est un objet, PHP doit pouvoir en connaître la description, il faut donc déclarer les classes avant de faire un
session_start().