Besoin de votre participation à tous

Bonsoir!

Je développe un tout petit module de statistique pour un site web (et par plaisir :P)

Pour ce faire, je voudrais récolter des infos (autres que les miennes) pour commencer a développer la partie visuelle (graphique de connexions, statistiques journalières etc)

Si vous voulez bien me donner un coup de main, c’est ici que ca se passe.

Soyons francs et transparents, ne sont enregistrées que :

  • adresse IP (pour définir le nombre de visites uniques)
  • date (of course)
  • le referer
  • l’uri
  • votre navigateur internet
  • l’hostname s’il existe

Voila, accessoirement si vous avez des idées pour completer les informations enregistrées, n’hésitez pas :stuck_out_tongue:

Merci

Et on peux voir les résultats :stuck_out_tongue:

Je viens juste de commencer :stuck_out_tongue: patiente un peu voyons :stuck_out_tongue:

Je me suis dis que c’était inutile de perdre du temps et que je pouvais commencer a enregistrer de suite :stuck_out_tongue:

J’avais fait a peu pres pareil, mais le truc c’est que l’enregistrement de l’os ne marchait pas …

[quote name=‘fser’ date=’ 15 Jan 2005, 11:33’]J’avais fait a peu pres pareil, mais le truc c’est que l’enregistrement de l’os ne marchait pas …
[right][post=“322628”]<{POST_SNAPBACK}>[/post][/right][/quote]

Faut que tu fasses des regex dans $_SERVER[‘HTTP_USER_AGENT’], genre : “Windows NT 5.1”, “Windows NT 5.0”… Mate sur des pages de stats existantes pour connaitre les chaines a rechercher. http://norman.walsh.name/popular/browsers par exemple.

Ca tombe bien, j’allais poser la question. Dans le module précité donc, je loggue effectivement la variable $_SERVER[‹ HTTP_USER_AGENT ›] et j’avais déjà eu l’idée de ressortir les infos de celle ci.

J’avais également lu que les Regex pouvaient m’aider, mais jusqu’a présent je n’y comprend pas grand chose :stuck_out_tongue:

Prenons un exemple concret:
La variable me renvois Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
D’une part je voudrais ressortir les données « MSIE 6.0 », « Windows NT 5.1 » (question en vrac : mais que viens faire Mozilla/4.0 dans le bazard??), mais j’ai l’impression que les données de la variable ne suivent pas un schéma global, regardez :

Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt) Mozilla/5.0 (compatible; AvantGo 3.2; ProxiNet; Danger hiptop 1.0)
Dans la seconde on retrouve ProxiNet a la place de Windows 98 dans la premier (?) sans parler des bots, quand un bot visite le site (ex google) voici ce que ca donne :

Googlebot/2.1 (+http://www.google.com/bot.html)

Bon en gros ma question : quelqu’un peut il m’expliquer la structure de la variable (a quoi correspond quoi) et comment je peux la traiter au mieux avec les RegEx?

Merci et bon dimanche :stuck_out_tongue:

Ce code n’est pas de moi, mais comme il etait censé etre bien, je l’ai pris.
Je ne saurait dire ou est le mien qui ne marchait pas non plus :stuck_out_tongue:
je ne sais plus non plus d’ou il vient ( si de google )

[code]/** DETECTION SYSTEME D’EXPLOITATION **/

if(ereg(« Windows 2000 », $_SERVER[« HTTP_USER_AGENT »])){
$SystemeExploitation = « Windows 2000 »;
}
elseif(ereg(« Windows ME », $_SERVER[« HTTP_USER_AGENT »]) || ereg(« WinME », $_SERVER[« HTTP_USER_AGENT »])){
$SystemeExploitation = « Windows ME »;
}
elseif(ereg(« Windows 98 », $_SERVER[« HTTP_USER_AGENT »]) || ereg(« Win98 », $_SERVER[« HTTP_USER_AGENT »])){
$SystemeExploitation = « Windows 98 »;
}
elseif(ereg(« Windows 95 », $_SERVER[« HTTP_USER_AGENT »]) || ereg(« Win95 », $_SERVER[« HTTP_USER_AGENT »])){
$SystemeExploitation = « Windows 95 »;
}
elseif(ereg(« Windows XP », $_SERVER[« HTTP_USER_AGENT »]) || ereg(« WinXP », $_SERVER[« HTTP_USER_AGENT »]) || ereg(« Windows NT 5.1 », $_SERVER[« HTTP_USER_AGENT »]) || ereg(« Windows NT 5.0 », $_SERVER[« HTTP_USER_AGENT »]) || ereg(« Windows NT 5.2 », $_SERVER[« HTTP_USER_AGENT »])){
$SystemeExploitation = « Windows XP »;
}
elseif(ereg(« Windows NT », $_SERVER[« HTTP_USER_AGENT »]) || ereg(« WinNT », $_SERVER[« HTTP_USER_AGENT »])){
$SystemeExploitation = « Windows NT »;
}
elseif(ereg(« Linux », $_SERVER[« HTTP_USER_AGENT »])){
$SystemeExploitation = « Linux »;
}
elseif(ereg(« Macintosh », $_SERVER[« HTTP_USER_AGENT »]) || ereg(« Mac_PowerPC », $_SERVER[« HTTP_USER_AGENT »])){
$SystemeExploitation = « Macintosh OS »;
}
elseif(ereg(« SunOS », $_SERVER[« HTTP_USER_AGENT »])){
$SystemeExploitation = « SunOS »;
}
elseif(ereg(« BeOS », $_SERVER[« HTTP_USER_AGENT »])){
$SystemeExploitation = « BeOS »;
}
else{
$SystemeExploitation = « Inconnu »;
}[/code]

Ouais, ca me deprime un peu de voir a quel point les gens savent pas programmer, mais passons… Voila un bout de code que je viens de bidouiller, et qui a l’air de fonctionner plutot pas mal.

[code]$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 ›, ‹ Inconnu ›);

