insertion pour statistique

Mammouth du PHP | 601 Messages

07 janv. 2007, 05:41

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
http://xavier-artot.com
¨'°-.,¸¸,.-·²°'´¨'°-.,¸¸,.-·²°'´¨'°-.,¸¸,.-·°'´¨
système d'exploitation "Ubuntu 7.10"

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9783 Messages

07 janv. 2007, 10:32

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...
Quand tout le reste a échoué, lisez le mode d'emploi...

ViPHP
AB
ViPHP | 5818 Messages

07 janv. 2007, 14:33

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

Mammouth du PHP | 601 Messages

07 janv. 2007, 16:34

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 ?
http://xavier-artot.com
¨'°-.,¸¸,.-·²°'´¨'°-.,¸¸,.-·²°'´¨'°-.,¸¸,.-·°'´¨
système d'exploitation "Ubuntu 7.10"

Mammouth du PHP | 601 Messages

07 janv. 2007, 17:13

oui effectivement en mettant unique sur le champ 'ip'. Sa fonctionne.
Merci
http://xavier-artot.com
¨'°-.,¸¸,.-·²°'´¨'°-.,¸¸,.-·²°'´¨'°-.,¸¸,.-·°'´¨
système d'exploitation "Ubuntu 7.10"

ViPHP
AB
ViPHP | 5818 Messages

08 janv. 2007, 00:01

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)

Mammouth du PHP | 601 Messages

08 janv. 2007, 00:08

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
http://xavier-artot.com
¨'°-.,¸¸,.-·²°'´¨'°-.,¸¸,.-·²°'´¨'°-.,¸¸,.-·°'´¨
système d'exploitation "Ubuntu 7.10"

ViPHP
ViPHP | 1961 Messages

08 janv. 2007, 00:20

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.
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

ViPHP
AB
ViPHP | 5818 Messages

08 janv. 2007, 13:51

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 :wink: )


Ajoloca,

Je ne m'étais pas encore penché sur les compteurs d'ip en ligne. ça fait une bonne piste. Merci

Mammouth du PHP | 601 Messages

08 janv. 2007, 14:16

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...
http://xavier-artot.com
¨'°-.,¸¸,.-·²°'´¨'°-.,¸¸,.-·²°'´¨'°-.,¸¸,.-·°'´¨
système d'exploitation "Ubuntu 7.10"

Mammouth du PHP | 601 Messages

08 janv. 2007, 14:29

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.
http://xavier-artot.com
¨'°-.,¸¸,.-·²°'´¨'°-.,¸¸,.-·²°'´¨'°-.,¸¸,.-·°'´¨
système d'exploitation "Ubuntu 7.10"

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

08 janv. 2007, 15:28

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 :?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

08 janv. 2007, 15:31

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
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

ViPHP
AB
ViPHP | 5818 Messages

08 janv. 2007, 19:39

Merci de tes explications Zeus

J'essaierai d'optimiser mes compteurs quand j'aurai un moment :D


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 :D

Mammouth du PHP | 601 Messages

09 janv. 2007, 15:18

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
Modifié en dernier par artotal le 09 janv. 2007, 15:50, modifié 6 fois.
http://xavier-artot.com
¨'°-.,¸¸,.-·²°'´¨'°-.,¸¸,.-·²°'´¨'°-.,¸¸,.-·°'´¨
système d'exploitation "Ubuntu 7.10"