Tout sur les sessions

Soyez le premier à donner votre avis sur cette source.

Vue 41 442 fois - Téléchargée 3 597 fois

Description

Comme promis a hicksman voici un tuto sur les sessions.

Vous trouverez d'abord un petit exemple de 5 pages qui montre l'utilisation simple d'une session, comment on enregistre des variable, comment on les éffaces, comment on ferme la session ...

Ensuite vous trouverez les explications sur toutes les fonctions relatives aux sessions.

Pour faire ce tuto, je me suis aidé de "la bible php" pour certaines fonctions que je n'utilise jamais. Je vous conseil ce livre de 1400 pages trés complets mais assez cher par contre :-/ (59? essayez la fnac c'est moins cher souvent)

Source / Exemple :


>>>>> page index.php

<?
$variable = "tortue"; // on initie la variable

session_start(); // Démarage de la session OBLIGATOIRE
session_register("variable"); // On enregistre une variable appelée "variable" dans la session SANS LE $ DEVANT

if (session_is_registered(variable)) // si la variable est enregistrée
{
	echo "Variable de session <b>enregistrée</b> ...<br>";
	echo "<a href=\"viewsession.php\">Options des sessions</a><br>";
	echo "<br><br>L'id de la session est <b>".session_id()."</b>    ";
	exit;
}
else // La variable n'est pas enregistrée
{
	echo "Variable de session <b>non enregistrée</b> ...";
	exit;
}
?>

----------------------------------------------------------------------------------------

>>>>> page viewsession.php

<?
	session_start(); // Démarage de la sessions OBLIGATOIRE

	echo "La variable de session qui a été enregistrée est <b>".$_SESSION[variable]."</b><br>";
	echo "<a href=\"ajoutvariable.php\">Ajoutons une variable à la session</a><br>";
	// Notez ici le $_SESSION qu'il faut utiliser lorsque register_global est à off
	// Nous aurions pu écrire directement $varaible mais
	// depuis la dernière version de php les register_global sont à off dans la configuration initial
	// dans un soucis de sécurité. Donc pensez à utiliser cette orthographe pour vous servir de vos variables de session
	echo "<br><br>L'id de la session est <b>".session_id()."</b>";
	exit;
?>

----------------------------------------------------------------------------------------

>>>>> page ajoutvariable.php

<?
	session_start(); // Démarage de la sessions OBLIGATOIRE
	$nom = "Geniale";

	session_register("nom"); // On enregistre une variable appelée "nom" dans la session SANS LE $ DEVANT
	
	if (session_is_registered(nom)) // si la variable est enregistrée
	{
		echo "Opération réussie, La variable <b>\"nom\"</b> a été enregistrée dans la session<br>";
		echo "<a href=\"effacement.php\">Effaçons maintenant la variable \"nom\"</a><br>";
		echo "<br><br>L'id de la session est <b>".session_id()."</b>";
		exit;
	}
	else
	{
		echo "Enregistrement <b>raté</b> ...";
		exit;
	}
?>

----------------------------------------------------------------------------------------

>>>>> page effacement.php

<?
	session_start(); // Démarage de la sessions OBLIGATOIRE
	
	if (session_is_registered(nom)) // si la variable nommée "nom" est enregistrée on peut l'éffacer
	{
		echo "La variable nom a comme valeur <b>".$_SESSION[nom]."</b><br>";
		
		if (session_unregister(nom)) // si elle est éffacée
		{
			echo "La variable <b>\"nom\"</b> a été éffacée ...<br>";
			echo "La preuve, essayons de l'afficher ici : <b>".$_SESSION[nom]."</b><br>";
			echo "<a href=\"destruction.php\">Destruction des variables de session</a><br>";
			echo "<br><br>L'id de la session est <b>".session_id()."</b>";
			exit;
		}
		else // éffacement raté
		{
			echo "Effacement raté ...";
			exit;
		}
	}
	else // la variable nommée nom n'existe pas
	{
		echo "La variable nommée \"nom\" n'existe pas ...";
		exit;
	}
?>

----------------------------------------------------------------------------------------

>>>>> page destruction.php

