Session en php

Session

Une session est un mécanisme permettant de sauvegarder temporairement sur le serveur des informations relatives à un internaute. Ce système est nécessaire car le serveur n’a plus accès aux données de l’auteur d’une requête lorsqu’elle est terminée..
A chaque ouverture de nouvelle session, l’internaute se voit attribuer un identifiant de session. Cet identifiant peut-être transmis soit en GET (PHPSESSID ajouté à la fin de l’url) ou Cookie (cookie sur poste client). Les informations seront quant à elles conservées  de page en page par le serveur et non par le client.

Les cookies (minimum à savoir)

Les cookies sont de petits fichiers texte présents sur l’ordinateur client et envoyés par le serveur. Ils peuvent être temporaires (en mémoire) ou permanents (sur le disque dur avec une date de péremption)

La grande utilité des cookies est de pouvoir y stocker diverses informations que vous pouvez récupérer ultérieurement. Le désavantage des cookies est que le client (comprenez le visiteur) peut paramétrer son navigateur pour refuser les cookies.

Les cookies sont gérés de manière différente dans chaque navigateur.

cookie  de session dans firefox

cookie de session dans firefox

Comment fonctionne une session ?

Le serveur attribue un identifiant unique à l’utilisateur, qui sera transmis à chaque requête (par le biais d’un cookie ou d’une variable dans l’URL).

 

En rajoutant l’en-tête Set-cookie, dans sa réponse, le serveur indique au client qu’il souhaite y stocker un cookie. Le client peut décider, ou non, de s’exécuter et de créer le cookie demandé.

S’il l’accepte, le navigateur client va ensuite joindre le cookie à l’en-tête de toutes ses requêtes vers le même domaine.

Les informations sont stockées sur le serveur.

Par défaut, les données de sessions de PHP sont stockées dans un simple fichier de texte . Tous les scripts PHP peuvent lire ces fichiers car toute exécution de PHP est réalisée par un même utilisateur.

Chaque session est désignée par un nom et un identifiant. Lorsque le visiteur accepte les cookies, l’identifiant de la session est stocké dans un cookie temporaire, dans le cas contraire, il existe un autre moyen de stocker l’identifiant. Normalement, la session est détruite à la fermeture du navigateur, ou au bout de 30 minutes. Cette valeur peut être modifiée dans le fichier php.ini du serveur. Renseignez-vous grâce à la fonction phpinfo()).

Une session est basée sur un identifiant transmis sur Internet entre l’utilisateur et le serveur et cette donnée est très sensible. Si une personne mal intentionnée obtient l’identifiant de session d’un autre utilisateur, il devient assez facile d’usurper son identité.

Les composants

Demarrer une session

Syntaxe :

<?php session_start();?>

Ce  code permet de démarrer une session. Si un fichier existe sur le serveur pour cette session, les variables de sessions seront récupérées, si ce n’est pas le cas, un nouveau fichier sera créé.
Notez que code est à placé tout au début de votre page, avant tout code HTML, car la session ne peut être demarrée que si le cache du navigateur est vide

Le tableau $_SESSION

Lorsqu’une session est créée, elle est par défaut vide. Elle n’a donc aucun intérêt. Il faut donc lui attribuer des valeurs à sauvegarder temporairement. Pour cela, le langage PHP met en place le tableau superglobal $_SESSION. Le terme superglobal signifie que le tabeau a une visibilité maximale dans les scripts.

Créer une variable de session :

Les variables de sessions sont accessibles, une fois que la sessions est démarrée, via le tableau
super global : $_SESSION[]

<?php $_SESSION[‘variable’] = $valeur ; ?>

Nous créons  une variable de session nommée variable qui vaut $valeur

Exemple :Déclaration et initialisation d’une variable une session

<?php
  // Démarrage ou restauration de la session
  session_start();
  // Ecriture d'une nouvelle valeur dans le tableau de session
  $_SESSION['identifiant'] = 'Dumou';
?>

Le tableau $_SESSION, qui était vide jusqu’à présent, s’est agrandit dynamiquement et contient maintenant une valeur (Dumou) à la clé associative identifiant. Une variable de session est alors créée.

Savoir si une variable de session existe

Pour savoir si la variable de session variable existe:

<?php if(isset($_SESSION['variable'])) 
 echo 'La variable "variable" existe !'; ?> 

Utiliser la valeur d’une variable de session

Si vous voulez utiliser la valeur d’une variable de session, vous devez passez par la variable super globale $_SESSION

<?php if(isset($_SESSION[‘variable’]))  echo ‘La variable « variable » existe et vaut: ‘ . $_SESSION[‘variable’];?>

 

Supprimer une variable de session

Pour supprimer une variable de session, il faut utiliser la fonction unset()

<?php unset($_SESSION['variable']); 
echo 'La variable de session "variable" est maintenant détruite'; 
?>

Détruire toutes les variables de session

La fonction session_unset() détruit toutes les variables de session.

<?php session_unset(); ?>

PHP Session – Détruire une session

La fonction session_destroy() permet de détruire une session.

<?php session_destroy(); ?>

IMPORTANT

