Bonjour,
ma table "visiteurs" sert à compter les... visiteurs et comprend les champs:

  • id
  • ip
  • temps

Le champs temps est un "datetime".

Je cherche à compter le nombre de champs "temps" dont la date est inférieure ou égale à NOW() + 5 minutes, ceci afin d'afficher le nombre de visiteurs en ligne.

Bin je ne me doutais pas que ce serait une telle galère pour mon petit cerveau!

Voici ce que j'ai pondu, mais qui ne retourne pas ce que je veux:

$res = $DB->query("SELECT count(*) as enLigne FROM visiteurs WHERE temps < DATE_SUB(NOW(), INTERVAL -5 MINUTE) AND id != 1");

Tiens, voici ma fonction en entier...

    function visiteursEnLigne() {
        require ('gestion/conf/cnx.php');
            $res = $DB->query("SELECT count(*) as enLigne FROM visiteurs WHERE temps < DATE_SUB(NOW(), INTERVAL -5 MINUTE) AND id != 1");
            $data = $res->fetch();
            $enLigne = $data['enLigne'];
            echo $enLigne;      
    }

Donc, si une bonne âme pouvait m'aider pour avoir une requête correcte, ce serait bien sympa!

Hexa

8 réponses


GregWoot
Réponse acceptée

Essayes plutôt cette requête :

SELECT count(*) as enLigne FROM visiteurs WHERE temps BETWEEN DATE_SUB(NOW(), INTERVAL 5 MINUTE) AND NOW() AND id != 1

Première chose, sur le schéma de ta table : ta clef primaire devrait être plutôt ip : c'est un critère d'unicité ! Donc pas besoin d'id.
Sinon, vire juste le - et ça marchera ;-)

Hexa
Auteur

Bonjour Fan,
merci d'avoir répondu à ma demande.
J'ai besoin d'un champs id car ma table sert aussi pour totaliser mes visiteurs.
Ce total est fait sur l'id No1.

La requête ne fonctionne pas comme j'aimerais.

Voici en détail ce que je voudrais obtenir...

Pour le moment ->
un visiteur arrive sur mon site ... je récupère son ip. Si elle est déjà dans ma table "visiteurs", j'actualise le champs "temps".
Si son ip n'est pas présente, je crée une nouvelle ligne dans ma table.
Au passage, l'id No1 voit le totalisateur incrémenté de 1 et les lignes dont le champs "temps" qui sont vieilles de plus d'un jour sont supprimées.
Avec tout ça, j'ai donc le nombre total de visiteurs et le nombre de visiteurs venus ce jour.

Tout ça fonctionne très bien et je suis fier de l'avoir pondu tout seul comme un grand.

Ce que j'aimerais ->
Maintenant, et c'est là que j'ai besoin d'aide, je voudrais compter les lignes de ma table donc les champs "temps" ont un écart compris entre NOW() et NOW() + 5 MINUTE (si je puis dire...)

Exemple: Si un "temps" a 3 minutes de plus que maintenant, je compte! Si il en a plus que 5, je ne compte pas!
De ce fait, j'espère avoir les visiteurs en ligne en ce moment. Et si un visiteur est arrivé il y a plus que 5 minutes, je ne le considère plus en ligne sur mon site!

Voilà.
Merci d'avance de m'aider.
Hexa

C'est DATE_SUB(NOW(), INTERVAL 5 MINUTE), pas DATE_SUB(NOW(), INTERVAL -5 MINUTE) !

Hexa
Auteur

Quel rapidité, merci beaucoup!
Oui, j'avais bien compris. Mais sans ce "-", cette requête me liste toutes les lignes dont les dates sont plus vielles de NOW() + 5 MINUTE sauf si id = 1.
Moi, je voudrais toutes celles comprises entre NOW et + 5 minutes...

fait une boucle pour récuperer tous les utilisateurs qui sont connecté

while( $data = $res->fetch()){
         $enLigne = $data['enLigne'];
            echo $enLigne . '<br />';   
}
Hexa
Auteur

Bonsoir Crazy,
je ne veux pas tout les utilisateurs, je veux ceux qui sont connectés depuis moins de 5 minutes..
Merci tout de même de m'avoir répondu.

Hexa
Auteur

Merci Greg, pile dans le mille!
Je rentre de vacances et je suis content de trouver ta réponse. Merci beaucoup!