Double compteur en une requête

Résolu/Fermé
microsoluces Messages postés 35 Date d'inscription samedi 23 septembre 2006 Statut Membre Dernière intervention 7 juillet 2014 - 5 juil. 2014 à 17:35
microsoluces Messages postés 35 Date d'inscription samedi 23 septembre 2006 Statut Membre Dernière intervention 7 juillet 2014 - 7 juil. 2014 à 14:45
Bonjour à tous,

J'aimerai afficher dans le <footer> de mon site Internet le nombre de connectés
depuis la date de création du site et le nombre de visiteurs actuellement connectés.

Pour cela j'utilise une base de données et d'une table 'connectes' constituée de deux
champs :
- ip (contenant l'adresse du visiteur) et
- timestamp (contenant l'heure de connexion du visiteur)
(cf tuto d'openclassrooms remanié)

Voici le code que j'utilise, mais il ne m'affiche rien :


<?php

// Connexion à la base de donnée :
mysql_connect("localhost", "moi", "123");

// Selection de la table :
mysql_select_db("base");

// ÉTAPE 1 : on vérifie si l'IP se trouve déjà dans la table.
// Pour faire ça, on n'a qu'à compter le nombre d'entrées dont le champ "ip" est l'adresse IP du visiteur.
$retour = mysql_query('SELECT COUNT(*) AS nbre_entrees FROM connectes WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'');
$donnees = mysql_fetch_array($retour);

if ($donnees['nbre_entrees'] == 0) // L'IP ne se trouve pas dans la table, on va l'ajouter.
{
mysql_query('INSERT INTO connectes VALUES(\'' . $_SERVER['REMOTE_ADDR'] . '\', ' . time() . ')');
}
else // L'IP se trouve déjà dans la table, on met juste à jour le timestamp.
{
mysql_query('UPDATE connectes SET timestamp=' . time() . ' WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'');
}

// ÉTAPE 3 : on compte le nombre d'IP stockées dans la table. C'est le nombre de visiteurs connectés.

$retour = mysql_query('SELECT COUNT(*) AS nbre_entrees FROM connectes', 'SELECT COUNT(*) AS visiteur FROM connectes WHERE timestamp < ' . $timestamp_5min);
$donnees = mysql_fetch_array($retour);

?>




Code du <footer> :


<?php
//Affichage du nombre de connectés !
echo '<p>'. $donnees['nbre_entrees'] . ' visiteurs depuis le 05 juillet 2014';?><br />
<?php
echo ' Actuellement en ligne : ' . $donnees['visiteur'];
?>


Je ne comprends pas ou ça merdouille....
Merci d'avance pour toute aide !
A voir également:

9 réponses

Nhay Messages postés 838 Date d'inscription vendredi 2 novembre 2012 Statut Membre Dernière intervention 17 décembre 2015 126
5 juil. 2014 à 18:20
Bonjour,
Je ne suis pas sûr que tu ai le droit de faire ça :
$retour = mysql_query('SELECT COUNT(*) AS nbre_entrees FROM connectes', 'SELECT COUNT(*) AS visiteur FROM connectes WHERE timestamp < ' . $timestamp_5min);
Fais plutôt deux requête différente.
1
microsoluces Messages postés 35 Date d'inscription samedi 23 septembre 2006 Statut Membre Dernière intervention 7 juillet 2014 4
5 juil. 2014 à 18:54
Merci Nhay pour ta réponse...

J'avais fais ça :


// Visiteurs :
$retour = mysql_query('SELECT COUNT(*) AS nbre_entrees FROM connectes');
$donnees = mysql_fetch_array($retour);

// Actuellement en ligne :
$retour2 = mysql_query('SELECT COUNT(*) AS visiteur FROM connectes WHERE timestamp < ' . $timestamp_5min);
$donnees2 = mysql_fetch_array($retour2);

Dans le <footer>


<?php
//Affichage visites :
echo '<p>'. $donnees['nbre_entrees'] . ' visiteurs depuis le 05 juillet 2014';?><br /><?php
echo ' Actuellement en ligne : ' . $donnees2['visiteur'];
?>

Ca m'affiche (pour un seul champ dans la base)
1 visiteurs depuis le 05 juillet 2014
Actuellement en ligne : 0

Autrement dit : Le compteur semble fonctionner, mais actuellement en ligne ne
marche pas.

Il me faudrait une commande pour ré initialiser le comptage ?
0
microsoluces Messages postés 35 Date d'inscription samedi 23 septembre 2006 Statut Membre Dernière intervention 7 juillet 2014 4
5 juil. 2014 à 19:04
Je viens en plus de me rendre compte que si je change de page
sur mon site, le compteur qui devrait se recharger du fait qu'il
est dans un <footer> qui lui même est sur une page footer.php
appelée par include....Et bien non ! Les autres pages affichent
des résultats vides !

visiteurs depuis le 05 juillet 2014
Actuellement en ligne :
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
5 juil. 2014 à 19:10
Allez, tous en choeur:
Les fonctions MySQL
Vont se faire supprimer
Tu cod'rais si bien sans elles
Quand la 5.6 va arriver
Ton code tu devras refaire
Tu seras dans la galère~
Ça serait tellement idiot
Alors passe à PDO!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
microsoluces Messages postés 35 Date d'inscription samedi 23 septembre 2006 Statut Membre Dernière intervention 7 juillet 2014 4
5 juil. 2014 à 19:34
J'ai déjà entendu cette chanson... je ne connais PDO que de nom.
Le peut que j'en ai vu m'a étonné : 4 lignes de code pour faire ce
que l'on faisait avant en 2 ! Mais bon,, il parait que c'est pas bien de
dire "c'était mieux avant..."
Je m'y mettrai un jour, ou j'attends que l'on passe à PDO2... pour
tout changer à nouveau !

En attendant, ça ne règle pas mon problème...Snif
0
Nhay Messages postés 838 Date d'inscription vendredi 2 novembre 2012 Statut Membre Dernière intervention 17 décembre 2015 126
6 juil. 2014 à 09:26
Premièrement, je ne te vois pas initialisé $timestamp_5min
Il est égal à quoi ?

Ton compteur devrait en effet être identique sur toute tes pages, peut-être as tu un système de cache ?
0
microsoluces Messages postés 35 Date d'inscription samedi 23 septembre 2006 Statut Membre Dernière intervention 7 juillet 2014 4
Modifié par microsoluces le 7/07/2014 à 13:54
Plantage dans le Copié/collé, j'ai bien une ligne :


$timestamp_5min = time() - (60 * 5);


Entre temps j'ai réglé mon problème de page qui affichait un résultat vide en
mettant tout le code (connexion à la base, lecture des données et affichage des
données dans ma page footer.php).

Voici le code qui ne fonctionne toujours pas pour les actuellement en ligne :
(Je pense qu'il faudrait "ré initialiser" le système de comptage après avoir
compté combien il y avait d'entrées dans la table - avant de compter combien
d'IP on un timestamp inférieur à 5 minutes)


<?php

// Connexion à la base de donnée :
mysql_connect("localhost", "moi", "123");

// Selection de la table :
mysql_select_db("base");

// ÉTAPE 1 : on vérifie si l'IP se trouve déjà dans la table.
// Pour faire ça, on n'a qu'à compter le nombre d'entrées dont le champ "ip" est l'adresse IP du visiteur.

$retour = mysql_query('SELECT COUNT(*) AS nbre_entrees FROM connectes WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'');
$donnees = mysql_fetch_array($retour);

if ($donnees['nbre_entrees'] == 0) // L'IP ne se trouve pas dans la table, on va l'ajouter.
{
mysql_query('INSERT INTO connectes VALUES(\'' . $_SERVER['REMOTE_ADDR'] . '\', ' . time() . ')');
}

else // L'IP se trouve déjà dans la table, on met juste à jour le timestamp.
{
mysql_query('UPDATE connectes SET timestamp=' . time() . ' WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'');
}

// On stocke dans une variable le timestamp qu'il était il y a 5 minutes :
$timestamp_5min = time() - (60 * 5); // 60 * 5 = nombre de secondes écoulées en 5 minutes


// -------
// ÉTAPE 3 : on compte le nombre d'IP stockées dans la table.

// Visiteurs :
$retour = mysql_query('SELECT COUNT(*) AS nbre_entrees FROM connectes');
$donnees = mysql_fetch_array($retour);

// Actuellement en ligne :
$retour2 = mysql_query('SELECT COUNT(*) AS visiteur FROM connectes WHERE timestamp < ' . $timestamp_5min);
$donnees2 = mysql_fetch_array($retour2);

?>







<?php

//Affichage du nombre de connectés !
echo '<p>'. $donnees['nbre_entrees'] . ' visiteurs depuis le 05 juillet 2014';?>
<br />
<?php
echo ' Actuellement en ligne : ' . $donnees2['visiteur'];
mysql_close();
?>

0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524
Modifié par Pitet le 7/07/2014 à 14:09
Salut,

Ta deuxième requête sql n'est pas correcte, il faudrait vérifier l'inverse.

Par exemple, supposons qu'un nouveau visiteur se connecte, il n'existe pas dans la bdd donc on l'ajoute avec le timestamp actuel (pour simplifier, on suppose que le timestamp actuel vaut 1000 min).
On vérifie juste après qui est connecté sur le site. On récupère le timestamp actuel moins 5 minutes et notre comparaison dans la requête sql nous donne :
visisteur.timestamp < timestamp_5min
soit
1000 < 995
Ce qui est faux donc l'utilisateur n'est pas retournée par la requête.

Si tu veux avoir le nombre d'utilisateur connecté sur ton site depuis 5 min, il faut faire la comparaison inverse :
visisteur.timestamp > timestamp_5min
soit
1000 > 995

Si au bout de 10 min le timestamp de l'utilisateur n'est pas mis à jour, la comparaison donnera :
1000 > 1005
et donc l'utilisateur ne sera pas considéré comme connecté (pas d'activité depuis plus de 5 min).

Bonne journée
0
microsoluces Messages postés 35 Date d'inscription samedi 23 septembre 2006 Statut Membre Dernière intervention 7 juillet 2014 4
7 juil. 2014 à 14:45
G E N I A L ! ! !

A force d'avoir le nez dedans j'avais pas vu la bourde...
Je viens de faire un essai sur mon PC (+ un autre en
Teamviewer) ça marche Nickel !


Merci Beaucoup Pitet !
0