Compter le nombre de fois ou une page a été vue

  • Auteur de la discussion Auteur de la discussion fabrice88
  • Date de début Date de début
WRInaute occasionnel
Bonjour,
en parralele avec mon autre message sur ce forum je voudrait savoir comment faire pour compté le nombre de fois ou un sujet de mon forum aura été vue apr les internautes ?
J'imaginai faire comme ceci : dans ma table forum_sujet, je rajoute un nouveau champ que je nomme 'vues'.
ensuite lorsq'un internaute clique sur un sujet pour voir son detail je cré un compteur qui ajoute +1 a chaque ouverture du sujet.

Est ce que l'idée est bonne ou est ce qu'il faut procéder autrement ?
 
WRInaute occasionnel
En effet tu n'as guerre le choix, et puis la plupart des compteurs sont fait ainsi, après tu peux gérer au niveau des ip pour ne pas compter plusieurs fois la meme page vu au meme utilisateur
 
WRInaute occasionnel
ok merci bon alors voilà se que je fais :
Code:
	//création de la requête SQL:  
	$sqlvue = "UPDATE forum_sujets SET vue = $vue+1 WHERE id = ".$_GET['id_sujet_a_lire'];  
	$reqvue = mysql_query($sqlvue);

lors de la toute premiere ouverture de la page j'ai bien l'incrementation du + 1 qui se fait et j'ai donc mon champ vue qui prend la valeur de 1 au lieu de 0.
par contre apres sa ne fonctionne plus. si je retourne sur la meme page mon champ vue n'est plus incrémenté il reste à 1.
:?
 
WRInaute accro
fabrice88 a dit:
ok merci bon alors voilà se que je fais :
Code:
	//création de la requête SQL:  
	$sqlvue = "UPDATE forum_sujets SET vue = $vue+1 WHERE id = ".$_GET['id_sujet_a_lire'];  
	$reqvue = mysql_query($sqlvue);

lors de la toute premiere ouverture de la page j'ai bien l'incrementation du + 1 qui se fait et j'ai donc mon champ vue qui prend la valeur de 1 au lieu de 0.
par contre apres sa ne fonctionne plus. si je retourne sur la meme page mon champ vue n'est plus incrémenté il reste à 1.
:?

C'est le "$vue" qui semble bizarre, je sais pas ce qu'il contient, ça devrait plutôt être:

Code:
	//création de la requête SQL:  
	$sqlvue = "UPDATE forum_sujets SET vue = vue+1 WHERE id = ".$_GET['id_sujet_a_lire'];  
	$reqvue = mysql_query($sqlvue);
 
WRInaute occasionnel
Euh Spout a raison d'une part, d'autre part attention a la sécurité o_O, ne met jamais un GET pas traité dans une requête SQL !

Si il s'agit d'un nombre, vérifie le avec un is_numeric, ou au moins met un addslashes($_GET['..']) sinon tu risques d'avoir des problèmes :)

Bon courage !
 
WRInaute accro
Pour éviter les comptages multiples il y a un moyen simple (mais pas infaillible):
- Quand un comptage est fait, envoyer un cookie vers le navigateur du visiteur.
- Sauvegarder la dernière IP qui a incrémenté le compteur.
- Avant chaque incrémentation du compteur, vérifier si cookie et si pas la même IP.

Si un petit malin supprime les cookies, il est encore bloqué par la dernière IP.
La faille c'est si le visiteur change d'IP et supprime ses cookies, mais c'est quand même beaucoup mieux que sans vérification.

Edit: oui j'ai pas fait gaffe, il faut évidement bien vérifier le contenu du _GET avant de le transmettre à la requête.
Avec mysql_real_escape_string() http://php.net/manual/fr/function.mysql-real-escape-string.php au lieu de addslashes()
 
WRInaute occasionnel
ok donc si je met en tout debut de ma page :
Code:
$id_sujet_a_lire = mysql_real_escape_string($_GET['id_sujet_a_lire']);
C'est ok ?
 
WRInaute occasionnel
ok merci. alors du coup dès que j'intégre des données dans ma base sql je doit mettre mysql_real_escape_string().

Est ce que dans le cas de la requete ci dessous je doit la modifié :

Code:
$sql = 'INSERT INTO forum_reponses VALUES("", "'.$_POST['auteur'].'", "'.$_POST['message'].'", "'.$date.'", "'.$_GET['numero_du_sujet'].'")';

pour (mais sa va être long si y'a beaucoup de champs a remplir...):
Code:
$auteur = mysql_real_escape_string($_POST['auteur']);
$message= mysql_real_escape_string($_POST['message']);
$date = mysql_real_escape_string($_POST['date']);
$numero_du_sujet = mysql_real_escape_string($_GET['numero_du_sujet']);

$sql = 'INSERT INTO forum_reponses VALUES("", "'.$auteur.'", "'.$message.'", "'.$date.'", "'.$numero_du_sujet.'")';
 
WRInaute accro
NB: tu as pensé que chaque crawl de GoogleBot, Mediapartners, Slurp! et ses amis va faire une comptabilisation de plus ? :roll:
 
WRInaute impliqué
Et si tu as de nombreuses pages vues par jours, ca va te faire un sacré nombre de requêtes SQL !
 
WRInaute occasionnel
NB: tu as pensé que chaque crawl de GoogleBot, Mediapartners, Slurp! et ses amis va faire une comptabilisation de plus ?

Comprend pas...
Ah oui ok j'ai compris. Eh bien comment faire pour ne pas les comptabiliser ?
 
WRInaute accro
Il te faut t'ecrire une petite routine isbot.php pour les detecter et ne pas les compter ou les compter dans un compteur séparé.
 
WRInaute accro
hyadex a dit:
Et si tu as de nombreuses pages vues par jours, ca va te faire un sacré nombre de requêtes SQL !
Une solution que j'ai testé a grande echelle : stocker les infos dans des fichiers .txt (pas de problemes d'accès concurrents donc les .txt vont tres bien et c'est autant de charge en moins pour la base mysql). En plus en optimisant bien le truc tu peux faire une routine ultra rapide qui va acéder en accès direct au 4 ou 5 octets qui te servent au comptage pour chaque page, même si tu suis 100.000 pages web ... et ca sera dans tous les cas moins gourmand que mysql à mon avis.

Note : et si vraiment tu veux optimiser a donf, tu compte en utilisant les 8 bits et donc 2 octets suffisent par page (merci jcaron pour son aide sur les bits .... dans un autre topic).
 
Discussions similaires
Haut