compteur de visites

Invité
Invité n'ayant pas de compte PHPfrance

19 mars 2007, 17:39

J'aimerais faire un compteur qui ne compte les pages qu'après un certain délai (pour éviter aussi le "reload" ou actualisation), tout en enregistrant l'ip du client et l'heure de la connexion.

J'ai fait le code suivant. Au début ça marchait, puis ça a commencé à incrementer le compteur à chaque clic sur "reload".

$connexion=mysql_connect("...","...","...");
mysql_select_db("...");
$delai=300;
$maintenant=time();
$adresse_ip=$_SERVER['REMOTE_ADDR'];

$res=mysql_query("SELECT * FROM compteur WHERE ip=' ".$_SERVER['REMOTE_ADDR']." ' ");

$row=mysql_fetch_array($res);
    if($row['ip']="") {
mysql_query("INSERT INTO compteur (ip, temps) VALUES  (' ".$_SERVER['REMOTE_ADDR']." ',' ".time()." ' ");
mysql_query('UPDATE compteur SET nombre=nombre+1 WHERE id=1');
}
else {
       if (time()-$row['temps'] < $delai) {
mysql_query("UPDATE compteur SET temps = ' ".time()." ' WHERE ip=' ".$_SERVER['REMOTE_ADDR']. " ' ");
}
else {
       mysql_query('UPDATE compteur SET nombre = nombre+1 WHERE  id=1');
       mysql_query("UPDATE compteur SET temps = ' " .time(). " ' WHERE ip = ' " .$_SERVER['REMOTE_ADDR']." ' ");
}
}

$sql="SELECT * FROM compteur WHERE id=1";
$result=mysql_query($sql);
$row2 = mysql_fetch_assoc($result);

echo "compteur= ".$row2['nombre'];

Qu'est-ce qui ne marche pas dans ce compteur?
Qq'un peut - il m'aider SVP ! Grand merçi.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

19 mars 2007, 23:13

Alors, tout d'abord, penses bien à l'incrémentation et au commentaires, c'est super important pour la lisibilité et la maintenance, particulièrement sur un forum ;)

Ensuite, j'ai remarqué quelques points que je ne comprend pas ... cf //--- CONSEIL --- dans le code

Sinon, voici un exemple ré-indenté et commenté selon ce que j'en ai compris
<?php

// Connexion à la base de données
$connexion = mysql_connect("...","...","...");
mysql_select_db("...");

//Récupération des données
$delai 			= 300;
$maintenant 	= time();
$adresse_ip 	= $_SERVER['REMOTE_ADDR'];


//Vérification de la présence de cette IP dans le compteur
//--- CONSEIL --- Il faut éviter le SELECT * ...
$res = mysql_query("SELECT * FROM compteur WHERE ip=' ".$_SERVER['REMOTE_ADDR']." ' ");
$row = mysql_fetch_array($res);

//Si cette IP n'existe pas, INSERTION
//--- CONSEIL --- Quelle est l'utilité de la comparaison avec le champ "ip", préférer mysql_num_rows() ?
if ( $row['ip'] = "" ) {

	//--- CONSEIL --- Pourquoi un INSERT suivi d'un UPDATE dans la meme table ???
	mysql_query("INSERT INTO compteur (ip, temps) VALUES  ('".$_SERVER['REMOTE_ADDR']."', '".time()."'");
	mysql_query('UPDATE compteur SET nombre = nombre + 1 WHERE id = 1');

// Cette IP existe dans la table
} else {
	
	//Si la temporisation n'est pas écoulée, mise à jour du dernier accès
	if ( (time() - $row['temps']) < $delai) {

		mysql_query("UPDATE compteur SET temps = '".time()."' WHERE ip = '".$_SERVER['REMOTE_ADDR']. "'");

	//Si la temporisation est écoulée, incrémentation du nombre de visites
	} else {

		mysql_query('UPDATE compteur SET nombre = nombre + 1 WHERE id = 1');
		mysql_query("UPDATE compteur SET temps = '" .time(). "' WHERE ip = '" .$_SERVER['REMOTE_ADDR']."'");

	}
}

//Vérification du compteur
$sql = "SELECT * FROM compteur WHERE id = 1";
$result = mysql_query($sql);
$row2 = mysql_fetch_assoc($result);

echo "compteur= ".$row2['nombre']; 

?>
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

Eléphant du PHP | 445 Messages

20 mars 2007, 02:28

Alors, tout d'abord, penses bien à l'incrémentation et au commentaires, c'est super important pour la lisibilité et la maintenance, particulièrement sur un forum ;)
Je pense que notre ami Zeus a voulu dire "Indentation" et non "Incrémentation" :)
LLDC
Ulti

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

20 mars 2007, 09:19

Je pense que notre ami Zeus a voulu dire "Indentation" et non "Incrémentation" :)
Oui, bon d'accord ... 8-|

Bien vu :pouce:
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