foreach ($user_agents as $i => $value)
    if(@strpos($user_agent, $value))
         break;

$user_os = $os[$i];[/code]

Moralite : http://www.php.net et code maison au lieu de repomper du code horriblement degueu sur google. :stuck_out_tongue:

[Edit] : rajout de user agents.

Ah Ah Ah niquel Unreal :stuck_out_tongue:
Seulement voila, regarde le résultat ca fait un peu bourrin… Admettons que je veuilles regrouper ensemble les WinXP, Linux, Inconnu, et d’afficher le nombre à coté. En requete sql suffit d’ajouter « group by » mais dans le cas présent?

[quote name=‹ AkyRhO › date=’ 17 Jan 2005, 07:41’]Ah Ah Ah niquel Unreal :stuck_out_tongue:
Seulement voila, regarde le résultat ca fait un peu bourrin… Admettons que je veuilles regrouper ensemble les WinXP, Linux, Inconnu, et d’afficher le nombre à coté. En requete sql suffit d’ajouter « group by » mais dans le cas présent?
[right][post=« 323021 »]<{POST_SNAPBACK}>[/post][/right][/quote]

Tu devrais montrer les resultats sur ta page :stuck_out_tongue:

Ca informerai un peu nous :stuck_out_tongue:

Koubiak

[quote name=‹ koubiak › date=’ 17 Jan 2005, 09:17’]Tu devrais montrer les resultats sur ta page :stuck_out_tongue:

Ca informerai un peu nous :stuck_out_tongue:

Koubiak
[right][post=« 323030 »]<{POST_SNAPBACK}>[/post][/right][/quote]
Ils sont affichés Koubiak… :stuck_out_tongue:

[quote name=‹ AkyRhO › date=’ 17 Jan 2005, 12:49’]Ils sont affichés Koubiak… :stuck_out_tongue:
[right][post=« 323087 »]<{POST_SNAPBACK}>[/post][/right][/quote]

Oui mets pas ce qu’il a reussi a scanner chez moi par exemple …

Koubiak que y a plein de tux c’est bien :stuck_out_tongue:

[quote name=‹ AkyRhO › date=’ 17 Jan 2005, 07:41’]Ah Ah Ah niquel Unreal :stuck_out_tongue:
Seulement voila, regarde le résultat ca fait un peu bourrin… Admettons que je veuilles regrouper ensemble les WinXP, Linux, Inconnu, et d’afficher le nombre à coté. En requete sql suffit d’ajouter « group by » mais dans le cas présent?
[right][post=« 323021 »]<{POST_SNAPBACK}>[/post][/right][/quote]

C’etait juste un exemple hein, t’etais pas oblige de le foutre tel quel dans ta page :stuck_out_tongue:

[code]//Debut de ton script, tu initialises tes array.
$os_hits = array(0, 0, 0, 0, 0, 0, 0, 0, 0);
$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_id = array(1, 2, 2, 3, 4, 5, 6, 7, 8, 9);
$os = array(‹ Windows XP ›, ‹ Windows 2000 ›, ‹ Windows 98 ›, ‹ Windows NT 4.0 ›, ‹ Linux ›, ‹ Mac OS X ›, ‹ Solaris ›, ‹ FreeBSD ›, ‹ Inconnu ›);

[…]

//Debut de ta boucle (j’imagine)

$user_agent = que tu recuperes;

foreach ($user_agents as $i => $value)
if(@strpos($user_agent, $value))
break;

$os_hits[$os_id[$i]]++;

// Fin de ta boucle

// Apres, au moment d’afficher tes resultats…

echo ($os_hits[0] . ’ visiteurs ont utilisé ’ . $os[0]);
// Affiche « 1234 visiteurs ont utilisé Windows XP »[/code]

(code pas teste, mais qui devrait plus ou moins fonctionner :stuck_out_tongue: )

Note : ce serait surement beaucoup plus constructif de creer une table « OS » ou tu enregistras directement les stats de chaque OS au moment de l’acces que d’enregistrer plein de user agents et de faire un gros tri de la mort qui tue au moment de l’affichage (rechercher des chaines est une operation tres lourde en temps CPU).

Edit : decidemment, je suis mal reveille :stuck_out_tongue: