Le cookie n'est pas créé

Résolu/Fermé
jacky0546 Messages postés 5 Date d'inscription dimanche 24 juin 2018 Statut Membre Dernière intervention 26 juin 2018 - Modifié le 25 juin 2018 à 06:38
 Utilisateur anonyme - 26 juin 2018 à 14:31
Bonjour,
J'ai fait un script PHP très simple pour créér un cookie, mais la création ne se fait pas. J'ai fouillé partout (ou presque) sur internet, je n'ai pas trouvé le pb, mais mon scripte semble correct (sauf erreur qui me crève les yeux). Ce script permet à un visiteur d'accpeter les termes de confidentialité de mon site et de mémoriser sa réponse pour ses prochaines visites. Les commentaires // ????? indiquent un contrôle en cours de déroulement du script, ils ne feront pas partie du fichier définitif. Le client Internet accepte bien sûr les cookies. Voici le script en question (Je ne sais pas comment faire une présentation style notepadd++, si vous pouviez m'informer également la-dessus)
Je vous remercie par avance.
Bien cordialement,
Jacky

<!-- Date de création: 23/06/2018 -->
<?php
// cookie mémorisant l'acceptation de la politique de confidentialité
  If (isset($_POST['conf']))
  {
echo 'on positionne le cookie editionskywiconf <br>'; // ?????
  $temps = 183*24*3600; // durée de 6 mois
  setcookie ("editionskywiconf",$_POST['conf'], time() + $temps); // on envoie un cookie de nom editionskywiconf
  };
// vérif des cookies
echo 'variable conf = '.$_POST['conf'].'<br>'; // ?????
echo 'cookie editionskywiconf = '.$_COOKIE['editionskywiconf'].'<br>'; // ?????
// utilisation des variables globales
session_start();
// positionnement du type de la police
header( 'content-type: text/html; charset=utf-8' );
?>
<!DOCTYPE html>
<head>
  <title>acceptation</title>
  <link rel="stylesheet" type="text/css" href="./jackylebrun.css">
</head>

<BODY id="fondpage">

<!--Aceptation de la politique de confidentialité -->
<?php
if ($_COOKIE['editionskywiconf'] != 'oui') // le client n'a pas encore accepté la politique de confidentialité
   {
   echo '<form METHOD="POST" action="./acceptation.php">
   <font class="grande">Vous devez accepter notre politique de confidentialité sur vos données personnelles.<br>
   Lisez ce qui suit puis cliquez sur le bouton "j\'accepte" (cette acceptation restera valide pendant 6 mois)<br><br>
   bla bla bla<br><br>
   <input type="hidden" name="conf" value="oui">
   <input type="submit" name="accepte" value=" J\'ACCEPTE " onclick="soumettre">
   </form>
   </font>';
   }
   else
   {
echo '<font class="grande">Corps de la page après acceptation</font>';
   };
?>
</body>
</html>
A voir également:

3 réponses

Utilisateur anonyme
25 juin 2018 à 00:01
Bonjour

Dans le protocole HTTP, il y a l'envoi des en-têtes PUIS celui des données.
set_cookie(), session_start() et header() utilisent les en-têtes http.
Si tu envoies quoi que ce soit avant (echo, tout code html y compris le commentaire
<!-- Date de création: 23/06/2018 -->
) la phase en-tête est terminée et les fonctions set_cookie(), session_start() et header() ne marchent plus.


