[PHP] Nombre de fois que l'article est lu
Résolu
zimeau
Messages postés
711
Date d'inscription
Statut
Membre
Dernière intervention
-
zimeau Messages postés 711 Date d'inscription Statut Membre Dernière intervention -
zimeau Messages postés 711 Date d'inscription Statut Membre Dernière intervention -
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.
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.
A voir également:
- [PHP] Nombre de fois que l'article est lu
- Nombre de jours entre deux dates excel - Guide
- Nombre facile - Télécharger - Outils professionnels
- Nous limitons le nombre de fois que vous pouvez publier ✓ - Forum Facebook
- Whatsapp message lu mais pas bleu - Guide
- Messenger message distribué mais pas lu ✓ - Forum Facebook Messenger
8 réponses
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; // ... }
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.
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.
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?
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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.
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
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
Peut etre que je me trompe et je dit des betises mais il me semble qu'il faut un session_start();
avant
Voila,
avant
Voila,