Partage
  • Partager sur Facebook
  • Partager sur Twitter

probléme mysql

mon conteur de visiteur n'actualise pas le timestamp des visiteurs deja venu

    3 mars 2006 à 10:16:34

    bonjour a tous
    j'ai voulu changer un peu le code de base du conpteur de visites pour dans la base de donné une trace du nombre de visiteurs que j'ai eu
    voici le code:

    <?
    mysql_connect("db508.unetun.com","dbo154242213", "k3asdC4N") or die ("erreur de connexion");

    mysql_select_db("db154242213") or die ("erreur selection de la base de donnés");

    $timestamp_5min = time() - (60 * 5);
    $retour = mysql_query('SELECT COUNT(*) AS nbre_entrees FROM connectes WHERE ip=' . $_SERVER['REMOTE_ADDR'] . ' AND timestamp >' . $timestamp_5min . '');
    $donnees = mysql_fetch_array($retour);

    if ($donnees['nbre_entrees'] == 0)
    {
        mysql_query('INSERT INTO connectes VALUES(\'' . $_SERVER['REMOTE_ADDR'] . '\', ' . time() . ')');
    }
    else
    {
        mysql_query('UPDATE connectes SET timestamp=' . time() . ' WHERE ip=' . $_SERVER['REMOTE_ADDR'] . ' AND timestamp > ' . $timestamp_5min . '');
    }
    ?>

    selement le probléme c'est que le timstamp ne s'actualise pas pour les ip qui sont deja venu y a moins de 5 min
    pourquoi?
    merci d'avance pour votre aide
    • Partager sur Facebook
    • Partager sur Twitter
      3 mars 2006 à 10:25:57

      On voit tes identifians de connexion a la base de données, j'espere que ceux sont des faux...
      • Partager sur Facebook
      • Partager sur Twitter
        3 mars 2006 à 12:03:11

        non j'ai encore oublié de les enlevermais c pas un probléme je vais tout de suite changer mon mot de passe
        merci
        et sinon our le probléme personne?
        • Partager sur Facebook
        • Partager sur Twitter
          3 mars 2006 à 14:00:04

          <?
          mysql_connect("db508.unetun.com","dbo154242213", "k3asdC4N") or die ("erreur de connexion");

          mysql_select_db("db154242213") or die ("erreur selection de la base de donnés");

          $timestamp_5min = time() - (60 * 5);
          $retour = mysql_query('SELECT COUNT(*) AS nbre_entrees FROM connectes WHERE ip=' . $_SERVER['REMOTE_ADDR'] . ' AND timestamp >' . $timestamp_5min . '');
          $donnees = mysql_fetch_array($retour);

          if ($donnees['nbre_entrees'] == 0)//si il n'est pas present on le rentre
          {
              mysql_query("INSERT INTO connectes VALUES('" . $_SERVER['REMOTE_ADDR'] . "', '" . time() . ")");
          }
          else//sinon c'est qu'il est resent on update son timespan
          {
              mysql_query("UPDATE connectes SET timestamp=" . time() . ",  WHERE ip=" . $_SERVER['REMOTE_ADDR']");
          }

          //on cherche dans la table les times perimés
          $retour = mysql_query("
          SELECT * FROM connectes")
          wlile($donnees=mysql_fetch_array($retour))
          {
              if($donnees['time']<$timestamp_5min)
              mysql_query("
          DELETE FROM connectes WHERE ip=". $donnees['time'] .");
              //$donnees['time'] et non $_SERVER['REMOTE_ADDR'] comme ca à chaque 
                visiteur on verifie que les time sont bons
          }
          ?>


          voici une correction RAPIDE ... je ne sais pas si c'est parfait mais je pense
          • Partager sur Facebook
          • Partager sur Twitter
            3 mars 2006 à 15:02:09

            Bonjour,


            Voici ton code corrigé (et un peu optimisé ;) ) :

            <?
            mysql_connect('db***.unetun.com''*****''*****') or exit('erreur de connexion');

            mysql_select_db('db******') or exit('erreur de sélection de la base de données');

            $timestamp_5min = time()(60 * 5);
            $retour = mysql_query('SELECT COUNT(*) FROM connectes WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\' AND timestamp > ' . $timestamp_5min) or exit(mysql_error()); // ne pas oublier qu'une IP est une chaîne‚ donc l'entourer d'apostrophes
            $nbre_entrees = mysql_result($retour0); // + rapide qu'un mysql_fetch_array() vu que tu sélectionnes juste une donnée (même pas une entrée ^^)

            if ($nbre_entrees == 0) # edit : $nbre_entrees est une chaîne !
            {
                mysql_query('INSERT INTO connectes VALUES (\'' . $_SERVER['REMOTE_ADDR'] . '\'‚ ' . time() . ')') or exit(mysql_error());
            }
            else
            {
                mysql_query('UPDATE connectes SET timestamp=' . time() . ' WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\' AND timestamp > ' . $timestamp_5min) or exit(mysql_error());
            }

            mysql_close(); // sauf si tu veux faire d'autres requêtes avant
            ?>


            PS : calimero92 < petit problème de concaténation vers la fin de ton code
            Et pour effacer les entrées "expirées" il y a plus simple :
            mysql_query('DELETE FROM connectes WHERE timestamp<'.$timestamp_5min) or exit(mysql_error());
            une seule requête :)
            • Partager sur Facebook
            • Partager sur Twitter
              3 mars 2006 à 18:54:25

              re
              j'ai pas encore tout regardé
              mais y a deja un petit truc qui me choque
              pourquoi remplacer le > par un <???
              le but est de prendre selement les ip qui date d'y a moins de 5 min
              donc y faut que le timestamp quand l'ip a été enregistré soit plus grand que le timestamp d'y a 5min!

              et sinon c'est quoi une chaine?
              pourquoi faut rajouter \'?

              et pourquoi tu me dit qu'il y a un moyen plus simple de suprimmer les entrés perimé?
              moi je ne les suprimes pas et c'est justement pour ca que je ne prend pas tout simplement le code de mateo
              • Partager sur Facebook
              • Partager sur Twitter
                3 mars 2006 à 20:33:15

                oO ...

                Bon, dans l'ordre :p

                "pourquoi remplacer le > par un <???" >> juste, erreur de ma part :( j'ai confondu avec le DELETE (j'ai édité)

                "et sinon c'est quoi une chaine?" >> euh... http://fr.php.net/manual/fr/language.types.string.php ^^ (bon pour faire simple, 12 est un entier, mais "12" est une chaîne) (et une IP est une chaîne du type "255.255.255.255")

                "pourquoi faut rajouter \'?" >> il faut échapper les apostrophes dans la chaîne puisqu'elle est délimitée par des apostrophes : si on n'échappe pas une apostrophe dans la chaîne, PHP va considérer ça comme la fin de la chaîne...
                Mais je trouve étrange que tu poses la question vu que tu le fais très bien dans le requête dans ton if ._.

                "et pourquoi tu me dit qu'il y a un moyen plus simple de suprimmer les entrés perimé?" >> mon PS s'adressait à calimero92 ;) (car il a ajouté cette fonctionnalité dans son code)

                hop :p
                • Partager sur Facebook
                • Partager sur Twitter
                  3 mars 2006 à 21:30:00

                  oui j'ai bien comprit l'histoire du delete
                  mais moi je ne veux pas qu'on sup^rime les entrés d'y a plus de 5min
                  je veux les garder pour qu'un autre code puisse me dire que tel jour j'ai eu tant de visiteurs

                  et pour l'histoire du \' j'ai du juste le mettre a un endroit parce que j'ai fait un copié collé de ce bout de code sans faire attention a ca
                  • Partager sur Facebook
                  • Partager sur Twitter
                    4 mars 2006 à 12:42:56

                    enféte dans mon code de depart la seul chose qui ne marche pas c'est le update

                    il me rajoute toujours une nouvelle entré méme si la méme ip avec un timestamp d'y a moins de 5 min existe dans la table

                    pourquoi ca fait ca???
                    • Partager sur Facebook
                    • Partager sur Twitter
                      4 mars 2006 à 13:07:10

                      Re,

                      Je le répète, mon code du DELETE ne s'adressait pas à toi mais à calimero92


                      Concernant ton problème, je pense qu'il vient de l'oubli des apostrophes (échappées) autour de l'IP dans ta première requête :
                      $retour = mysql_query('SELECT COUNT(*) AS nbre_entrees FROM connectes WHERE ip=' . $_SERVER['REMOTE_ADDR'] . ' AND timestamp >' . $timestamp_5min . '');

                      Cela va donner une requête du genre :
                      SELECT COUNT(*) AS nbre_entrees
                      FROM connectes
                      WHERE ip=255.255.255.255 AND timestamp > 1141473476
                      qui va renvoyer une erreur MySQL du style :

                      Citation : MySQL error

                      #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.255.255 AND timestamp' at line 1

                      (car 255.255.255.255 ne peut pas être évalué comme nombre)

                      Essaie mon code, il devrait marcher :)

                      En fait le code PHP
                      $retour = mysql_query('SELECT COUNT(*) FROM connectes WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\' AND timestamp > ' . $timestamp_5min) or exit(mysql_error());
                      donnera une requête du genre
                      SELECT COUNT(*)
                      FROM connectes
                      WHERE ip='255.255.255.255' AND timestamp > 1141473476
                      (ou renverra une erreur, mais il n'y a pas de raison ;) ), qui est une requête valide :)

                      PS : ton champ ip doit être de type VARCHAR(15)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        4 mars 2006 à 13:10:42

                        ip2long() / long2ip() sinon.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          5 mars 2006 à 9:22:51

                          voici le message d'erreu que j'ai avec ton code:

                          Parse error: parse error, unexpected T_STRING in /homepages/43/d148521641/htdocs/includes/head.php on line 5

                          ca veut dire quoi??
                          • Partager sur Facebook
                          • Partager sur Twitter
                            5 mars 2006 à 14:59:06

                            Edit : je vérifie un truc...

                            Edit² : ok bon alors j'ignore totalement pourquoi, mais le parser du zCode me transforme toutes mes virgules (chr(44)) en guillemets-virgules inférieurs (chr(130)) et mes tirets "moins" (chr(45)) en tirets demi-cadratins (chr(150)) o_O et ça ne le fait qu'entre les balises <code></code>
                            Et évidemment si tu copies/colles mon code dans un fichier .php, PHP va détecter ces caractères invalides (en fait ce sont des "T_STRING" et non des opérateurs) et générer une erreur de parsage...

                            PS : on peut voir la différence pour la virgule, le guillemet-virgule inférieur a une largeur inférieure à celle d'un caractère normal en police Courier (la police des codes zCode)
                            • Partager sur Facebook
                            • Partager sur Twitter
                              5 mars 2006 à 17:58:41

                              je vais peut étre passé pour un débile
                              mais j'ai rien pigé a ce que t'a dit!
                              faut que je fasse quoi pour que ca marche moi?
                              • Partager sur Facebook
                              • Partager sur Twitter
                                5 mars 2006 à 18:05:38

                                Lol désolé j'ai même pas expliqué ce qu'il faut faire :p

                                Ben en fait,
                                soit tu retapes toi-même tout le code (^^),
                                soit tu parcours le mien (dans ton éditeur), ligne par ligne, et dès que tu tombes sur une virgule, tu la supprimes en la remplaçant par une virgule que TU tapes :) et idem pour le "-" dans "time() - (60 * 5)"


                                J'ai posté sur le forum de rapport de bugs, j'espère que karamilo règlera vite ce problème :)
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  6 mars 2006 à 21:46:14

                                  alors j'ai remplacé les caracteres qui n'allait pas
                                  mais le probléme maintenant c'est que je ne sais pas pourquoi mais aucune entrés n'est ajouté a la bdd
                                  j'ai cherché a aficher $nbre_entrees mais ca n'affiche rien

                                  et j'ai remarqué deux trois truc sur le code que j'aimerais que tu m'explique

                                  pourquoi tu as mit trois = sur "$nbre_entrees === 0;" ???
                                  et pour mysql_result comment ca marche?
                                  y veut dire quoi le 0?
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    6 mars 2006 à 22:18:09

                                    Rebonsoir,

                                    Pour l'opérateur ===, voir http://www.siteduzero.com/forum-83-23647-184249.html#r184249
                                    Et en fait, c'est justement l'origine de ton problème d'insertion ! Je viens de réaliser que COUNT(*) renvoie une chaîne et non un entier :euh: ... il faut donc utiliser ($nbre_entrees === "0"), ou, + simple, ($nbre_entrees == 0) (j'ai édité)
                                    (bon mais au moins comme ça tu auras découvert l'égalité stricte :D...non ? :euh:)

                                    Pour mysql_result() (et le 0), il te suffit de cliquer dessus dans mon code pour accéder à la documentation :D


                                    PS : cette fois-ci c'est la bonne, j'ai testé le code en local, il marche ;)
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      8 mars 2006 à 15:09:33

                                      merci beaucoup
                                      une derniere petite question
                                      c'est quoi la difference entre or exit et or die?
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        8 mars 2006 à 16:23:34

                                        Re,

                                        Si tu cliques sur "die" dans ton code, que se passe-t-il ?...
                                        die() est un alias de la fonction exit().

                                        Concernant les alias : http://fr2.php.net/manual/fr/aliases.php

                                        die() est identique à exit() mais pourrait disparaître dans une future version de PHP... Il vaut donc mieux utiliser exit() :)

                                        De rien :p
                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        probléme mysql

                                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                        • Editeur
                                        • Markdown