Page 1 sur 2
insertion pour statistique
Posté : 07 janv. 2007, 05:41
par artotal
Bonjour,
j'ai un code de statistique qui normalement ne doit être rentrer qu'une seule fois par ip, ça permet de compter le nombre de visiteur :
$req = "INSERT INTO stats (ip, host, url, datevisite, user_os, navigateur) ".
" VALUES('".$_SERVER["REMOTE_ADDR"]."',".
"'".addSlashes(getHostByAddr($_SERVER["REMOTE_ADDR"]))."',".
"'".addSlashes($_SERVER["HTTP_REFERER"])."',".
"NOW(), '$user_os', '$navigateur')";
@mysql_query($req);
//echo $req;
$aujourdhui=date('Y-m-d'); // notation américaine pour coller à NOW();
//echo $aujourdhui;
$requete="SELECT datevisite FROM stats WHERE datevisite='$aujourdhui'";
$jourd=mysql_query($requete, $lien) or mysql_error();
return mysql_num_rows($jourd);
L'ennui c'est quil compte au click ?
http://www.courant-alternatif.org/index.php
D'avance merci
Posté : 07 janv. 2007, 10:32
par @rthur
Bonjour,
En quoi est-ce anormal? Tu ne fais aucune vérification... donc il est logique qu'à chaque chargement de page qui contient ce code, ça ajoute un enregistrement en bdd...
Posté : 07 janv. 2007, 14:33
par AB
Une solution pourrait donc être de ne pas incrémenter ton compteur si les ip ont déjà été enregistrés dans la journée.
Il existe de nombreux tutos et exemples sur ce sujet. Dans google tapes: compteur de visites
Posté : 07 janv. 2007, 16:34
par artotal
1/je pense que si un enregistrement existe déjà ou même un champ, ça retourne false ?
D'ou mon incrédulité. Confirme moi que je me trompe.
2/ Ou sinon pour les tutos sur les nets, pourrai tu me donner l'explication sur un ip unique, parceque je ne vois pas là comment faire un test simplement sans faire 2 requetes au minimum se qui au prix de la bande passante n 'est pas une bonne méthode, si je devais multiplié le nombre de requete, alors que je fais tout pour les limités, avec beaucoup de mal.
Peut ^étre au n iveau de la structure de la table ?
Posté : 07 janv. 2007, 17:13
par artotal
oui effectivement en mettant unique sur le champ 'ip'. Sa fonctionne.
Merci
Posté : 08 janv. 2007, 00:01
par AB
Le problème c'est que les ip sont uniques dans le même instant sur un serveur. Mais quand l'ip n'est plus utilisé par un visiteur il pourra être réaffecter à un autre visiteur que tu ne pourras donc plus comptabiliser. (je n'ai pas de formation serveur, corrigez-moi si je me trompe)
Posté : 08 janv. 2007, 00:08
par artotal
oui c'est clair, j'ai mis l'ip + date de visite du jour en unique, on peux difficilement faire plus ?
Pour mon cas sa me fait un ip par jour
Posté : 08 janv. 2007, 00:20
par Ajoloca
Bonsoir,
J'ai pas bien compris ce que tu cherches à faire.
Tu cherches à compter le nombre de visiteurs dans la journée ou bien le nombre de connectées à un instant T (avec une précision relative, bien sur)
Tu peut même faire les deux.
Dans ta table, un champs ip, un autre date qui tous deux forment ta clé.
Un troisième avec l'heure que tu mets à jour à chaque page.
Tu auras le nombre de connectés en faisant une extraction (count) de ceux dont la date est = à celle du jour et l'heure est inférieure à l'heure actuelle mois x secondes, minutes (à toi de voir le délai)
Pour avoir les visiteurs d'une journée, tu le fais avec ton champ date.
Posté : 08 janv. 2007, 13:51
par AB
oui c'est clair, j'ai mis l'ip + date de visite du jour en unique, on peux difficilement faire plus ?
Pour mon cas sa me fait un ip par jour
Ok, j'ai compris ta méthode (je fais de même

)
Ajoloca,
Je ne m'étais pas encore penché sur les compteurs d'ip en ligne. ça fait une bonne piste. Merci
Posté : 08 janv. 2007, 14:16
par artotal
D'ailleurs je te met mon code complet. Sa te fera une autre piste.
<?php
$user_agent = $_SERVER['HTTP_USER_AGENT'];
$user_agents = array('Windows NT 5.1', 'Windows NT 5.0', 'Windows 2000', 'Windows 98', 'Windows NT 4.0', 'Linux', 'Mac OS X', 'SunOS', 'FreeBSD', '');
$os = array('Windows XP', 'Windows 2000', 'Windows 2000', 'Windows 98', 'Windows NT 4.0', 'Linux', 'Mac OS X', 'Solaris', 'FreeBSD', 'Robot');
foreach ($user_agents as $cle => $value)
if(@strpos($user_agent, $value))
break;
$user_os = $os[$cle];
//echo $user_os;
if(ereg("MSIE", $_SERVER["HTTP_USER_AGENT"]))
{
$navigateur="Internet explorer";
}
else if (ereg("^Mozilla/", $_SERVER["HTTP_USER_AGENT"]))
{
$navigateur="Firefox";
}
else if (ereg("^Opera/", $_SERVER["HTTP_USER_AGENT"]))
{
$navigateur="Opéra";
}
else
{
$navigateur="Un autre navigateur";
}
//echo 'Votre nav à pour sign :'.$_SERVER["HTTP_USER_AGENT"].'<br />';
//echo 'Vous utilisez '.$navigateur;
//$time=time();
if()
{
$req = "INSERT INTO stats (ip, host, url, datevisite, user_os, navigateur) ".
" VALUES('".$_SERVER["REMOTE_ADDR"]."',".
"'".addSlashes(getHostByAddr($_SERVER["REMOTE_ADDR"]))."',".
"'".addSlashes($_SERVER["HTTP_REFERER"])."',".
"NOW(), '$user_os', '$navigateur')";
@mysql_query($req);
//echo $req;
}
$aujourdhui=date('Y-m-d'); // notation américaine pour coller à NOW();
//echo $aujourdhui;
$requete="SELECT datevisite FROM stats WHERE datevisite='$aujourdhui'";
$jourd=mysql_query($requete, $lien) or mysql_error();
return mysql_num_rows($jourd);
?>
Maintenant c'est peut être pas optimiser, et je cherche à l'affiner pour avoir les connections de "connecter en ce moment", j'avais pris un script tout fais mais sa me fait trop de code en plus...
Posté : 08 janv. 2007, 14:29
par artotal
Par contre pour ton explication sur la forme de la structure est ce qu'en mettant l'ip et la date du jour en clé primaire. Donc l'enregistrement ne se fait que dans ces conditions, l'heure ajouter en clé unique m'empèchera d'avoir plusieurs heures, je crois ?
Je crois que oui.
Posté : 08 janv. 2007, 15:28
par zeus
Même si je ne peut poser une solution simple ici, la recherche sur IP n'est pas très fiable.
Entre les proxy et les IP tournantes, tu as des stats qui sont completement fausses.
Je travaille en ce moment sur un système de tracking des visites (un web analyser) et le seul moyen qu'on ait trouvé, c'est un couplage de cookie, d'IP et de vérification avec des données déjà récoltées
Et je vous laisse imaginer les machines qu'il faut derrière

