[PHP] Nombre de fois que l'article est lu

Résolu/Fermé
Signaler
Messages postés
710
Date d'inscription
jeudi 19 avril 2007
Statut
Membre
Dernière intervention
10 juin 2014
-
Messages postés
710
Date d'inscription
jeudi 19 avril 2007
Statut
Membre
Dernière intervention
10 juin 2014
-
Bonjour,
je fait un blog en PHP, et je voudrais indiquer le nombre de personne qui a lu un article avec une petite note "lu X fois". je stock la variable du nombre de personne dans une base de donnée. Lorsque quelqu'un lis l'article, j'ajoute 1 a ma variable. Le problème est que une même personne peux lire 50 fois le même article, la variable va être incrémenté 50 fois, alors que je ne souhaiterais pas qu'une même personne puisse faire cela. pour éviter cela, j'ai penser a utiliser la fonction session() de php. je ne sais pas si c'est une bonne solution. et si sa l'es j'ai du mal a utiliser, la plupart des exemple qui sont sur le net parle de mettre le nom d'une session dans la variable session. mais mon site ne propose pas aux gens d'utilisation de session (pas de pseudo/mot de passe). pourriez vous me dire si ma solution est bonne, et si non, comment je peux faire SVP?
Merci.

8 réponses

Messages postés
18620
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
5 décembre 2021
4 340
Il suffit de stocker l'IP des articles consultés dans une variable de session. Cette variable serait un array.

/*
    $idarticle = Identifiant de l'article dans la table
    $nb_lecture = Nombre de lectures avant le chargement de la page
*/

if(!array_key_exists($idarticle, $_SESSION['articles_lus']) {
    $_SESSION[articles_lus'][] = $idarticle;
    
    $sql = 'UPDATE 'articles' SET 'nb_lecture'='.intval($nblecture++).' WHERE 'id'='.$idarticle;
    // ...
}
2
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 41989 internautes nous ont dit merci ce mois-ci

Messages postés
18620
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
5 décembre 2021
4 340
Crées une table "lectures" avec 2 champs :
ip (INT) : contient l'IP convertie en INT avec ip2long()
article_id (même type que le champ 'id'de ta table 'articles') : contient tout simplement l'id de l'article.

Ensuite, il te suffit de compter le nombre d'entrée "WHERE ip = ip2long($ip) AND article_id = $article_id" : S'il y en a 1, alors tu fais une requête INSERT INTO.
Messages postés
710
Date d'inscription
jeudi 19 avril 2007
Statut
Membre
Dernière intervention
10 juin 2014
116
l'idée est bonne! mais est ce que c'est pas un système qui risquerais de remplir ma base de donnée à la longue?
Messages postés
18620
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
5 décembre 2021
4 340
Si, mais il n'y a pas vraiment d'autre solution car il faut bien stocker l'IP quelque-part et l'ID de l'article consulté.
Il y a aussi une technique avec les sessions mais une session est perdue à la fermeture du navigateur.
Ou bien les cookies ... mais ça risque de faire beaucoup.
Messages postés
710
Date d'inscription
jeudi 19 avril 2007
Statut
Membre
Dernière intervention
10 juin 2014
116
en faite, ce que je veux éviter, c'est qu'un utilisateur lambda (qui ne connais donc rien aux sessions) ne puisse cliquer sur un article pour faire monter les stats trop facilement. il faut connaitre le fonctionnement des session pour penser a fermer et ouvrir le navigateur pour modifié les stats. c'est pour sa que j'ai penser aux session. mais je ne sais pas bien comment l'utiliser. j'ai bien mis mon <?php session_start(); ?> avant le début de mon code html. je ne sais pas comment savoir si la session est ouverte ou non.
Messages postés
710
Date d'inscription
jeudi 19 avril 2007
Statut
Membre
Dernière intervention
10 juin 2014
116
j'essaye de décrire le code. je ne connais pas array_key_exists(), j'ai donc fait la recherche :
array_key_exists() retourne TRUE s'il existe une clé du nom de key dans le tableau search . key peut être n'importe quelle valeur valide d'index de tableau.
donc, sa donne :
si il ne trouve pas $idarticle dans la variable global $_SESSION['articles_lus'], il met l'id de l'article dans $_SESSION['articles_lus'].
puis il met a jour la valeur dans la base de donnée.
je pense avoir compris, je test donc avec ce code :
/*
$id = Identifiant de l'article dans la table
*/

if(!array_key_exists($id, $_SESSION['articles_lus'])) {
$_SESSION['articles_lus'][] = $id;

echo "article pas encore lu";
}
else {
echo "article lu";
}
mais j'ai toujours "article pas encore lu" qui s'affiche.
ou est mon erreur?
Merci
Messages postés
29
Date d'inscription
dimanche 16 mars 2008
Statut
Membre
Dernière intervention
26 avril 2010
2
Peut etre que je me trompe et je dit des betises mais il me semble qu'il faut un session_start();
avant

Voila,
Messages postés
710
Date d'inscription
jeudi 19 avril 2007
Statut
Membre
Dernière intervention
10 juin 2014
116
merci de ta réponse, mais comme je l'ai mis plus haut :
"j'ai bien mis mon <?php session_start(); ?> avant le début de mon code html. je ne sais pas comment savoir si la session est ouverte ou non."
le problème n'est donc malheureusement pas la.
merci quand même! ^^