Le cache du navigateur doit être vide pour démarrer une session. Aucun code HTML  ou echo en php avant le démarrage d’une session, même pas une ligne vide (elle envoie un retour chariot)  !!

Sinon ->Panique:

Warning: Cannot modify header information – headers already sent by (output started at ….Cette erreur se rencontre lors de l’utilisation des sessions et des cookies.

On démarre

<?php session_start(); ?>

<html>
<body>

</body>COOKIE_Temporaire
</html>

L’ouverture de session va créer un cookie temporaire qui est un identifiant. Cet identifiant est envoyé au serveur lors de l’appel d’une page par le navigateur et si la session est ouverte par cette page, le php pourra récupérer le contenu du $_SESSION propre à cet utilisateur.

Remarque : $_SESSION reste sur le serveur et n’est jamais accessible au client.

Ceci permet de suivre un utilisateur de page en page et éventuellement de s’assurer qu’il a le droit d’utiliser cette page.

Exemple

Considérons 2 pages.

Toutes les deux démarrent la gestion des sessions avant toute chose.

La page 1 contient un petit formulaire d’inscription. Après validation par cette même page,on est renvoyé directement à la page 2.

Cette page 2 constate que $_SESSION[‘nom’] existe, récupère le nom et l’affiche.

Cependant, si on avait ouvert directement la page 2,  l’affichage aurait été différent.

Pour le vérifier, il est nécessaire de fermer le navigateur puis de le réouvrir ou de supprimer tous les cookies de localhost.

Le mot « directement » a toute son importance car si on laisse le navigateur ouvert, après fermeture et réouverture de la page2 on constate que l’utilisateur  existe toujours.

Vous commencez à comprendre pourquoi il ne faut jamais laisser un navigateur ouvert lorsqu’on quitte son poste de travail même pour un court instant !!

Page1.php

<?php session_start(); ?> 
<!DOCTYPE HTML > 
<html> 
<head> 
	<title>page1</title> 
</head> 

<body> 
<form method="post"> 
	<label>Quel est ton nom :</label><input name="nom"> <input type="submit" value="envoyer"> 
</form> 
<?php 
if(isset($_POST['nom'])){ 
	$_SESSION['nom']=$_POST['nom']; //remplir une cellule du tableau $_SESSION
	header('Location: page2.php'); //envoyer à la page page2.php
} 

?> 

</body> 
</html>

page2.php

<?php session_start(); ?> 
<!DOCTYPE HTML > 
<html> 
<head> 
	<title>page 2</title> 
</head> 

<body> 
<?php 
if(isset($_SESSION['nom'])){ 
	echo "bonjour ".$_SESSION['nom']; 
} 
else {echo "je ne te connais pas"; } 
?> 

</body> 
</html>

PHP, en interne, réalise plusieurs tâches :

  • Si le client n’a pas envoyé d’identifiant, PHP lui en attribue un nouveau puis initialise une session vide ( variable super globale $_SESSION ) ;

  • Sinon, PHP charge la précédente session (dans la variable $_SESSION) de l’utilisateur qu’il retrouve grâce à son identifiant unique ;

Pour vérifier, essayer d’ouvrir la page 2 en premier. Ensuite  ouvrez les dans l’ordre et enfin, sans fermer le navigateur, fermez la page 2 et essayer de la rouvrir directement. Observez la différence.

Application:

permettre à un utilisateur d’ajouter un commentaire s’il est connu.

voir l’exemple de  » le php Facile » http://www.lephpfacile.com/cours/18-les-sessions

Principe:

On utilise un formulaire pour envoyer un login et un mot de passe

<form action="login.php" method="post">
Votre login : <input type="text" name="login">
<br />
Votre mot de passe : <input type="password" name="pwd"><br />
<input type="submit" value="Connexion">
</form>

Le fichier php login.php va comparer les deux champs avec ce qu’il connaît:

$login_valide = "moi";
$pwd_valide = "lemien";

On teste

if (isset($_POST['login']) && isset($_POST['pwd'])) {
// on vérifie 
	if ($login_valide == $_POST['login'] && $pwd_valide == $_POST['pwd']) {
		// dans ce cas, tout est ok, on peut démarrer notre session
		// on la démarre :)
		session_start ();
                    //.... 
               }
         }

Si tout va bien, on appelle une page membre

header ('location: page_membre.php');

Remarque :  Cette méthode est dangereuse car le mot de passe est en clair dans le fichier.

On peut remplacer ce mot par un code créé à partir de ce mot en utilisant la fonction

     md5()

Elle calcule le md5 d’une chaîne en utilisant l’algorithme » RSA Data Security, Inc. MD5 Message-Digest Algorithm, et retourne le résultat.

Exemple avec md5()

<?php
$str = 'apple';
if (md5($str) === ‘1f3870be274f6c49b3e31a0c6728957f’) {
echo « Voulez-vous une golden ou une spartan? »;
}
?>

Dans le fichier, on place lla chaine récupérée par md5(‘lemien’) et pour le teste, on applique cette même fonction à la chaine $str avant de faire le test.

On peut aussi placer ces éléments dans une table et utiliser la fonction password() du sql

Pour coder un mot de passe dans mysql:

UPDATE table SET PchampMotDePasse=PASSWORD('lemien')