Compteur de visites en php : cookie = galère

Résolu/Fermé
Cactusdrummer - Modifié par Cactusdrummer le 31/07/2011 à 20:09
 youssef - 12 nov. 2013 à 21:26
Bonjour,

J'essaye de faire par moi même un compteur de visites en php qui ne s'incrémente pas à chaque refresh. J'ai choppé quelques bouts de code par-ci par-là, et je suis arrivé à un résultat qui me semble pas mal (et trouvable à peu de choses près en cherchant sur google). Cependant je dois mal utiliser la fonction setcookie, car le brin de code ne marche pas :

<?php  
  $fichier="Sous-parties/Stats/compteur.txt";  
  if(file_exists($fichier))  
   {  
   print "";  
   }  
  else  
   {  
   $fp=fopen($fichier,"a");  
   fputs($fp,"0");  
   fclose($fp);  
   }  
  ?>  
    
  <?php
   $fichier="Sous-parties/Stats/compteur.txt"; 
  if (isset($cool_cookie) && $cool_cookie =="Deja_visite")  
   {   
   $fp=fopen($fichier,"r+");  
   $hits=fgets($fp,10); 
   }  
  else  
   { // cookie absent (premiere visite, ou bien cookie expiré)  
   setcookie("cool_cookie","Deja_visite",time()+2*3600,"/"); 
   $fp=fopen($fichier,"r+");  
   $hits=fgets($fp,10);  
   $hits++;  
   fseek($fp,0);  
   fputs($fp,$hits);  
   fclose($fp);  
   $count++;  
   }     
   echo("Nombre de visites : $hits");
    
  ?> 


Je précise quelques détails :
- Ce code MARCHE mais s'incrémente simplement à chaque refresh (en gros j'ai testé, il prend à chaque fois la boucle "else" ...
- le fichier du compteur a le bon chmod et existe bien

Bon, comment faire pour que ca marche, e, gros ?
Le code ci dessus est dans un fichier "Sous-Parties" , et est appelé via un include pour etre placé en bas de ma page d'index (donc après plein de code) . J'ai lu dans un tuto sur setcookie() qu'un cookie ne peut etre mis qu'en début de code, avant n'iporte quel html... J'ai pas trop compris ce que c voulait dire ou du moins comment l'adapter à mon cas, du coup.

Merci si vous pouvez m'apporter une réponse, ou m'éclairer un petit peu sur ce qui va pas dans ma maniere de faire :).

Cordialement,
A voir également:

3 réponses

Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 185
31 juil. 2011 à 22:22
Salut,
un peu de théorie. Les cookies sont une fonctionnalité du protocole HTTP. Les requêtes et les réponses transmises via ce protocole se composent de deux parties : les en-têtes (headers) et le corps. Si tu connais déjà la fonction header de PHP, tu sais que les en-têtes doivent être envoyés avant le corps. Eh bien, les cookies font partie des en-têtes.

Sinon, le problème dans ton code se situe à mon avis ici :

if (isset($cool_cookie) && $cool_cookie =="Deja_visite")  


Il faut utiliser la « superglobale » $_COOKIE. C'est une variable que PHP construit automatiquement à partir des cookies qu'il trouve dans les en-têtes de la requête. La variable $cool_cookie n'est simplement pas définie, c'est pour ça que ton script passe dans le else à chaque fois... Avec ceci, ça ira sûrement mieux :

if (isset($_COOKIE['cool_cookie']) && $_COOKIE['cool_cookie'] =="Deja_visite")


Si tu ne peux vraiment pas arranger ton code pour pouvoir utiliser setcookie avant le contenu de ta page, je te conseille d'envisager la solution JavaScript. Les cookies créés en JS ne sont pas différents de ceux créés par le serveur. Cependant, cette solution ne marchera pas pour les clients qui n'ont pas JavaScript, c'est-à-dire les robots des moteurs de recherche, les navigateurs pour les malvoyants, et également les paranos comme moi qui ont installé NoScript (et tu serais surpris de voir combien nous sommes :P).

À toi de peser le pour et le contre : solution PHP vs solution JS...
4
Bonsoir, et merci beaucoup (on ne le dit que trop peu souvent).

La réponse à mon problème était bien là : la définition de ma variable $cool_cookie. J'avais pompé cette partie là d'un script "tout fait", n'ayant jamais touché aux cookies avant ca, mais maintenant j'y vois un peu plus clair, et on ne m'y reprendra plus.
Merci aussi pour m'avoir bien enfoncé dans le crane le principe des headers.

Bref, maintenant tout fonctionne à merveille :) !


En ce qui concerne le JS , ma solution est toute trouvée : je m'intéresse pour l'instant seulement au php. Donc c'est le script en php que je conserve.

Je vous souhaite une bonne soirée.
0
bonjour,

voici une solution facile
Crée un fichier à extension TXT et appelle le compteur.txt
Dans le fichier compteur.txt, tu ecrirs 1 ou 0
ajoute une iFrame sur la page principale. Voici le code pour ajouter une iframe

<address><iframe style="border: 1px; float:right; background-color: rgb(510, 204, 200);" border="0" name="video" marginwidth="0" marginheight="0" src="visitor.php" align="justify" border-color="#0099cc" frameborder="0" framebordercolor="#0099cc" height="18" scrolling="no" width="163"></iframe></address>

tu crée une page php avec ce code
<?php
$contenu = file_get_contents('compteur.txt');
$fp = fopen('compteur.txt', 'w');
fwrite($fp, $contenu + 1);
fclose($fp);
include('compteur.txt');
?>

et tu appelle cette page visitor.php

tu mets la page
visitor.php et le fichier compteur;txt dans le même dossier ou se trouve la page principage. Mais dans la page principale, il ne faut oublier d'ajouter le code pour créer une IFRAME au milieu de la page.

chaque fois que tu ouvre la page principale, le compteur avance de 1.


bonne continuation
voici mon mail pour question ***@***
0