COMPTEUR DE VISITES INTELLIGENT - VIRÉ

cs_djmaster Messages postés 28 Date d'inscription vendredi 10 juin 2005 Statut Membre Dernière intervention 12 mai 2008 - 22 déc. 2005 à 22:55
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 - 23 déc. 2005 à 13:07
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/35214-compteur-de-visites-intelligent-vire

malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
23 déc. 2005 à 13:07
Hello,

qu'ajouter...?
je suis aussi d'accord avec kankrelune et les autres : ce code est loin d'être un code expert.
De plus, il est franchement bordélique...
Enfin, malgré les corrections, il y a encore des erreurs de programmation, des bouts de codes sales, et beaucoup d'optimisations manquantes.
En vrac, pour les trucs les plus simples :
- on n'utilise pas (j'aime à le répêter...) SELECT *. On nomme tous les champs désirés, même si on veut tous les ramener. Ca, c'est de l'optimisation...
- les index de tableaux associatifs doivent être entre simples ou doubles quotes.
- tu n'utilises jamais de commentaires ? C'est une erreur cher Nick ;-) Les commentaires sont une des bases les plus importantes pour une bonne programmation. Que ce soit pour les autres (ceux qui vont se plonger dans ton code), ou pour toi.

Néanmoins, je laisse ce code, parce qu'il est plutôt complet. MAIS je tiens à mettre en garde les débutants le matant : c'est MAL codé, ne prenez pas exemple sur ce code pour revoir vos bases, please!
kiki2sirom Messages postés 153 Date d'inscription mardi 17 août 2004 Statut Membre Dernière intervention 23 décembre 2010
23 déc. 2005 à 12:19
Plutôt que :

if($nb3 != 0) { }
else
{
$dateDebut=time();
$dateFin=time()+300;
$query_inc="INSERT INTO DVconnectes VALUES('".$dateDebut."','".$dateFin."','".$ipAppelant."')";
$result_inc=mysql_query($query_inc);
}

ça ne se fait pas

faire:

if($nb3== 0) {
$dateDebut=time();
$dateFin=time()+300;
$query_inc="INSERT INTO DVconnectes VALUES('".$dateDebut."','".$dateFin."','".$ipAppelant."')";
$result_inc=mysql_query($query_inc);

}

j'en passe et des meilleurs

kiki2sirom
cs_jeca Messages postés 341 Date d'inscription mercredi 17 juillet 2002 Statut Membre Dernière intervention 14 juillet 2011 14
23 déc. 2005 à 11:13
Je me suis planté dans mon copier-coller, cette ligne :

$maintenant = gmmktime(date('Y m d H:i:s', time()));

est inutile.
cs_jeca Messages postés 341 Date d'inscription mercredi 17 juillet 2002 Statut Membre Dernière intervention 14 juillet 2011 14
23 déc. 2005 à 10:37
Les lignes 9 à 39 peuvent être remplacée par :

setlocale (LC_TIME, 'fr');
$maintenant = gmmktime(date('Y m d H:i:s', time()));
$date = strftime ('%A %d %B %Y %H:%M:%S', gmmktime());
cs_pdl Messages postés 134 Date d'inscription mardi 20 novembre 2001 Statut Membre Dernière intervention 16 juin 2008
23 déc. 2005 à 09:50
Bon, j'ai mis la première fameuse quote de '5' ! Tout d'abord, ton script n'est pas pour moi du niveau Expert, mais novice, car c'est vrai qu'il n'y a pas grand chose de révolutionnaire. Par contre, il y a pas mal d'erreur dans ton script et ça cela va en décourager plus d'un ! Exemple :

if($jour = = Mon) $date='lundi ';

Où as-tu défini la constante Mon ? Nulle part, heureusement que PHP est fûté et qu'il assume Mon = 'Mon' en d'autres mots, tu devrais écrire :

if($jour == 'Mon') $date='lundi ';

il en est de même pour tous les tests $_SERVER[...] qui devrait être $_SERVER['...'] pour être correcte.

Ici encore la partie :

# $result_appelant=mysql_query($query_appelant);
# $nb3=mysql_num_rows($result_appelant);
#
# if($nb3 != 0) { }
# else
# {
# $dateDebut=time();
# $dateFin=time()+300;
# $query_inc="INSERT INTO DVconnectes VALUES('".$dateDebut."','".$dateFin."','".$ipAppelant."')";
# $result_inc=mysql_query($query_inc);
# }

