Double compteur en une requête
Résolu
microsoluces
Messages postés
35
Date d'inscription
Statut
Membre
Dernière intervention
-
microsoluces Messages postés 35 Date d'inscription Statut Membre Dernière intervention -
microsoluces Messages postés 35 Date d'inscription Statut Membre Dernière intervention -
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 :
Code du <footer> :
Je ne comprends pas ou ça merdouille....
Merci d'avance pour toute aide !
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:
- Double compteur en une requête
- Compteur électrique - Guide
- Double ecran - Guide
- Whatsapp double sim - Guide
- Double driver - Télécharger - Pilotes & Matériel
- Compteur contractions - Télécharger - Santé & Bien-être
9 réponses
Bonjour,
Je ne suis pas sûr que tu ai le droit de faire ça :
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.
Merci Nhay pour ta réponse...
J'avais fais ça :
Dans le <footer>
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 ?
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 ?
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 :
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 :
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!
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!
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
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
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 ?
Il est égal à quoi ?
Ton compteur devrait en effet être identique sur toute tes pages, peut-être as tu un système de cache ?
Plantage dans le Copié/collé, j'ai bien une ligne :
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)
$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();
?>
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
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