<?
	session_start(); // Démarage de la sessions OBLIGATOIR

	session_unset();

	if (session_destroy())
	{	
		echo "A ce stade il nous reste la Variable <b>\"variable\"</b> enregistrée<br>";
		echo "Normalement <b>session_destroy</b> et <b>session_unset</b> l'ont détruit, testons ceci : ".$_SESSION[variable]."<br>";
		echo "<b>Rien n'apparait</b>, la variable n'existe plus et si il y en avait eu d'autre, elles n'existeraient plus<br>";
		echo "Opération réussie<br>";
		echo "<br><br>L'id de la session est <b>".session_id()."</b><br>";
		echo "Oups elle n'exite plus nom plus ;-)<br><br>";
		exit;
	}
	else
	{
		echo "Effacement raté ...";
		exit;
	}
?>

Conclusion :


!!! AUCUNE BALISE HTML NE DOIT ETRE ENVOYE AVANT UNE SESSION !!!

Car les sessions modifient le header (entête) de la page et mais quand le header est déjà lancé il ne peut plus être modifié.

- session_start() indique que l'on demande l'ouverture d'une session

- session_register("variable") indique que l'on enregistre une variable dans la session (attention de ne pas mettre le $ devant le nom de la variable)

- session_unregister() permet de détruire une variable de session

- session_is_registered() renvoit si la variable de session existe ou pas

- session_name() permet le connaitre le nom de la session mais vous pouvez trés bien le changer en faisant session_name(nomdemasession)

- session_id() nous permet de connaitre l'id de la session courante. Vous pouvez le changer en faisant session_id(nomdelasession)

- session_destroy() détruit toutes les variables de la sessions en cours

- session_write_close() sert à écrire les données de session et termine la session.

- session_save_path() indique le dossier ou sont enregistrées les sessions sur le server mais vous pouvez modifier ce dossier en faisant session_save_path(chemindemondossier)

- session_get_cookie_params() permet d'avoir tous les renseignements sur la session courante.Tout ça est retourné dans un tableau, utilisons ici la fonction print_r pour afficher tout le contenu du tableau (la fonction print_r affiche le contenu de tout tableau, pas seulement pour les sessions, utilse pour le debug)

Info de la session courante :
Array ( [lifetime] => 0 [path] => / [domain] => [secure] => )

les variables retournées sont :
lifetime -> La durée de vie du cookie de la variable
path -> Le chemin de stockage du cookie de la session
domain -> Le domaine du cookie de la session
secure -> Indique si le cookie de session doit etre envoyé que par une connexion sécurisé

- session_set_cookie_params() permet de modifier les 3 premières variables reçue par session_get_cookie_params(). Méthode d'utilisation :
session_set_cookie_params(durée de vie du cookie de session,Chemin de sotckage du cookie de session,Domaine du cookie de session)

- session_set_save_handler() indique a php d'utiliser des fonctions personnalisées pour la gestions des sessions.
Cette fonction prend 6 attributs :
- Ouvrir
- Fermer
- Lire
- Ecrire
- Detruire
- Nettoyer
pour chacun de ses attributs vous devrez faire une fonction ou vous indiquerez tout ce que vous voulez en vous servant des conseils et des fonctions de cette page.

- session_encode converti l'ensemble des variables de sessions en une chaine de caracteres unique

- session_decode recré les variables de session converties par session_encode

- session_module_name permet de définir ou de connaitre le gestionnaire de session utilisé :
- files : les données sont temporairement enregistrées
- user : vous voulez personnaliser le stockage

- session_cache_limiter() affiche la restriction du cache appliquée. Vous pouvez aussi la définir en faisant session_cache_limiter(Variable)
Variable doit prendre comme valeur :
- nocache pour que la page ne soit pas mis en cache par le client
- public pour autoriser la mise en cache
- private est un peu plus restrictif que public
- private_no_expire permet de ne pas envoyer l'entete expire

- session_cache_expire() sert à définir ou à connaitre la durée avant expiration du cache. Pour changer l'expiration faite session_cache_expire(nombredeseconde)

=== LES ERREURS === (maj 12/11/2003)

J'ai décidé, vu le grand nombre de message que je reçoi portant souvent sur la meme chose, de mettre ici les erreurs les plus rencontrées sur les sessions

--- "Warning: Cannot send session cache limiter - headers already sent ........"
Comme je l'ai dit plus haut, il ne faut pas de html ou une ligne blanche avant le debut de la session. Donc assurez vous que les 2 premieres ligne de votre page soit :
<?
session_start();