peut-être réécrite comme-ci :

$query_appelant="SELECT * FROM DVconnectes where ip='".$ipAppelant."'";
$result_appelant=mysql_query($query_appelant);
if(!$result_appelant)
{
$dateDebut=time();
$dateFin=time()+300;
$query_inc="INSERT INTO DVconnectes VALUES('".$dateDebut."','".$dateFin."','".$ipAppelant."')";
$result_inc=mysql_query($query_inc) or die ("");
}

Pas besoin de passer par mysql_num_rows car mysql_query renvoi false s'il n'a rien trouvé ou n'as pu exécuter le query.

Bref, pour faire simple, je mets la version que j'ai légèrement modifiée (corrigée) et dans laquelle j'ai supprimé la partie envoi de mail, car franchement je vois pas l'intérêt d'envoi un mail à quelqu'un pour lui dire qu'il s'est rendu sur une page d'un certain site !

<meta http-equiv="content-type" content="text/html;charset=iso-8859-1">
<?php
function add_visite()
{
include("config.inc.php");
$db=mysql_connect($server, $login, $password);
mysql_select_db($database, $db);

$jour=gmdate("D");
$nbjour=gmdate("j");
$mois=gmdate("m");
$an=gmdate("Y");
$heure=gmdate("H:i:s");

if($jour == 'Mon' ) $date='lundi ';
else if($jour == 'Tue') $date='mardi ';
else if($jour == 'Wed') $date='mercredi ';
else if($jour == 'Thu') $date='jeudi ';
else if($jour == 'Fri') $date='vendredi ';
else if($jour == 'Sat') $date='samedi ';
else if($jour == 'Sun') $date='dimanche ';

if($nbjour == 1) $date.='1er';
else $date.=$nbjour;

if($mois == 01) $date.=' janvier';
else if($mois == 02) $date.=' février';
else if($mois == 03) $date.=' mars';
else if($mois == 04) $date.=' avril';
else if($mois == 05) $date.=' mai';
else if($mois == 06) $date.=' juin';
else if($mois == 07) $date.=' juillet';
else if($mois == 08) $date.=' août';
else if($mois == 09) $date.=' septembre';
else if($mois == 10) $date.=' octobre';
else if($mois == 11) $date.=' novembre';
else if($mois == 12) $date.=' décembre';

$date.=' '.$an.', '.$heure;
/*
if(strpos($_SERVER[HTTP_USER_AGENT], "Win95") || strpos($_SERVER[HTTP_USER_AGENT], "Windows 95")) $os="Windows 95";
else if(strpos($_SERVER[HTTP_USER_AGENT], "Win98") || strpos($_SERVER[HTTP_USER_AGENT], "Windows 98")) $os="Windows 98";
else if(strpos($_SERVER[HTTP_USER_AGENT], "WinNT") || strpos($_SERVER[HTTP_USER_AGENT], "Windows NT")) $os="Windows NT";
else if(strpos($_SERVER[HTTP_USER_AGENT], "WinNT 5.0") || strpos($_SERVER[HTTP_USER_AGENT], "Windows NT 5.0")) $os="Windows 2000";
else if(strpos($_SERVER[HTTP_USER_AGENT], "WinNT 5.1") || strpos($_SERVER[HTTP_USER_AGENT], "Windows NT 5.1")) $os="Windows XP";
else if(strpos($_SERVER[HTTP_USER_AGENT], "Linux") || strpos($_SERVER[HTTP_USER_AGENT], "UNIX")) $os="UNIX Linux";
else if(strpos($_SERVER[HTTP_USER_AGENT], "OS/2")) $os="OS/2";
else if(strpos($_SERVER[HTTP_USER_AGENT], "Sun")) $os="Sun OS";
else if(strpos($_SERVER[HTTP_USER_AGENT], "Mac OS X")) $os="Mac OS X";
else if(strpos($_SERVER[HTTP_USER_AGENT], "Macintosh") || strpos($_SERVER[HTTP_USER_AGENT], "Mac_PowerPC")) $os="Mac OS 9";
else $os="Système inconnu";
*/
$os=$_SERVER['HTTP_USER_AGENT'];
/*
if(strpos($_SERVER[HTTP_USER_AGENT], "Mozilla/5.0")) $browser="Mozilla";
else if(strpos($_SERVER[HTTP_USER_AGENT], "Mozilla/4")) $browser="Netscape";
else if(strpos($_SERVER[HTTP_USER_AGENT], "Mozilla/3")) $browser="Netscape";
else if(strpos($_SERVER[HTTP_USER_AGENT], "Firefox") || strpos($_SERVER[HTTP_USER_AGENT], "Firebird")) $browser="Firefox";
else if(strpos($_SERVER[HTTP_USER_AGENT], "Links")) $browser="Links";
else if(strpos($_SERVER[HTTP_USER_AGENT], "MSIE")) $browser="MS Internet Explorer";
else if(strpos($_SERVER[HTTP_USER_AGENT], "Netscape")) $browser="Netscape";
else if(strpos($_SERVER[HTTP_USER_AGENT], "Camino")) $browser="Camino";
else if(strpos($_SERVER[HTTP_USER_AGENT], "Galeon")) $browser="Galeon";
else if(strpos($_SERVER[HTTP_USER_AGENT], "Konqueror")) $browser="Konqueror";
else if(strpos($_SERVER[HTTP_USER_AGENT], "OmniWeb") && strpos($_SERVER[HTTP_USER_AGENT], "Safari")) $browser="OmniWeb";
else if(strpos($_SERVER[HTTP_USER_AGENT], "Safari")) $browser="Safari";
else if(strpos($_SERVER[HTTP_USER_AGENT], "OmniWeb")) $browser="OmniWeb";
else if(strpos($_SERVER[HTTP_USER_AGENT], "Opera")) $browser="Opera";
else $browser="Navigateur inconnu";
* */
$browser = $_SERVER['HTTP_USER_AGENT'];

if(strpos($_SERVER['HTTP_USER_AGENT'], "AppleWebKit") or
strpos($_SERVER['HTTP_USER_AGENT'], "WebKit")) $motor="Apple WebKit";
else if(strpos($_SERVER['HTTP_USER_AGENT'], "Gecko")) $motor="Gecko";
else {
$msie="MS Internet Explorer";
if($browser == $msie) $motor="MSIE";
else $motor=$_SERVER['HTTP_USER_AGENT'];
}

$dns=gethostbyaddr($_SERVER['REMOTE_ADDR']);

$page=$_SERVER['REQUEST_URI'];
$referent=$_SERVER['HTTP_REFERER'];

$query="INSERT INTO visites (id, date, ip, dns, page, referent, motor, nav, syst) VALUES ('', '".$date."', '".$_SERVER[REMOTE_ADDR]."', '".$dns."', '".$page."', '".$referent."', '".$motor."', '".$browser."', '".$os."')";
//echo $query;
//if($_SERVER[REMOTE_ADDR] != '127.0.0.1' or $_SERVER[REMOTE_ADDR] != '::1')
mysql_query($query);
mysql_close($db);
}

