La fonction session_start() doit être la première ligne dans une page php,
aucune ligne vide ou ligne html ou echo ne doit être avant sinon le serveur ne peut pas démarrer une session si des données ont été déjà affichées sur le navigateur.
Sous PHP, la session marche comme ça:
1. quand un client-navigateur demande une url de page, le serveur démarre une session pour ce client si la page demandée commence par session_start()
En fait, le serveur ne fait que créer un fichier dont le nom est un n° unique aléatoire (SID : identifiant de la session)
Le fichier SID va contenir toutes les variables de session de ce client (variables globales dont la durée de vie dure avec la navigation dans les page initialisées par session_start())
Les fichiers de sessions des clients connectés sont stockés par le serveur apache dans le dossier /tmp
2. la suite est logique : le serveur renvoi toujours le SID avec sa réponse au client-navigateur qui doit à son tour mémoriser auatomatiquement le SID dans ses cookies pour pouvoir le renvoyer une autre fois avec une nouvelle demande de page.
3. Le SID devient un ticket échangé entre le client et le serveur pour que ce dernier puisse recharger les données du client qui déclenche qui demande une page php.
En php, le fichier de session-client est accèssible par le tableau système $_SESSION.
Ainsi pour stocker une données le programme php l'écrit dans le tableau $_SESSION (ex: $_SESSION["nom"] = "ttoto"; $_SESSION["prix"]=100,00;)
De la même manière, pour lire des données le programme php utilise le tableau $_SESSION (ex: echo "$_SESSION[nom]";)
4. Quand un client efface ses cookies ou arrête son navigateur, il perd en fait ses SID auquel cas le serveur ne peut plus lui restituer ses fichiers de session donc ses données.
Le serveur détruit en fait tout fichier de session abondonné ou dont la durée de vie est dépassée ou si le programme le commande par session_destroy().
Pour la configuration des paramètres de session chez le serveur il faut consulter PHP.ini
Pour permettre les sessions client/serveur il faut que le client accèpte les cookies.
Exemple simple :
page1.php : cette page va être la première consultée et va stocker quelleque données dans une session
<?php
//démarrer ou réactiver une session pour un client
session_start();
//session_start : récupère un SID existant envoyé par le client
//ou en crée un pour un nouveau client
//Un SID = un fichier session qui contient des données globales ($_SESSION)
?>
<p>Formulaire de saisie de données
<form>
<p>Nom <input name=nom>
<p>Prénom <input name=prenom>
<p><input type=submit action=action value=Enregistrer>
</form>
<?php
//Après validation, enregistrer les données envoyées par le formulaire dans la session
if ($_GET["enregistrer"])
if ($_GET["nom"] && $_GET["prenom"]) {
$_SESSION["nom"] = $_GET["nom"];
$_SESSION["prenom"] = $_GET["prenom"];
//Après enregistrement rediriger vers la suite
header ("Location: page_suivante.php");
}
else echo "<p>Données incorrectes!"; //Erreur: rester sur cette page
?>
Le page_suivante.php : récupère la session du client et recharge un certain nombre de données de session déjà stocké
<?php
//démarrer ou réactiver une session pour un client
session_start();
//session_start : récupère un SID existant envoyé par le client
//ou en crée un pour un nouveau client
//Un SID = un fichier session qui contient des données globales ($_SESSION)
?>
<h1>Bienvenue, <?php echo "$_SESSION[nom] $_SESSION[prenom]"; ?> </h1>
Merci .....
Conclusion:
- - Le client demande une page php qui fait un session_start()
- Le serveur détermine le SID de ce client (nouveau/existant) = dans tous les cas un SID désigne un fichier de session + un tableau $_SESSION pour accèder au données du fichier ;
Le serveur termine le programme de la page demandée et renvoi la réponse + le SID
- Le client reçoit la réponse + le SID qu'il mémorise dans un cookie (si autorisé sur le navigateur sinon pas de session)
Et le cycle est bouclé, à la prochaine demande de page le client remettra son SID avec (s'il s'agit bien sûr d'une page sur le même site)
Le SID (n° aléatoire) est transmis par le client-navigateur automatiquement avec la requête HTTP.