Je vais vous en apprendre une bien bonne : vous avez déjà manipulé des variables superglobales... sans le savoir.
Ces variables un peu "spéciales" sont faciles à reconnaître. Voici 3 points pour les identifier :
- Elles sont écrites en majuscules et commencent toutes par un underscore _ (le trait de soulignement).
$_GET et $_POST ça vous dit quelque chose ? Eh oui, ce sont ce qu'on appelle des variables superglobales, et vous les avez déjà utilisé de nombreuses fois 
- Autre point important : les superglobales sont toutes des array.
Pour ceux qui auraient un petit trou de mémoire, les array sont des variables sous forme de "tableau", facilement reconnaissables grâce aux crochets (ex : $_GET['page']).
Revoyez le chapitre sur les array de la partie I si vous en avez vraiment besoin 
- Enfin, ces variables sont automatiquement créées par PHP à chaque fois qu'une page est chargée. Ces variables existent donc sur toutes les pages et sont accessibles partout : au milieu de votre code, au début, dans les fonctions etc...
Le mot "global" en PHP signifie que la variable est accessible partout.
Une variable créée dans une fonction par exemple n'est pas accessible partout. Elle n'existe que dans la fonction. Une variable dite globale est accessible partout dans votre code (au début, à la fin...)
Bien, maintenant que vous savez les repérer, que diriez-vous si je vous listais toutes les superglobales qui existent en PHP ?
Il existe d'autres superglobales en PHP, en plus de $_GET et $_POST. Soyons francs : il y en a qui vont beaucoup nous intéresser, mais il y en a aussi qu'on ne touchera jamais
- $_SERVER : ce sont des valeurs utiles que nous donne le serveur.
Pour accéder à ces informations, il faut indiquer ce qu'on demande exactement entre crochets (vu que c'est un array). Il y a plein de choses disponibles qui ne nous intéressent pas... par contre en voici quelques-unes dont vous aurez peut-être à vous servir :
- $_SERVER['PHP_SELF'] : c'est le chemin de la page que vous êtes en train d'exécuter, par rapport à la racine de votre site web.
Exemple : si vous êtes sur la page http://www.monsite.com/scripts/monscript.php, alors $_SERVER['PHP_SELF'] aura pour valeur : /scripts/monscript.php
- $_SERVER['HTTP_REFERER'] : c'est l'url de la page qui a amené le visiteur sur la page courante. Cela peut être utile notamment pour faire des statistiques : vous saurez par exemple que le site "supersite.com" a fait un lien vers votre site et vous amène des visiteurs

