Note

J'utilise maintenant session_start() et le tableau super-global $_SESSION[] pour les sessions. Les fonctions isset(), unset() fonctionne aussi sur la variable $_SESSION[].

Introduction

Le principe des sessions avec PHP est un peu différent des sessions avec ASP si tu ne l'avais pas remarqué ;-). Dès que tu ouvres une page ASP, automatiquement une session s'ouvre sur ton ordinateur (Session_onStart()) et dès que tu fermes ton fureteur ?et/ou? tu te déconnectes du site (tu changes de page), tu fermes ta session ASP (Session_onEnd()). En ASP, tu as toujours accès à tes variables de sessions... n'importe où, n'importe quand ce qui n'est pas le cas en PHP...

En PHP, c'est toi qui décide si une page possède une gestion de Session ou non, quand est-ce que tu veux la partir dans la page et quand est-ce que tu veux la finir. Les variables sont disponibles dans tout le code. De plus, le PHP a deux attributs de plus pour les sessions... le nom de la session et l'identifiant de la session... donc si tu n'as pas les cookies... tu dois envoyé dans tes URLs le nom de la session=l'identifiant de la session. On appelle ca le SID (nom d'une constante! sans $) genre <a href="page.php?<?=SID ?>"></a>.... soit session_name()."="session_id(). Voir la remarque sur Multimania...

Petit Exemple

PageLogin.php1
=============

session_start();                     // on commence une session
session_register('MATRICULE');       // on enregistre une variable

$MATRICULE = '9883194'               // on y affecte une valeur après l'avoir enregistré!

$SID = session_name().'='.session_id(); // on construit le SID
header('Location: '.$strSitePath.'PageAccueil.php?'.$SID);  // et on change de page....

ou 
header('Location: '.$strSitePath . 'PageAccueil.php?'.SID); // <-- je ne suis pas très sur facon la!


PageAccueil.php
===============

session_start();                    // on commence ou on récupère les infos de la session....
if ( session_is_registered('MATRICULE') ) // on vérifie si on a enregistré la variable MATRICULE!
{
	echo 'VARIABLE MATRICULE ENREGISTRÉE!!';
	echo 'MATRICULE = ' . $MATRICULE;         // on affiche le matricule ou encore...
	echo 'MATRICULE = '.$_SESSION['MATRICULE']; // on est sur que c'est la variable de la session!
	echo 'CE DÉCONNECTER ICI: <a href="PageLogout.php"> Page Logout </a>';
}
else
{
	echo 'VARIABLE MATRICULE NON ENREGISTRÉE';
}

PageLogout.php
==============
session_start();   // on start la session pour mieux la fermer!
session_destroy(); // full destroy la session!

Les sessions sur Multimania!

Les sessions sur multimania sont à moitié facilité car on est pas obligé de passé le session_name() et le sesion_id().. il est automatiquement transmis grâce à une configuration côté serveur. Par contre, tu peux avoir de la difficulté à cause des '//' dans les URLs...

Fonctions

string session_name ( [string name])
Retourne le nom de la session....
(on peut changer le nom de la session avec le paramètre name...)
string session_id ( [string id])
Retourne l'identifiant de session courante. Si id est fourni, il remplacera l'identifiant courant de la session.
boolean session_start ( void)
boolean session_register ( mixed name [, mixed ...])
boolean session_is_registered ( string name)
boolean session_destroy ( void)

Après un session_start(), écrire:

	setcookie("PHPSESSID",session_id(),time()+3600*24); // (fpdf / 26-11-2001 20:52 )

Titre: Passage du SID avec la fonction header()

Description: Lorsqu'on utilise les sessions avec l'option --enabled-trans-sid activée, le passage de la constante SID s'ajoute automatiquement dans les formulaires (un champ hidden est ajouté) et dans les URL du site. structure
Cependant puisque la fonction header() est exécutée en PHP, ce n'est ni un formulaire HTML, ni une URL (code HTML), le SID n'est pas envoyé et l'on recrée une autre session. On perd donc les variables enregistrées avant la fonction header();.
[sans le SID passé par la méthode POST ou GET, la fonction session_start() créer un autre SID].


Solution: On peut remédier à ce problème en écrivant:

header('Location: page.php?'.SID);

Cependant, si on remarque que la constante SID est nulle, on peut ajouter cette ligne:

if (!defined('SID')) define ('SID',session_name() . '=' . session_id());

Et si le SID est vide, on est obligé de travailler avec une autre constante (SID2 par exemple):

if (empty('SID')) define ('SID2',session_name() . '=' . session_id());

Les perluètes (&) et le HTML/XML valide

Par défaut, PHP place des & dans le code HTML/XML lorsqu'il ajoute la variable PHPSESSID. Si vous essayez de valider votre page HTML ou XML, le code sera invalide puisque le caractère & sert à insérer des entités HTML/XML comme le caractère &gt; pour >. Il faut modifier une ligne du fichier php.ini (dans le répertoire /etc/ sous linux) ou changer l'option directement dans nos scripts PHP. Pour le fichier php.ini, on doit remplacer la ligne:

#arg_separator.output = "&amp;"
ou 
arg_separator.output = "&"

Par:

arg_separator.output = "&amp;"

Pour configurer l'option directement dans un script PHP, il faut écrire l'instruction suivante:

ini_set ( "arg_separator", "&amp;");

Les URLs seront alors sous la forme page.php?var1=1&amp;var2=2. Ne vous inquitez pas de la forme étrange de l'URL, car votre navigateur convertira le &amp; par un & lorsqu'on cliquera sur le lien.

N'oublier pas de repartir votre serveur après la modification. (apachectl -k restart par exemple).