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

Résolu/Fermé
zimeau Messages postés 710 Date d'inscription jeudi 19 avril 2007 Statut Membre Dernière intervention 10 juin 2014 - 11 mars 2010 à 19:57
zimeau Messages postés 710 Date d'inscription jeudi 19 avril 2007 Statut Membre Dernière intervention 10 juin 2014 - 11 mars 2010 à 23:03
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

avion-f16 Messages postés 19244 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 17 avril 2024 4 496
11 mars 2010 à 21:56
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
avion-f16 Messages postés 19244 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 17 avril 2024 4 496
11 mars 2010 à 20:10
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.
0
zimeau Messages postés 710 Date d'inscription jeudi 19 avril 2007 Statut Membre Dernière intervention 10 juin 2014 117
11 mars 2010 à 20:48
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?
0
avion-f16 Messages postés 19244 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 17 avril 2024 4 496
11 mars 2010 à 21:09
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
zimeau Messages postés 710 Date d'inscription jeudi 19 avril 2007 Statut Membre Dernière intervention 10 juin 2014 117
11 mars 2010 à 21:24
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.
0
zimeau Messages postés 710 Date d'inscription jeudi 19 avril 2007 Statut Membre Dernière intervention 10 juin 2014 117
11 mars 2010 à 22:37
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
0
loulou8484 Messages postés 29 Date d'inscription dimanche 16 mars 2008 Statut Membre Dernière intervention 26 avril 2010 2
11 mars 2010 à 22:55
Peut etre que je me trompe et je dit des betises mais il me semble qu'il faut un session_start();
avant

Voila,
0
zimeau Messages postés 710 Date d'inscription jeudi 19 avril 2007 Statut Membre Dernière intervention 10 juin 2014 117
11 mars 2010 à 23:03
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! ^^
0