La documentation de PHP nous avertit clairement que vous ne pouvez pas vous fier à 100% à $_SERVER['HTTP_REFERER'] car le client peut très facilement refuser d'envoyer cette information ou même la modifier.
Bref, n'ayez pas trop confiance en elle.
- $_SERVER['REMOTE_ADDR'] : sans aucun doute l'information la plus intéressante de $_SERVER. Elle nous donne l'adresse IP du client qui a demandé à voir la page.
On se servira de cette variable plusieurs fois dans les prochains TP (pour repérer un même visiteur), donc souvenez-vous qu'elle existe !
- $_ENV : ce sont des variables d'environnement, toujours données par le serveur. Plus précisément, le système d'exploitation (Linux) donne ces informations.
Mais bon, il n'y a rien de vraiment bien utile et de toute façon je suis incapable de vous donner une liste de ce que renvoit cette superglobale. Donc on l'oublie 
- $_GET : vous la connaissez bien, c'est elle qui vous donne les valeurs des informations indiquées dans l'url.
Par exemple, si la page appelée est :
http://www.site.com/mapage.php?jour=18&mois=avril&annee=2000
... on aura une superglobale $_GET découpée en 3 parties :
- $_GET['jour'] = "18"
- $_GET['mois'] = "avril"
- $_GET['annee'] = "2000"
- $_POST : c'est là-dedans que vous venez récupérer les informations issues d'un formulaire.
Bon je passe, on y a déjà assez travaillé comme ça dans les chapitres et TP précédents 
- $_FILES : cette superglobale est utilisée lorsqu'on envoie des fichiers sur le serveur à partir d'un formulaire. Nous l'avons fait dans un chapitre précédent.
- $_SESSION : c'est là-dedans que l'on retrouve les variables de session. Nous allons voir ce qu'est une session en PHP plus loin dans ce chapitre.
- $_COOKIE : de même, c'est là-dedans que l'on retrouve les valeurs des cookies enregistrés sur l'ordinateur du visiteur. Nous étudierons les cookies dans ce chapitre là-aussi.
En clair, si je résume : on connaît déjà $_GET et $_POST, on retient que $_SERVER['REMOTE_ADDR'] donne l'adresse IP du visiteur, et on se prépare à étudier $_SESSION et $_COOKIE dans la suite de ce chapitre
Les sessions sont un moyen de conserver des variables sur toutes les pages de votre site.
Jusqu'ici, on était arrivés à passer des variables de page en page via la méthode GET (en modifiant l'url : page.php?variable=valeur) et via la méthode POST (un formulaire quoi).
Mais si on veut transmettre une ou plusieurs variables sur TOUTES les pages de son site, c'est vraiment la galère avec GET et POST... D'où l'invention des sessions.
Comment ça marche ?
- Un visiteur se connecte. On demande à créer une session pour lui : PHP génère un numéro. Pour cela, on utilise la fonction session_start(). Ce numéro est souvent très gros et écrit en hexadécimal. Par exemple : a02bbffc6198e6e0cc2715047bc3766f
Ce numéro sert d'identifiant et est appelé "ID de session" (ou PHPSESSID). PHP transmet automatiquement cet ID de page en page en utilisant un cookie ou via l'url (ex : mapage.php?PHPSESSID=a02bbffc6198e6e0cc2715047bc3766f).
- A partir de là, c'est du tout bon : on peut créer une infinité de variables de session. Par exemple : $_SESSION['login'] contient le login du visiteur, $_SESSION['password'] contient le mot de passe etc...
L'avantage, c'est que le serveur conserve ces variables même lorsque la page PHP a fini d'être générée. Ce qui veut dire que, quelle que soit la page de votre site, vous pourrez récupérer par exemple le login et le mot de passe du visiteur !
- Lorsque le visiteur se déconnecte (il a cliqué sur un bouton "Déconnecter" ou est resté inactif trop longtemps), alors la session est fermée avec session_destroy()
Ca a l'air compliqué comme ça, mais en fait c'est d'une simplicité à en pleurer
Le seul truc qu'il ne faut pas oublier de faire, c'est d'appeler
session_start() sur chacune de vos pages AVANT d'écrire le moindre code HTML.
Si vous oubliez
session_start(), vous ne pourrez pas accéder aux variables superglobales $_SESSION.
Faites très attention : appelez session_start tout au début de vos pages PHP. Ne mettez la balise <html> qu'après, sinon vous aurez des problèmes avec votre session.
Après, vous pouvez utiliser les variables $_SESSION comme des variables normales.
Un petit exemple ?
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 | <?php
session_start(); // On démarre la session AVANT toute chose
// On s'amuse à créer quelques variables de session :
$_SESSION['prenom'] = 'Jean';
$_SESSION['nom'] = 'Dupont';
$_SESSION['age'] = 24;
// Maintenant que le session_start est fait, on peut taper du code HTML
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
<head>
<title>Titre de ma page</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<p>
Salut <?php echo $_SESSION['prenom']; ?> !<br />
Tu es à l'accueil de mon site (index.php). Tu veux aller sur une autre page ?
</p>
<p>
<a href="mapage.php">Lien vers mapage.php</a><br />
<a href="monscript.php">Lien vers monscript.php</a><br />
<a href="informations.php">Lien vers informations.php</a>
</p>
</body>
</html>
|
Ne vous y trompez pas : on peut créer des variables de session n'importe où dans le code. Ici je les ai créé en haut de la page, mais j'aurais pu le faire ailleurs.
La seule chose qui importe, c'est que le
session_start() soit fait au tout début de la page.
Notez quelque chose de très important : mes liens sont tous simples. Je ne m'occupe de rien : ni de transmettre le nom, prénom, âge du visiteur, ni de transmettre l'ID de session.
Et ça, croyez-moi, c'est génial

