Page 1 sur 2

Compter le nombre de visiteurs total

Posté : 23 mars 2009, 16:17
par Romuald632
Bonjour,
j'ai fait un bout de code pour savoir combien de personne ce sont connecté à mon site.
Voilà ma table :
id [int(11)]
adresse_ip [varvhar(40)]
timestamp [int(11)]

Et voila le code php:
<?php
// Connexion à MySQL
mysql_connect("localhost", "root", "");
mysql_select_db("voyagez_vol");

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

if ($donnees['nbre_entrees'] == 0)
{
mysql_query('INSERT INTO visiteur VALUES(\'' . $_SERVER['REMOTE_ADDR'] . '\', ' . time() . ')');
}
else
{
mysql_query('UPDATE visiteur SET timestamp=' . time() . ' WHERE adresse_ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'');
}

$retour = mysql_query('SELECT COUNT(*) AS nbre_entrees FROM visiteur');
$donnees = mysql_fetch_array($retour);
?>
Mon souci c'est que j'ai tjs 0 visite
Pouvez-vous m'aider ?

Re: Compter le nombre de visiteurs total

Posté : 23 mars 2009, 16:43
par @rthur
Bonjour,

Au lieu de faire cela :
$retour = mysql_query('SELECT COUNT(*) AS nbre_entrees FROM visiteur WHERE adresse_ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'');
$donnees = mysql_fetch_array($retour);

if ($donnees['nbre_entrees'] == 0)
{
mysql_query('INSERT INTO visiteur VALUES(\'' . $_SERVER['REMOTE_ADDR'] . '\', ' . time() . ')');
}
else
{
mysql_query('UPDATE visiteur SET timestamp=' . time() . ' WHERE adresse_ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'');
}
Tu devrais pouvoir faire une seule requête avec REPLACE:
http://www.journaldunet.com/developpeur ... lace.shtml
Mon souci c'est que j'ai tjs 0 visite
Pouvez-vous m'aider ?
Ton code me semble correct.
Si tu fais un print_r($donnees); à la fin, tu obtiens quoi?
Par ailleurs est-ce que ta base de données est bien remplies?

Posté : 23 mars 2009, 17:29
par Romuald632
Voilà ce que j'obtiens en faisant print_r($donnees);
Array ( [0] => 0 [nbre_entrees] => 0 )

J'ai remplace INSERT et UPDATE par REPLACE mais ça change rien

Posté : 23 mars 2009, 18:10
par Ryle
Tu es sur de l'ordre de tes champs dans ta table quand tu fais un insert ? adresse_ip en premier et timestamp en second ?

A noter que timestamp est un mot clé réservé en sql et ne devrait pas être utilisé comme nom de table ou de champ même si MySQL peut le protéger à coup de " ` " ...

Posté : 23 mars 2009, 18:18
par Romuald632
Oui,
ma table c'est :
id_visiteur [int(11)]
adresse_ip [varchar(40)]
timestamp [int(11)]
date [datetime]

Posté : 23 mars 2009, 21:28
par julian
Alors si ta table contient 4 colonnes, tu dois mettre 4 valeurs dans ton INSERT VALUES(val1, val2, val3, val4)
Ou alors préciser que tu ne veux remplir que 2 champs...

Posté : 24 mars 2009, 00:59
par AB
A propos je comprend pas pourquoi dans ta table tu as un champ timestamp et un champ date, cela me semble faire double emploi, pourquoi pas l'un ou l'autre ?
Et puis pour le champ date même remarque que celle que t'as faite Ryle pour le champ timestamp, c'est un mot réservé...

Sinon pour compléter la réponse de Julian si tu ne renseignes que deux champs ta requête devrait ressembler à quelque chose dans le genre
$query = "INSERT INTO visiteur (adresse_ip,timestamp) VALUES ('" . $_SERVER['REMOTE_ADDR'] . "', '" . time() . "')";

Posté : 24 mars 2009, 10:13
par Romuald632
Bonjour,
J'ai supprimé le champ DATETIME dans ma table VISITEUR
Ensuite j'ai apporté quelques modifications à mon code, mais je reste désespéremment à 0 visiteur, je n'ai rien qui s'enrigistre dans ma table...
Je vous remet mon code :
<?php
mysql_connect("localhost", "root", "");
mysql_select_db("voyagez_vol");

// -------
// ETAPE 1 : on vérifie si l'IP se trouve déjà dans la table
$retour = mysql_query('SELECT COUNT(*) AS nbre_entrees FROM visiteur WHERE adresse_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
{
$query="INSERT INTO visiteur (id_visiteur,adresse_ip,timestamp) VALUES ('','" . $_SERVER['REMOTE_ADDR'] . "', '" . time() . "')";
}

// -------
// ETAPE 2 : on supprime toutes les entrées dont le timestamp est plus vieux que 5 minutes

// On stocke dans une variable le timestamp qu'il était il y a 5 minutes :
$timestamp_5min = time() - (60 * 5); 
mysql_query('DELETE FROM visiteur WHERE timestamp < ' . $timestamp_5min);

// -------
// ETAPE 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 visiteur');
$donnees = mysql_fetch_array($retour);

//On n'a plus qu'à afficher le nombre de connectés !
echo 'Il y a eu  ' . $donnees['nbre_entrees'] . ' visiteurs !';
?>

Posté : 24 mars 2009, 11:02
par julian
id_visiteur est bien définie en auto-incrément dans ta BDD ?

Posté : 24 mars 2009, 11:34
par Romuald632
Oui oui...

Posté : 24 mars 2009, 11:55
par @rthur
je n'ai rien qui s'enrigistre dans ma table...
Je vous remet mon code :
if ($donnees['nbre_entrees'] == 0) // L'ip ne se trouve pas dans la table, on va l'ajouter
{
$query="INSERT INTO visiteur (id_visiteur,adresse_ip,timestamp) VALUES ('','" . $_SERVER['REMOTE_ADDR'] . "', '" . time() . "')";
}
Et en exécutant ta requête INSERT avec un mysql_query? :D

Posté : 24 mars 2009, 11:57
par julian
Remplace
if ($donnees['nbre_entrees'] == 0) // L'ip ne se trouve pas dans la table, on va l'ajouter
{
$query="INSERT INTO visiteur (id_visiteur,adresse_ip,timestamp) VALUES ('','" . $_SERVER['REMOTE_ADDR'] . "', '" . time() . "')";
} 
par
if ($donnees['nbre_entrees'] == 0) // L'ip ne se trouve pas dans la table, on va l'ajouter
{
$query="INSERT INTO visiteur (id_visiteur,adresse_ip,timestamp) VALUES ('','" . $_SERVER['REMOTE_ADDR'] . "', '" . time() . "')";
echo $query;
}
else echo "nok";
die();
Il devrait t'afficher la requête, que tu colles dans phpMyAdmin pour avoir plus d'infos s'il y a une erreur.
S'il t'affiche "nok" c'est que tu ne rentre pas dans la condition d'ajout, donc problème sur la première requête (à priori)


EDIT : Hey mais attends ! Il faut faire mysql_query($query); si tu veut qu'elle soit exécutée !!!

Posté : 24 mars 2009, 12:09
par Romuald632
En faisant comme ça en faisant la requête dans phpMyadmin c'est ok ça enregistre

Posté : 24 mars 2009, 12:18
par julian
EDIT : Hey mais attends ! Il faut faire mysql_query($query); si tu veut qu'elle soit exécutée !!!

Posté : 24 mars 2009, 12:31
par Romuald632
Euh attends, j'ai un doute je la met où cette requête ?