Se connecter / S'enregistrer
Votre question

compteur de visite qui deconne [resolu]

Tags :
  • Script
  • Programmation
Dernière réponse : dans Programmation
12 Novembre 2006 22:19:41

bonsoir tous le monde

j'ai un petit probleme: voila ce script si dessous fonctionne bien en local mais en ligne il ne marche pas

c'est un script visant a compté le nombre totale de visiteur depuis la creation du site

j'explique:en local pas de souci si la derniere actualisation de page date de moins d'une heure le visiteur n'est pas compté comme nouveau visiteur mais en ligne c'est pas trop ca a chaque actualistaion de page le visiteur et compté comme nouveau visiteur c'est a ne rien n'y comprendre

EDIT: j'ajouterais que le visiteur actualise son ip est ajouté deux fois et si il va sur une autre page 1 fois seulment

  1. <?php
  2. // Connexion à MySQL
  3. mysql_connect("localhost", "root", "");
  4. mysql_select_db("test");
  5.  
  6. // -------
  7. // ETAPE 1 : on vérifie si l'IP se trouve déjà dans la table en comptant combien de fois l'ip du visiteur apparait
  8.  
  9. $retour = mysql_query('SELECT COUNT(*) AS nbre_entrees FROM connectes WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'');
  10. $donnees = mysql_fetch_array($retour);
  11.  
  12.  
  13. if ($donnees['nbre_entrees'] == 0) // L'ip ne se trouve pas dans la table, on va l'ajouter
  14. {
  15. ('INSERT INTO connectes VALUES(\'' . $_SERVER['REMOTE_ADDR'] . '\', ' . time() . ')');
  16. }
  17. else // L'ip se trouve déjà dans la table, on met juste à jour le timestamp
  18. $reponse = mysql_query("SELECT * FROM connectes");
  19. $donneesDeLaBDD = mysql_fetch_array($reponse);
  20. {
  21. // On stocke dans une variable le timestamp qu'il était il y a 60 minutes
  22. $timestamp_60min = time() - (60*60); // 60 * 60 = nombre de secondes écoulées en 1 heure
  23.  
  24. if ($donneesDeLaBDD['timestamp'] >= $timestamp_60min)//si le timestamp de la derniere visite > que le timestamp il y 1 heure
  25. {
  26. //on met a jour tous les timestamps du visiteurs (faute de mieux)
  27. mysql_query('UPDATE connectes SET timestamp=' . time() . ' WHERE ip="'.$_SERVER['REMOTE_ADDR'].'"');
  28. }
  29. else//sinon si ce n'est pas le cas
  30. {
  31. //on crée une nouvelle entrée avec l'ip du visiteur (le visiteur peut donc avoir plusieur fois son ip dans la BDD)
  32. mysql_query('INSERT INTO connectes VALUES(\'' . $_SERVER['REMOTE_ADDR'] . '\', ' . time() . ')');
  33. }
  34. }
  35.  
  36.  
  37. // ETAPE 2 : on compte le nombre d'ip stockées dans la table. C'est le nombre de visiteurs qui ont vu le site
  38. $retour = mysql_query('SELECT COUNT(*) AS nbre_entrees FROM connectes');
  39. $donneesEtape2 = mysql_fetch_array($retour);
  40. echo '<p>Vous êtes le ' . $donneesEtape2['nbre_entrees'] . 'ème visiteur!</p>';
  41. ?>


merci a ceux qui pourront m'aider

Autres pages sur : compteur visite deconne resolu

12 Novembre 2006 23:30:29

ca fait longtemps que j'ai pas utilisé mysql mais je crois que la valeur d'un timestamp s'affiche "annee-mois-jour heure", donc:
  1. if ($donneesDeLaBDD['timestamp'] >= $timestamp_60min)

est une comparaison entre chaîne, le résultat n'est pas celui attendu, il te faut modifier l'une des deux variables (php/mysql) et revoir ta comparaison dans le if.
a c 145 L Programmation
13 Novembre 2006 11:36:12

non, c'est le date-time qui est de format "Y-m-d H:i:s", le timestamp est du format "YmdHis" qui diffère sacrément de l'unixtimestamp généré par time().
Contenus similaires
13 Novembre 2006 11:48:47

crazycat: on peut inserer un timestamp ou une datetime sous mysql avec plusieurs format dont "YmdHis" mais l'affichage (YYYY-MM-DD HH:MI:SS) est le même quelque soit le type datetime/timestamp en tout cas pour les versions > 4.1 (mais je crois que c'est le cas avant aussi)

EDIT: en tout cas si on modifie pas la config
a c 145 L Programmation
13 Novembre 2006 13:20:43