Quand votre site sera un peu gros et qu'il y aura plein de liens partout, vous apprécierez de savoir que PHP s'occupe tout seul de transmettre les variables !
En effet, sur chacune des pages "mapage.php", "monscript.php", "informations.php" (et n'importe quelle autre page de votre site), vous retrouverez les variables $_SESSION['prenom'], $_SESSION['nom'] et $_SESSION['age'] !
Voici par exemple le code source de la page informations.php :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 | <?php
session_start(); // On démarre la session AVANT toute chose
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
<head>
<title>Titre de ma page</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<p>Re-bonjour !</p>
<p>
Je me souviens de toi ! Tu t'appelles <?php echo $_SESSION['prenom'] . ' ' . $_SESSION['nom']; ?> !<br />
Et ton âge hummm... Tu as <?php echo $_SESSION['age']; ?> ans, c'est ça ? :-D
</p>
</body>
</html>
|
Vous voyez ? On a juste fait un
session_start(), puis on s'est amusés à afficher les valeurs des variables de session.
Et là, magie !

Les valeurs des variables avaient été conservées, on n'a rien eu à faire !
En résumé, vous créez des variables de session comme vous créeriez des variables normales, sauf que vous mettez le préfixe $_SESSION devant pour que PHP sache qu'il doit "retenir" ces variables sur toutes les pages
Enfin, si vous voulez détruire la session du visiteur, vous pouvez faire un lien "Déconnexion" qui amène vers une page qui fait appel à la fonction
session_destroy()
Quoiqu'il en soit, la session sera automatiquement détruite au bout d'un certain temps d'inactivité.
Et voilà, vous savez tout ce qu'il faut, ce n'est vraiment pas bien compliqué
Concrètement, les sessions peuvent servir pour :
- Un script qui demande un login / mot de passe pour qu'un visiteur puisse se "connecter" (s'authentifier). Ainsi, on peut enregistrer des variables de session et se souvenir du login du visiteur sur toutes les pages du site !
- ... Ce qui permet d'ailleurs de créer une zone d'administration sécurisée sur plusieurs fichiers SANS utiliser de .htaccess. Les variables de sessions sont suffisantes pour vérifier si le mot de passe est le bon

- Un dernier exemple : on se sert des sessions sur les sites de vente en ligne. Cela permet de gérer un "panier" : on retient les produits que commande le client, quelle que soit la page où il est. Lorsqu'il valide sa commande, on récupère ces informations et on le fait payer

Si je vous dis ça, c'est en connaissance de cause, parce que j'ai déjà réalisé un site de vente en ligne. En utilisant les sessions, c'est vraiment super simple et vous avez maintenant le niveau 
Si votre site est hébergé chez Free.fr, vous devrez créer un dossier appelé "sessions" à la racine de votre FTP pour activer les sessions.
Je vais m'arrêter là pour les explications sur les sessions... En effet, avec ça vous savez tout ce qu'il faut.
Bien, on passe aux cookies maintenant
Travailler avec des cookies est quasiment aussi simple que de travailler avec des sessions.
Il faut dire que PHP fait fort grâce aux superglobales, vous allez le voir une fois de plus
Voici le plan que nous allons suivre :
- On va voir ce que c'est un cookie exactement... parce que je sais pas vous mais moi j'ai horreur de travailler sur des choses abstraites

- Ensuite, nous verrons comment écrire un cookie. C'est facile à faire, si on respecte un ou deux points.
- Enfin, nous verrons comment afficher le contenu d'un cookie. Ca c'est super facile à faire

Qu'est-ce qu'un cookie ?
Un cookie, c'est un petit fichier que l'on enregistre sur l'ordinateur du visiteur.
Ce fichier contient du texte et permet de "retenir" des informations sur le visiteur. Par exemple, vous inscrivez dans un cookie le pseudo du visiteur, comme ça la prochaine fois qu'il viendra sur votre site vous pourrez lire son pseudo en allant regarder ce que son cookie contient.
On fait souvent l'erreur de penser que les cookies sont "dangereux". Non, ce ne sont pas des virus, juste des petits fichiers textes qui permettent de retenir des informations.
Au pire, un site marchand peut retenir que vous aimez les appareils photos numériques et vous afficher uniquement des pubs pour des appareils photos, mais en
aucun cas un cookie peut scanner votre disque dur ou le formater, rassurez-vous ils sont inoffensifs
Un cookie est créé pour chaque nouveau site web qui le demande. Ainsi, si vous êtes allés voir 3 sites web, vous pouvez avoir jusqu'à 3 cookies.
Chaque cookie peut contenir
plusieurs informations.
Où sont stockés les cookies sur mon disque dur ?
Ca dépend de votre navigateur. Par exemple, Internet Explorer les stocke dans le dossier "Temporary Internet Files" :
Si vous vous amusez à en ouvrir un, vous verrez probablement quelque chose d'incompréhensible :
Sinon, si vous avez Mozilla Firefox, c'est un peu plus clair : menu Outils / Options / Vie privée / Cookies stockés. Là vous avez la liste et la valeur de tous les cookies stockés :
Eh bah vous savez quoi ? On s'en fout de tout ça