function nb_visites()
{
include("config.inc.php");
$db=mysql_connect($server, $login, $password);
mysql_select_db($database, $db);
$query="SELECT id FROM visites";
$result=mysql_query($query);
$data=mysql_num_rows($result);
echo ''.$data.'';
mysql_close($db);
}

function return_visites()
{
include("config.inc.php");
$db=mysql_connect($server, $login, $password);
mysql_select_db($database, $db);

$query2="SELECT * FROM visites ORDER BY id DESC";
$result2=mysql_query($query2);

$nombre=0;
$nombre2=1;

echo '<head><style type="text/css"><!-- .Style { font-size: 10px; font-family: Lucida Grande, Helvetica, Verdana; } --></style></head>
<table border="0" height="1">----, <form action=\"index.php\" method=\"post\"><table border=\"0\">----
ID : , , ----
IP : , ----
Toutes les visites
</form></td>
</tr>
<tr>
<td>
<select style="font-size: 10px;" onchange="document.location=(\'index.php?limit=\'+this.value);"><optgroup label="Pages" title="Pages">';
while($data2=mysql_fetch_array($result2))
{

if($data2[id] == 1)
{
echo '<option value="0" ';
if($data2[id] == 0) echo 'SELECTED';
echo '>Page n° '.$nombre2.'</option>';
$nombre2++;
$limit0=1;
}
if($nombre % 100 == 0)
{
echo '<option value="'.$nombre.'" ';
if($_GET[limit] == $nombre) echo 'SELECTED';
echo '>Page n° '.$nombre2.'</option>';
$nombre2++;
}
$nombre++;
}
echo '</optgroup></select>
</td></tr></table>
</td>
</tr>
<tr>
<td height="1" colspan="9"></td>
</tr>';

if(empty($_GET[limit]) or $_GET[limit] == 0)
{
$limit=0;
}
if(isset($_GET[limit]) && $_GET[limit] != 0)
{
$limit=$_GET[limit];
}

if($_POST[type] != id)
$query="SELECT * FROM visites ORDER BY id DESC LIMIT ".$limit.", 100";

if($_POST[type] == id)
$query="SELECT * FROM visites WHERE id = '".$_POST[id]."'";

if($_POST[type] == ip)
$query="SELECT * FROM visites WHERE ip = '".$_POST[ip]."'";

$result=mysql_query($query);

echo '<tr>
<td width="4"> ID </td>
<td width ="220">Date</td>
<td width= "92"> IP </td>
<td width ="230">DNS</td>
<td>Page</td>
<td>Référent</td>
<td width= "100"> Moteur de rendu
<td width ="100">Navigateur</td>
<td width= "100"> Système </td>
</tr>';
while($data =mysql_fetch_array($result))
{
if($data[referent] != '')
{
$nb_ref=1;
$referentdata=$data[referent];
$str=strlen($referentdata);
$referentdata1=$referentdata[0];
while($nb_ref <= 37)
{
$referentdata1.=$referentdata[$nb_ref];
$nb_ref++;
}
if($str >= 37) $referentdata1.="...";
}
else
$referentdata1='';


echo '<tr>
<td width="4">'.$data[id].'</td>
<td width="220">'.$data[date].'</td>
<td width="92">'.$data[ip].'</td>
<td>'.$data[dns].'</td>
<td>['.$data[page].' '.$data[page].']</td>
<td>['.$data[referent].' '.$referentdata1.']</td>
<td width="100">'.$data[motor].'</td>
<td width="100">'.$data[nav].'</td>
<td width="100">'.$data[syst].'</td>
</tr>';
}
echo '</table>';
mysql_close($db);
}