il y a 95% de chances pour que l'utilisateur lambda n'ait pas accès à la config, donc il vaut mieux utiliser les systèmes génériques.
Sinon, je ne vois pas l'intérêt d'avoir des types de champs différents.
13 Novembre 2006 13:51:20

c'est pour ca que j'ai dit que l'affichage d'un timestamp est "YYYY-MM-DD HH:MI:SS" et non "YmdHis" et encore moins une valeur numérique correspondant au secondes
13 Novembre 2006 17:40:27

heu -_-" un timestamps c'est un nombre tout con de 11 chiffres (a l'heure actuelle ) et le probleme n'est pas de savoir dans quelle format ecrire la date

tous ceci ne m'aide guere et puis ce script fonctionne en local danc a prioris pas de souci au niveau timestamp mais ligne voila...ca deconne sec
13 Novembre 2006 17:49:50

mets un
  1. echo $donneesDeLaBDD['timestamp'];

et
  1. echo $timestamp_60min;

et tu verras pourquoi ca marche pas, et je serais curieux de voir le résultat des echos
a c 145 L Programmation
13 Novembre 2006 17:53:43

aravis@IDN a dit :
  1. <?php
  2. }
  3. else // L'ip se trouve déjà dans la table, on met juste à jour le timestamp
  4. $reponse = mysql_query("SELECT * FROM connectes");
  5. $donneesDeLaBDD = mysql_fetch_array($reponse);
  6. {
merci a ceux qui pourront m'aider

ton else ne fait que le mysql_query()... ton accolade s'ouvre n'importe ou...
Quand on recopie, on fait attention :) 
13 Novembre 2006 18:16:37

je suis vexé c'est moi qui l'ai fait tous seul ce truc (en m'inspirant d'ailleurs c'est vrai mais tous seul quand meme )

bon j'ai changé en

  1. else // L'ip se trouve déjà dans la table, on met juste à jour le timestamp
  2. {
  3. $reponse = mysql_query("SELECT * FROM connectes" );
  4. $donneesDeLaBDD = mysql_fetch_array($reponse);


mais ca ne change strictement rien au probleme ou alors j'ai mal compris ce que tu m'as dit ce qui est possible
13 Novembre 2006 18:27:33

$reponse = mysql_query("SELECT * FROM connectes" );

il faut rajouter la condition where ip=...
13 Novembre 2006 18:31:07

aravis@IDN a dit :
heu -_-" un timestamps c'est un nombre tout con de 11 chiffres (a l'heure actuelle ) et le probleme n'est pas de savoir dans quelle format ecrire la date


je viens de relire ce post, appeler une colonne avec le nom d'un type, je savais pas que c'etait possible mais bon...
13 Novembre 2006 18:54:56

Citation :
$reponse = mysql_query("SELECT * FROM connectes" );

il faut rajouter la condition where ip=...


là ca a l'air de marcher je ne m'avance pas trop mais au moins ca n'ajoute pas de visiteur a chaque actualistation et ca met a jour le timestamps

Citation :
mets un
  1. 1. echo $donneesDeLaBDD['timestamp'];



et
  1. 1. echo $timestamp_60min;


1163436474
1163440073

donc a priori mes variable sont bonne ^^

Citation :
je viens de relire ce post, appeler une colonne avec le nom d'un type, je savais pas que c'etait possible mais bon...

heu je croi pas avoir dit que je voulais faire ca ?!? enfin bon... c'est pas grave
13 Novembre 2006 19:01:08

oui mais j'étais parti sur une autre voie, le nom timestamp m'avait induit en erreur, mais si ca marche tant mieux pour toi :) 
a c 145 L Programmation
13 Novembre 2006 19:56:55

aravis@IDN a dit :
je suis vexé c'est moi qui l'ai fait tous seul ce truc (en m'inspirant d'ailleurs c'est vrai mais tous seul quand meme )

Lol, je ne voulais pas dire que tu avais copié le script sur un autre, juste que tu t'es planté en faisant une modif sur ton code (collé une partie au mauvais endroit).

Sinon, je t'avoues que je ne vois pas ce qui foire, je te conseille de faire un affichage de debug après chaque if() { et chaque else { histoire que l'on sache où tu passes exactement.

Et aussi un echo de tes requètes SQL, il y en a peut-être une de faussée.


13 Novembre 2006 21:51:26

c'est bon crazy cat coca25 a trouvé le probleme merci quand merci et merci aux autres
Citation :

$reponse = mysql_query("SELECT * FROM connectes" );

il faut rajouter la condition where ip=...


ca marche maintenant
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS