Médiaforma

All posts tagged cookies

Définissez un formulaire dans lequel sont saisis le prénom et le nom de l’utilisateur. Mémorisez ces informations dans la page de traitement du formulaire. Ajoutez dans cette page un lien vers une troisième page et vérifiez que les cookies ont bien été mémorisés.

Solution

Faites une pause dans la vidéo et écrivez les trois pages demandées dans l’exercice. Reprenez la lecture de la vidéo pour avoir des informations détaillées sur ces trois pages.

Voici le code correspondant au formulaire de saisie :

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Transission de données par un formulaire</title>
  </head>
  <body>
    <form name="MonFormulaire" method="post" action="traitement2.php">
      <table><tr><td><label>Prénom</label></td>
      <td><input type="text" name="prenom"></td></tr>
      <tr><td><label>Nom</label></td>
      <td><input type="text" name="nom"></td></tr>
      <tr><td><input type="submit" name="Nom" value="Envoyer"></td>
      <td></td></tr>
    </table>
    </form>
  </body>
</html>

Ce formulaire est traditionnel. Il permet de saisr un prénom et un nom. Lorsque le bouton Envoyer est cliqué, le script traitement2.php est exécuté.

 

Voici le code de traitement du formulaire :

<?php
  if (isset($_POST["prenom"]))
    setcookie("prenom", $_POST["prenom"], time()+24*3600, null, null, false, true);
  if (isset($_POST["nom"]))
    setcookie("nom", $_POST["nom"], time()+24*2600, null, null, false, true);
?>
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Traitement des données envoyées par formulaire</title>
  </head>
  <body>
    Les cookies nom et prenom ont été mémorisés.<br><br>
  <a href="verif-cookies.php">Cliquez ici pour le vérifier</a>
  </body>
</html>

La première instruction vérifie si le paramètre prenom existe dans le tableau superglobal $_POST. Dans l’affirmative, le cookie prenom est créé. Sa durée de vie est de 24 heures.

La deuxième instruction vérifie si le paramètre nom existe dans le tableau superglobal $_POST. Dans l’affirmative, le cookie nom est créé. Sa durée de vie est également de 24 heures.

Un message indiquant que les cookies ont été créés est alors affiché dans le corps du document.

Puis un lien hypertexte est affiché afin de tester l’existance des cookies dans un autre document.

Voici la page permettant de tester l’existence des cookies :

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Affichage des cookies</title>
  </head>
  <body>
    <?php
    echo "Le cookie prenom a pour valeur ".$_COOKIE["prenom"]."<br>";
    echo "Le cookie nom a pour valeur ".$_COOKIE["nom"]."<br>";
  ?>
  </body>
</html>

Dans le corps du document, deux instructions echo affichent la valeur des cookies prenom et nom, lues dans le tableau superglobal $_COOKIES.

Affichons le formulaire dans WAMPServer.

Nous entrons un prénom et un nom puis nous cliquons sur le bouton Envoyer.  Le script traitemen2.php s’exécute et nous informe que les données du formulaire ont été sauvegardées dans des cookies. Nous allons le vérifier en cliquant sur le lien hypertexte. Le script verif-cookie.php s’exécute. Nous pouvons vérifier que les deux valeurs saisies se trouvent bien dans les cookies.

Une erreur classique

L’erreur “Headers already sent by” sera envoyée par PHP si les cookies ne sont pas définis avant la balise <html>.


Les cookies sont comparables aux variables de session, à quelques détails près :

  • Ils sont stockés sur l’ordinateur des visiteurs et donc propres à chaque visiteur ;
  • Ils ont une durée de vie programmable.

Tout comme les variables de session, ils doivent être déclarés avant la balise <html>.

Pour mémoriser un cookie, vous utiliserez la fonction setcookie() :

setcookie(nom, valeur, expiration, chemin, domaine, securite, httponly);

Où :

  • nom est le nom du cookie.
  • valeur est la valeur à mémoriser dans le cookie.
  • expiration est le temps après lequel le cookie n’est plus valable. Cette valeur est un timestamp Unix, calculé en nombre de secondes depuis le 1 Janvier 1970. Pour obtenir facilement cette valeur, ajoutez la durée de vie du cookie à la fonction time(). Par exemple, pour obtenir une durée de vie de 30 jours, affectez la valeur time() + 30*24*3600 à ce paramètre.
  • chemin est le chemin sur le serveur sur lequel le cookie doit être disponible (“/” pour l’ensemble du domaine, “rep” pour limiter le cookie au dossier rep du serveur et à ses sous-dossiers.
  • domaine est le domaine pour lequel le cookie est disponible (“www.mondomaine.com” par exemple).
  • securite indique si le cookie doit être transmis à travers une connexion sécurisée https (true) ou non (false).
  • httponly indique si le cookie ne doit être accessible que par le protocole http (true) ou également via les langages de scripts, comme JavaScript (false). Initialisez ce paramètre à true pour limiter les attaques de type XSS.

Remarques

Tous les paramètres à l’exception du premier sont optionnels. Les paramètres chemin et domaine peuvent être initialisés à null s’ils ne sont pas utilisés.

Par exemple, pour définir le cookie prenom, l’initialiser avec la valeur “pierre” et lui donner une durée de vie d’une heure, vous utiliserez l’instruction suivante :

setcookie("prenom", "pierre", time() + 3600, null, null, false, true);

Pour afficher tous les cookies enregistrés sur l’ordinateur, utilisez la fonction var_dump() :

var_dump($_COOKIE);

Pour afficher un cookie donné, utilisez la superglobale $_COOKIE en précisant le nom du cookie :

echo $_COOKIE["nom"];

Pour modifier un cookie, il suffit de le redéfinir avec la fonction setcookie().

Enfin, pour supprimer un cookie, vous utiliserez également la fonction setcookie(), en précisant une durée de vie inférieure au timestamp actuel. Par exemple :

setcookie("prenom", "pierre", time() - 3600, null, null, false, true);

Vous avez déjà utilisé des variables superglobales dans les sections précédentes : $_GET[], $_POST[], $_FILES[]. Ces variables sont dites superglobales car elles sont disponibles partout dans le script : dans le corps du script, mais aussi dans les fonctions sans qu’il soit nécessaire d’utiliser l’instruction global pour y accéder.

Vous utiliserez également les variables superglobales suivantes :

Superglobale Signification
$GLOBALS Tableau associatif de toutes les variables globales du script (les noms des variables sont les index du tableau)
$_SERVER Tableau associatif créé par le serveur et contenant différentes informations comme les en-têtes, dossiers et chemins du script. Reportez-vous à la page http://www.php.net/manual/fr/reserved.variables.server.php pour avoir le détail des entrées de ce tableau.
$_COOKIE Tableau associatif des cookies enregistrés sur l’ordinateur client.
$_SESSION Tableau associatif des valeurs stockées sur le serveur pour la session d’un utilisateur.
$_ENV Tableau associatif de variables d’environnement du serveur. Cette superglobale n’est que très peu utile.

 

Pour afficher le contenu d’une superglobale, le plus simple consiste à utiliser la fonction var_dump(). Par exemple, pour afficher le contenu de la variable $_SERVER, utilisez cette instruction :

var_dump($_SERVER);

Exécutons ce code dans WAMP Server. Voici le résultat. Chacune des données du tableau superglobal est affichée sur une ligne qui lui est propre, ce qui facilite la lecture.