function show_live()
{
include("config.inc.php");
$db=mysql_connect($server, $login, $password);
mysql_select_db($database, $db);
$ipAppelant=$_SERVER[REMOTE_ADDR];
$heureAppelant=time();
$query="SELECT * FROM DVconnectes";
$result=mysql_query($query);

while($row=mysql_fetch_array($result))
{
if($row[dateFin] < $heureAppelant)
{
$query_plus_la="DELETE FROM DVconnectes WHERE ip='".$row[ip]."'";
$result_plus_la=mysql_query($query_plus_la);
}
}

$query_appelant="SELECT * FROM DVconnectes where ip='".$ipAppelant."'";
$result_appelant=mysql_query($query_appelant);
//$nb3=mysql_num_rows($result_appelant);

if($result_appelant)
{
$dateDebut=time();
$dateFin=time()+300;
$query_inc="INSERT INTO DVconnectes VALUES('".$dateDebut."','".$dateFin."','".$ipAppelant."')";
$result_inc=mysql_query($query_inc);
}

$query_connectes="SELECT * FROM DVconnectes";
$result_connectes= mysql_query($query_connectes);
$count=mysql_num_rows($result_connectes);

if($count == 1) $txt="visiteur actuellement connecté";
else $txt="visiteurs actuellement connectés";

echo ''.$count." ".$txt.'';

mysql_close($db);
}

function add_live()
{
include("config.inc.php");
$db=mysql_connect($server, $login, $password);
mysql_select_db($database, $db);

$ipAppelant=$_SERVER[REMOTE_ADDR];
$heureAppelant=time();

$query="SELECT * FROM DVconnectes";
$result=mysql_query($query);

while($row=mysql_fetch_array($result))
{
if($row[dateFin] < $heureAppelant)
{
$query_plus_la="DELETE FROM DVconnectes WHERE ip='".$row[ip]."'";
$result_plus_la=mysql_query($query_plus_la);
}
}

$query_appelant="SELECT * FROM DVconnectes where ip='".$ipAppelant."'";
$result_appelant=mysql_query($query_appelant);
if(!$result_appelant)
{
$dateDebut=time();
$dateFin=time()+300;
$query_inc="INSERT INTO DVconnectes VALUES('".$dateDebut."','".$dateFin."','".$ipAppelant."')";
$result_inc=mysql_query($query_inc) or die ("");
}

mysql_close($db);
}
?>