Posté : 08 janv. 2007, 15:31
par zeus
Par contre pour ton explication sur la forme de la structure est ce qu'en mettant l'ip et la date du jour en clé primaire. Donc l'enregistrement ne se fait que dans ces conditions, l'heure ajouter en clé unique m'empèchera d'avoir plusieurs heures, je crois ?
Je crois que oui.
Le SGBD refusera d'insérer une autre ligne dont la clé primaire se répete.
Si ta clé primaire porte sur l'IP et la date, il refusera d'insérer 2 fois la même IP pour le même jour.
Si ta clé primaire porte sur l'IP, la date et l'heure du jour, il refusera d'insérer 2 fois la même IP pour la même heure de la même date ...
Si ta date se décompose en HH:mm, il enregistrera toutes les visites ou le jour, l'heure et les minutes sont différentes. Donc, pratiquement toutes
Par contre, si tu ne compte stocker qu'une visite par jour, laisse l'IP et la date dans la clé primaire mais stocke l'heure de manière informative
Posté : 08 janv. 2007, 19:39
par AB
Merci de tes explications Zeus
J'essaierai d'optimiser mes compteurs quand j'aurai un moment
Artotal,
Quand j'écrivais que l'idée d'Ajoloca me donnait une piste pour les ip en ligne, je voulais dire connectés simultanément.
Cela dit comme je ne faisais qu'un compteur de visites, ton code m'aidera quand je voudrai faire des stats plus complètes

Posté : 09 janv. 2007, 15:18
par artotal
j'ai bien compris.
Par contre pour un affichage des données temporelle j'ai une requete qui fonctionne:
http://creatif-web.be/assoc_arsys/admin ... tation.php
$aujourdhui=date('Y-m-d');
$req="SELECT * FROM stats WHERE datevisite='$aujourdhui'";.
Mais si je veux l'affichage d'une semaine ?
j'ai essayer ça sans succès
$annee=date('Y');
$mois=date('m').'-';
$jourr=date('d')-7;
echo $aujourdhui;
Sa fonctionne avec mktime mais sa renvoie le timestamp, donc je dois le changer en format US de date
:::::::::::::::::::::::::::::::::::
$septdernier = mktime(0, 0, 0, date("m"), date("d")-7, date("Y"));
echo $septdernier;
Pour avoir le format date il faut donc que je transforme le timestamp avec date ?
Existe-il une fonction mysql ?
Merci
-> j'ai trouvé une solution qui fonctionne.
echo date('Y-m-d', $septdernier); // sept dernier jour