Pour utiliser la coloration syntaxique ("style notepad++"), sélectionne le texte à colorier puis utilise la petite flèche à droite du bouton <> en haut de la fenêtre qui sert à rédiger la réponse. Cette flèche permet de choisir le langage de programmation utilisé.
1
jacky0546 Messages postés 5 Date d'inscription dimanche 24 juin 2018 Statut Membre Dernière intervention 26 juin 2018
25 juin 2018 à 17:21
Bonjour Le Père,
D'abord merci pour ta réponse.J'ai supprimé tous les commentaires (on ne sais jamais) comme tu peux le voir dans mon nouveau texte ci-dessous, mais ça ne marche toujours pas. Le test à la ligne 20 renvoi systématiquement à la proposition ligne 21 et je ne vois pas le cookie dans ma liste (j'utilise FireFox : Options/Vie privée et sécurité/Cookies et données de site/Gérer les données...) Je suis vraiment désolé d'être complètement sec devant ce problème, surtout que le bog doit être gros comme une maison.
Bien cordialement,
Jacky.

<?php
  If (isset($_POST['conf']))
  {
  $temps = 183*24*3600;
  setcookie ("editionskywiconf","oui", time() + $temps);
  };
session_start();
header( 'content-type: text/html; charset=utf-8' );
?>
<!DOCTYPE html>
<head>
  <title>acceptation</title>
  <link rel="stylesheet" type="text/css" href="./jackylebrun.css">
</head>

<BODY id="fondpage">

<!--Aceptation de la politique de confidentialité -->
<?php
if ($_COOKIE['editionskywiconf'] != "oui") // le client n'a pas encore accepté la politique de confidentialité
   {
echo 'editionskywiconf = '.$_COOKIE['editionskywiconf']; // ?????
   echo '<form METHOD="POST" action="./acceptation.php">
   <font class="grande">Vous devez accepter notre politique de confidentialité sur vos données personnelles.<br>
   Lisez ce qui suit puis cliquez sur le bouton "j\'accepte" (cette acceptation restera valide pendant 6 mois)<br><br>
   bla bla bla<br><br>
   <input type="hidden" name="conf" value="oui">
   <input type="submit" name="accepte" value=" J\'ACCEPTE " onclick="soumettre">
   </form>
   </font>';
   }
   else
   {
echo 'editionskywiconf = '.$_COOKIE['editionskywiconf']; // ?????
echo '<font class="grande">Corps de la page après acceptation</font>';
   };
?>
</body>
</html>
0
Utilisateur anonyme
Modifié le 26 juin 2018 à 00:03
Tout d'abord, tu devrais vérifier (avec isset) l'existence de
$_COOKIE['editionskywiconf']
car ton code génère une erreur
Notice: Undefined index: editionskywiconf in ...
Si tu ne vois pas ce message, c'est que ta configuration n'affiche pas les erreurs. C'est très bien en production, mais c'est dommage en mise au point.

Ceci dit et à part ce message d'erreur, ton script marche chez moi. MAIS peut-être pas comme tu t'y attendrais.
Je ne vois l'acceptation qu'au troisième affichage de la page, c'est à dire après avoir cliqué DEUX fois sur "J'accepte".
En effet, la première fois qu'on clique sur le bouton, le cookie est bien créé mais ton test
if ($_COOKIE['editionskywiconf']...
ne le montre pas car la variables $_COOKIE ne contient que les cookies qui existaient lors de l'ouverture de la page, pas ceux qui ont été créés depuis. Il faut donc cliquer une fois de plus pour en voir l'effet avec ce test-ci.
Bien sûr, si on rouvre ensuite la page (sans attendre six mois) on a bien le message d'acceptation.
J'ai fait l'essai avec Chrome et FF, le comportement est le même.

Si ça persiste à ne pas marcher, c'est peut-être que tu as un caractère invisible AVANT
<?php
. As-tu bien enregistré ton fichier SANS BOM ?
1
jacky0546 Messages postés 5 Date d'inscription dimanche 24 juin 2018 Statut Membre Dernière intervention 26 juin 2018
26 juin 2018 à 10:10
Bonjour Le Père,
J'ai d'abord répondu à Reivax962 - tu verras. En ce qui concerne tes propositions, je sens que l'on approche. Je vais vite vérifier cela. Je te tiens au courant.
Merci encore.
Bien cordialement,
Jacky.
0
jacky0546 Messages postés 5 Date d'inscription dimanche 24 juin 2018 Statut Membre Dernière intervention 26 juin 2018
26 juin 2018 à 11:20
Grand merci Le Père !
- Le bog se tenait effectivement dans l'enregistrement du fichier qui était avec BOM. Comme je ne sais pas ce que cela signifie, je n'y ai pas prêté attention.

- Le "isset" sur le test du cookie ne fonctionne pas. J'ai le message d'erreur suivant :

Fatal error: Cannot use isset() on the result of an expression (you can use "null !== expression" instead) in /homepages/2/d385103479/htdocs/jackylebrun/editions-kywi/acceptation.php on line 20

du coup, je n'y touche pas.

- Quant au fait de devoir retaper deux fois "j'accepte", j'ai trouvé une solution :
Dans le "<head>", je teste l'existence de $_POST['conf'], si vrai, c'est que je viens de créer le cookie, alors je met un "<meta>" qui recharge la page.

Voici le scripte qui marche :

<?php
  If (isset($_POST['conf']))
  {
  $temps = 183*24*3600;
  setcookie ("editionskywiconf","oui", time() + $temps);
  };
session_start();
header( 'content-type: text/html; charset=utf-8' );
?>
<!DOCTYPE html>
<head>
<?php
If (isset($_POST['conf']))
   {
   echo '<meta HTTP-EQUIV="Refresh" content="0;URL=./acceptation.php">';
   };
?>
  <title>acceptation</title>
  <link rel="stylesheet" type="text/css" href="./jackylebrun.css">
</head>

<BODY id="fondpage">

<!--Aceptation de la politique de confidentialité -->
<?php
if (($_COOKIE['editionskywiconf'] != "oui")) // le client n'a pas encore accepté la politique de confidentialité
   {
echo 'editionskywiconf = '.$_COOKIE['editionskywiconf']; // ?????
   echo '<form METHOD="POST" action="./acceptation.php">
   <font class="grande">Vous devez accepter notre politique de confidentialité sur vos données personnelles.<br>
   Lisez ce qui suit puis cliquez sur le bouton "j\'accepte" (cette acceptation restera valide pendant 6 mois)<br><br>
   bla bla bla<br><br>
   <input type="hidden" name="conf" value="oui">
   <input type="submit" name="accepte" value=" J\'ACCEPTE " onclick="soumettre">
   </form>
   </font>';
   }
   else
   {
echo 'editionskywiconf = '.$_COOKIE['editionskywiconf']; // ?????
echo '<font class="grande">Corps de la page après acceptation</font>';
   };
?>
</body>
</html>
0
Utilisateur anonyme > jacky0546 Messages postés 5 Date d'inscription dimanche 24 juin 2018 Statut Membre Dernière intervention 26 juin 2018
26 juin 2018 à 14:31
Tant mieux si ça marche :-)

Le BOM (Byte Order Mark) est un caractère invisible souvent ajouté par les éditeurs de texte au début des fichiers UTF8. C'est une plaie pour les programmeurs PHP, heureusement facile à éviter (quand on le sait). Pour savoir à quoi il sert (car il a quand même une utilité) :
https://fr.wikipedia.org/wiki/Indicateur_d%27ordre_des_octets

Quant à la fonction isset, avec le message d'erreur que tu donnes, c'est que visiblement tu t'en es mal servi. Elle teste si une variable existe, il faut donc lui donner une variable à tester. Et toi tu lui avais donné une expression.
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
Modifié le 26 juin 2018 à 08:23
Bonjour,

Complètement d'accord avec le père.
Du coup une solution simple à ton problème serait de modifier ton if en rajoutant le test sur POST['conf'] :
if ($_COOKIE['editionskywiconf'] != "oui" && (!isset($_POST['conf']) || $_POST['conf'] != 'oui'))


Xavier
0
jacky0546 Messages postés 5 Date d'inscription dimanche 24 juin 2018 Statut Membre Dernière intervention 26 juin 2018
26 juin 2018 à 10:05
Bonjour Reivax962,
J'avais déjà essayé cette solution qui effectivement fonctionne mais seulement la première fois. Si je quitte le site puis reviens dessus, je retrouve la demande car
$_POST['conf']
n'existe plus, de la même manière que lorsque je quitte la page puis reviens dessus.
Merci d'avoir tenté de m'aider, mais je pense que LePère doit toucher du doigt la solution, je vais vite voir de ce côté là.
Bien cordialement,
Jacky.
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
26 juin 2018 à 10:23
Bonjour,

C'est bien parce que $_POST['conf'] n'existe plus que j'ai mis le membre
!isset($_POST['conf'])
dans le test :-)

Xavier
0