Je terminerai pas dire que je n'ai pas fait une étude plus approfondie de ta source, mais que c'est déjà pas mal.

Bàt,
Pierre
cs_manouille Messages postés 73 Date d'inscription vendredi 29 août 2003 Statut Membre Dernière intervention 22 juin 2007
23 déc. 2005 à 08:58
Effectivement je suis d'accord avec kankrelune, je en vois pas ou est la prouesse technique de ce script.
Et pourquoi compteur de visites INTELLIGENT ???
En voyant Le titre je me suis jeté sur ce script, mais en fait j'ai rien appris et je trouce la presentation des stats inutilisables (des kilometres de tableaux contenant des données lisibles uniquement par un webmaster).
De plus il ne faut pas prétendre avoir un trafic important sinon a base de données vas vite devenir obèse.

Mais sinon l'idée de pourvoir suis la navigation d'un internaute sur son site est interessante.

Je posterais plus tard un script de stats mensuel avec affichage de graph, pour les visites globals, par pages, par langue, par pays etc....
cs_pdl Messages postés 134 Date d'inscription mardi 20 novembre 2001 Statut Membre Dernière intervention 16 juin 2008
23 déc. 2005 à 08:30
Salut,

J'ai l'impression que tu t'es un peu fatigué pour rien. En effet pourquoi avoir fait tous ces if else if pour l'OS et le browser alors que tu pourrais simplement dire directement $os $_SERVER[HTTP_USER_AGENT] et $browser $_SERVER[HTTP_USER_AGENT]

Au moins tu n'aurais plus le problème des OS et moteur inconnu et tu ne dois plus te fatiguer à faire l'inventaire des browser/os. Pour ce qui est des différente versions de Windows (Win 95 ou Windows 95), c'est pas trop grave, car tu peux exploiter cela par après ou tout simplement te dire que cela correspondant à différente version (build, patch,...) de cet os particulier.

Je continue à regarder ton script + en détail.

bàt,
Pierre
The_Nick Messages postés 3 Date d'inscription jeudi 28 juillet 2005 Statut Membre Dernière intervention 23 décembre 2005
23 déc. 2005 à 01:00
Vivi, vrai... mais bon, perso je suis prêt a faire 10 lignes de code que je connais déjà au lieu de trouver une fonc. qui a elle seule fait ça. Je sais, c un peu con mais bon... :D
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
23 déc. 2005 à 00:35
"Ce script n'est pas destiné aux novices, et il vous sera très dur de modifier quelques fonctions dedans... Je ne le conseille qu'aux utilisateurs assez expérimentés"

o_Ô

Je ne vois pas où se trouve la prouesse technique qu'il faut déployer pour utiliser ce script... hormis peut être remplacer le if/elseif à ralonge par des tableaux comme la dit Samiby (qui seront bien plus propre et surtout rapide que des switch ou if/elseif)... .. .

Bon je n'ais pas vu le code en détail je ne le noterais donc pas mais faut pas éxagérer... .. .

@ tchaOo°
Samiby Messages postés 118 Date d'inscription mercredi 26 novembre 2003 Statut Membre Dernière intervention 2 janvier 2006
23 déc. 2005 à 00:20
Voire même mieux que des switchs: des array :
$liste_mois array('1'> 'Janvier', '2' => 'Février', ... );


// ... qques lignes plus tard

$date .= $liste_mois[$mois];

Pareil pour les jours ...

L'avantage de cette méthode, c'est que tu peux réutiliser le tableau. tu le déclare en global en début de script, puis tu l'appelle (via global) à chaque fonction qui l'utilise ;) .
cs_djmaster Messages postés 28 Date d'inscription vendredi 10 juin 2005 Statut Membre Dernière intervention 12 mai 2008
22 déc. 2005 à 22:55
Yaaaa tarpin long le code !

Je ne suis pas un expert, mais moi j'aurais plutôt fait des switch au lieu des elseif elseif consécutif.
Mis le CSS, dans un fichier .css et ajouter quelque include. Pour que le code soit plus clair.
Rejoignez-nous