Comme ça au moins vous etre sur que votre session sera bien ouverte.
Si dans le script vous avez la meme erreur alors que les 2 premieres lignes sont bonne, cela peut etre du à plusieur chose :
- Vous essayez d'ajouté une variable de session alors que le html a déjà était lancé.
- Une ligne de votre script génére un message d'erreur. Ce message s'affiche (il est donc en html) et donc le html est lancé, modification des header de la page impossible.

===================

Si vous avez d'autres messages d'erreurs qui ne sont pas répertoriés ici, envoyé les moi en précisant (si vous l'avait) la solution. Sinon envoyé moi un message pour que je vous aide.

Voila vous savez tout sur les sessions.
Si vous avez un problemes sur les sessions ou sur autre choses passer sur le forum j'y suis souvent !!

Bon coding !!
++

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

xsamoud
Messages postés
1
Date d'inscription
mercredi 27 août 2008
Statut
Membre
Dernière intervention
25 mars 2009
-
salut
j'ai besoin d'un script php
lorsque le client connecter d'un poste les session ouvert avec les autres sessions relatives au meme compte se ferment, de sorte à avoir une seule seule session active en même temps pour chaque compte.
(comme avec msn)
merci
jul_diedhiou
Messages postés
14
Date d'inscription
jeudi 12 mai 2005
Statut
Membre
Dernière intervention
30 janvier 2009
-
bonjour jai ce message d'erreur sur les session que j'arrive pas comprendr alor que mon script fonctionne normalement.
au fait c'est pas une erreur mais c'est un warning pouvait m'aider s'il vout plait:
voici le message:
'Warning: Unknown(): Your script possibly relies on a session side-effect which existed until PHP 4.2.3. Please be advised that the session extension does not consider global variables as a source of data, unless register_globals is enabled. You can disable this functionality and this warning by setting session.bug_compat_42 or session.bug_compat_warn to off, respectively. in Unknown on line 0'
cs_ninaW
Messages postés
1
Date d'inscription
mardi 30 janvier 2007
Statut
Membre
Dernière intervention
6 mars 2007
-
Un grand merci pour ce code qui m'a été très utile^^!! même si j'ai pas tout compri^^ mais bon le principal c'est que j'y arrive non? encor merci^^
Bye
cs_koko
Messages postés
654
Date d'inscription
lundi 14 janvier 2002
Statut
Membre
Dernière intervention
20 février 2005
-
Essaie de le mettre dans le cookie "à la main"
cs_brocoli
Messages postés
4
Date d'inscription
mardi 3 février 2004
Statut
Membre
Dernière intervention
17 février 2005
-
Hello !

C'est chose faite... il n'accepte pas les cookies de sessions, car d'après lui, certains navigateurs ne les supportent pas !
Voici un lien sur la doc officielle...
http://ch2.php.net/manual/fr/ref.session.php

Pour ma part, j'ai fais un truc comme ça :

Je test si le nom d'utilisateur et le mot de passe sont correctes, si le test est ok, je démarre la session
session_start();
//on enregistre les paramètres de notre visiteur comme variables de session (utilisateur_client et passe_client)
$_SESSION['utilisateur_client'] = $_POST['utilisateur'];
$_SESSION['passe_client'] = $_POST['passe'];
// on redirige notre visiteur vers une page de notre section membre
header ('location: ./accueil/index.php?'.strip_tags(SID));

Donc les infos passent à travers l'url... ça donne qqchose comme ça :
/index.php?sid=8b4a63c36a1d81ea27767f5fd96331f0

Sur toutes mes pages protégées :
session_start();
if (! isset($_SESSION['utilisateur_client'])) {
header ('location: ../index.php'); //retour à la page de login
} else {
//Affichage de la page
}

Bon...ça marche aussi, mais l'url est super moche !!!
De plus, je peux ouvrir une page protégée juste en séléctionnant l'url dans l'historique de mon navigateur sans même passer par la page de login !! c'est grave !

Resultat : je sais plus quoi faire :-((((
Pour info, j'ai trouvé un post sur un autre forum, ça peut toujours intéresser quelqu'un ?
http://www.phpindex.com/articles/articles_lire.php3?element=182
(le dernier msg tout en bas de page donne la réponse de comment protéger ses sessions... mais c'est un peu du bricolage ??)
Merci
A++ Oli

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.