PHP - MySQL [Retour au menu]
TITRE

Le navigateur du client accepte-t-il les cookies ?

Remarque préliminaire pour ceux qui veulent tester : Si vous voulez faire des tests avec votre propre installation, je vous conseille de remplacer content='0 par content='4. histoire de laisser 4 secondes avant le réaffichage de la page et de voir ce qui se passe. D'autre part, lorsque vous uploadez votre page chez votre provider, et qu'ensuite vous utilisez votre navigateur pour voir le résultat, on est tde cliquer sur Réactualiser pour simplement recharger la page. Ici, c'est un peu plus délicat, je vous conseille de chaque fois fermer votre navigateur et de le rouvrir sur votre page de test.

Pour le savoir, nous allons essayer de lui créer un cookie "Espion". Ensuite, comme nous l'avons vu plus haut, il n'est pas possible de regarder immédiatement après le contenu du cookie : Ce sera lors d'une prochaine visite sur la même page que nous pourrons faire cet exercice de style... Nous n'allons pas demander au pauvre visiteur de cliquer sur "Actualiser", mais nous allons demander une redirection automatique sur notre même page pour essayer de lire notre cookies. La redirection s'écrit dans la section HEAD, selon le schéma suivant :

echo "<meta http-equiv='refresh' content='0; url=lememefichier.php'>";

Mais attention : il faut que l'on sache que la page est rechargée une 2ème fois : La première fois que le visiteur atterit dessus, un cookie Pirate est créé, et lors du rechargement de la page, il ne faut plus recréer un Cookie, mais simplement le lire, et il ne faut plus recharger encore une fois la page.

Voici l'astuce expliquée dans un fichier appelé montest.php :

<?php
  if (isset($Espion))
    echo "Le parametre est defini";
  else
    echo "Le parametre n'est pas defini";

?>
<html>
<head>
<?
  echo "<meta http-equiv='refresh' content='0;url=montest.php?Espion=1'>";
?>
<title>Test de cookies</title>
</head>
<body></body></html>

On commence par demander si la variable $Espion est définie avec isset. Si elle l'est, ça veut dire que c'est la 2ème fois qu'on arrive sur cette page. La première fois sur cette page, on se verra afficher "Le parametre n'est pas defini", et sinon "Le parametre est defini".

De toute façon, il y a une redirection au niveau de "<meta http-equiv='refresh'...". Si on laisse courir cette page telle quelle, elle va indéfiniment se recharger, ce qui ne nous arrange pas. Il faudrait qu'elle se recharge 1 seule fois, pas plus. Nous allons donc réutiliser un if isset un peu plus bas, comme ceci :

<?php
if (isset($Espion))
echo "Le parametre est defini";
else
echo "Le parametre n'est pas defini";
?>
<html>
<head>

<?
if (!isset($Espion))
  echo "<meta http-equiv='refresh' content='0;url=montest.php?Espion=1'>";
?>
<title>Test de cookies</title>
</head>
<body></body></html>

Le ! devant isset veut simplement dire "négation" (Si $Espion n'est PAS isset en quelque sorte - non défini). Cette fois, quoi qu'il arrive, la page sera rechargée une 2ème fois. Attaquons nous maintenant à la tentative de création d'un cookie :

<?php
  if (isset($Espion))
    {
    echo $HTTP_COOKIE_VARS["AccepteCookie"];
    echo "Deuxième visite sur la page";
    }
  else
    {
    setcookie("AccepteCookie","Oui",time()+86400);
    echo "Première visite sur la page";
    }

?>
<html>
  <head>
    <?
      if (!isset($Espion))
        echo "<meta http-equiv='refresh' content='3;url=montest.php?Espion=1'>";
    ?>
    <title>Test de cookies</title>
  </head>
<body></body></html>

Cette page va toujours s'afficher 2 fois : La première fois, $Espion n'est pas défini, donc il va créer le cookie AccepeCookie, et afficher "Première visite". Ensuite vient dans la section HEAD le if (!isset($Espion)), qui va demander le rechargede la page une seule fois (si $Espion n'est pas défini).

Lors du rechargement de la page, cette fois  if (isset($Espion)) est bien OK : On affiche simplement le contenu de AccepteCookie (Oui en l'occurrence), et "Deuxième visite sur la page".

Nous arrivons au bout de nos peines : rien ne prouve encore que le cookie a été accepté ! Nous allons donc rajouter une sous-condition, comme ceci : voici le code final :

<?php
  if (isset($Espion))
    {
    if (isset($HTTP_COOKIE_VARS["AccepteCookie"]))
      echo "Vous acceptez les cookies";
    else
      echo "Vous refusez les cookies";
    }
  else
    {
    setcookie("AccepteCookie","Oui",time()+86400);
    }

?>
<html>
  <head>
    <?
      if (!isset($Espion))
        echo "<meta http-equiv='refresh' content='0;url=montest.php?Espion=1'>";

    ?>
    <title>Test de cookies</title>
  </head>
  <body>
  </body>
</html>

A noter donc évidemment que dans le cas ou l'utilisateur n'accepte pas les cookies, aucun message d'erreur PHP n'est généré, ce qui est évidemment idéal.

J'ai bien pensé à regrouper les 2 codes PHP pour n'en faire qu'un que je placerais dans la section HEAD comme ceci :

<html>
  <head>
<?php
  if (isset($Espion))
    {
    if (isset($HTTP_COOKIE_VARS["AccepteCookie"]))
      echo "Vous acceptez les cookies";
    else
      echo "Vous refusez les cookies";
    }
  else
    {
    setcookie("AccepteCookie","Oui",time()+86400);
    echo "<meta http-equiv='refresh' content='3;url=montest.php?Espion=1'>";
    }
?>

  <title>Test de cookies</title>
  </head>
  <body>
  </body>
</html>

Mais ça ne marche pas... (Error Can't add header...)---