On n'a pas à se préoccuper de tout ça, je vous le montrais juste pour que vous sachiez à quoi vous avez affaire. Comme d'habitude, PHP se charge de tout
Ecrire un cookie
Comme une variable, on écrit un cookie en donnant son nom et sa valeur.
Par exemple, le cookie "pseudo" aurait chez moi la valeur "M@teo21".
Pour écrire un cookie, on utilise la fonction PHP
setcookie (qui signifie "Placer un cookie" en anglais).
On lui donne en général 3 paramètres, dans l'ordre suivant :
- Le nom du cookie (ex : "pseudo")
- La valeur du cookie (ex : "M@teo21")
- La date d'expiration du cookie, sous forme de timestamp (ex : 1090521508)
Si vous ne savez pas ce qu'est un timestamp, c'est que vous n'avez pas lu le chapitre sur les dates 
Comme vous pouvez le voir, un cookie a une durée de vie limitée.
Il est automatiquement "supprimé" au bout d'un certain temps.
Si vous voulez supprimer le cookie dans un an, il vous faudra faire :
time() + 365*24*3600
Cela veut dire : timestamp actuel + nombre de secondes dans une année. Cela aura pour effet de voir votre cookie disparaître dans exactement un an.
Vous pouvez aussi utiliser la fonction mktime comme on l'a vu dans le chapitre sur les dates pour effacer le cookie à une date précise.
Toutefois, il y a un petit problème avec
setcookie... Comme pour
session_start, cette fonction ne marche QUE si vous la mettez avant tout code HTML (donc avant la balise <!DOCTYPE>)
Ca peut paraître bizarre, je le reconnais. Ce n'est pas du tout la faute à PHP, c'est comme ça que les cookies fonctionnent.
Ne placez donc JAMAIS le moindre code HTML avant d'utiliser setcookie.
La plupart des gens qui ont des problèmes avec setcookie ont fait cette erreur, donc souvenez-vous en !
Voyons maintenant comment je ferais pour inscrire 2 cookies : un qui retient mon pseudo pendant un an, et un autre qui retient le nom de mon pays :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | <?php
$timestamp_expire = time() + 365*24*3600; // Le cookie expirera dans un an
setcookie('pseudo', 'M@teo21', $timestamp_expire); // On écrit un cookie
setcookie('pays', 'France', $timestamp_expire); // On écrit un autre cookie...
// Et SEULEMENT MAINTENANT, on peut commencer à écrire du code html
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
<head>
<title>Ma super page PHP</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
... etc etc...
|
Et voilà, les cookies sont écrits !

Il m'a donc fallu faire 2
setcookie pour écrire ces 2 informations.
Afficher un cookie
Ca, c'est vraiment le plus simple.
Avant de commencer à travailler sur une page, PHP lit les cookies du client pour récupérer toutes les informations qu'il y a dedans. Ces informations sont placées dans la superglobale $_COOKIE, sous forme d'array (tableau) comme d'habitude.
Ce qui fait que, si je veux ressortir le pseudo du visiteur que j'avais inscrit dans un cookie, il suffirait d'écrire :
$_COOKIE['pseudo']
Ce qui nous donne un code PHP tout bête pour réafficher le pseudo du visiteur :
Code : PHP1
2
3
4 | <p>
Hé ! Je me souviens de toi !<br />
Tu t'appelles <?php echo $_COOKIE['pseudo']; ?> et tu viens de <?php echo $_COOKIE['pays']; ?> c'est bien ça ?
</p>
|
Comme vous le voyez encore une fois, le gros avantage c'est que les superglobales sont accessibles partout.
Vous avez besoin de savoir ce que contient le cookie "pseudo" ? Affichez donc le contenu de la superglobale $_COOKIE['pseudo'] !
A noter que si le cookie n'existe pas, la variable superglobale n'existe pas.
Plus précisément, si vous faites un
isset sur $_COOKIE['pseudo'] comme on a appris à le faire jusqu'ici, la condition (if isset($_COOKIE['machintruc'])...) vous répondra que la variable n'existe pas... ce qui veut donc dire que le cookie n'existe pas
Enfin, vous vous demandez peut-être comment modifier un cookie déjà existant ?
C'est là encore très simple : il faut refaire un
setcookie en gardant le même nom de cookie. Cela "écrasera" l'ancien cookie. Par exemple, si j'habite maintenant en Chine, je ferai :
setcookie('pays', 'Chine', $timestamp_expire);
Notez qu'alors le temps d'expiration du cookie est remis à zéro pour un an. On aurait donc encore un an avant que le cookie disparaisse