2010-03-22 2 views
2

Je dois mettre en place un système "vu".système "visualisé" - une fois par utilisateur

Comment cela peut-il être fait, de sorte que l'appui sur F5 n'augmente pas le nombre de vues pour plus de 1 par utilisateur?

SO a également un tel système.

Cookies, sessions, db? Comment cela se fait-il habituellement?

Répondre

3

Vous aurez besoin d'une combinaison de technologies ici. Chaque utilisateur doit être identifié de manière unique (en utilisant des sessions, des cookies, tout ce qui fonctionne le mieux dans votre scénario). À partir de là, vous devrez maintenir une base de données de résultats pour un article avec la clé unique de l'utilisateur (stockée dans son cookie ou session ou autre).

Lorsque l'utilisateur accède à la page, vérifiez la base de données pour voir si la clé unique de cet utilisateur a déjà un hit sur cette page. Sinon, ajoutez-le. Peu importe, une fois terminé, tirez le nombre total de visites que l'élément a eu de la base de données. Tah dah.

+0

db devrait enregistrer toutes les clés uniques de l'utilisateur qui ont vu cette page? – Qiao

+0

Mhm. Une ligne se compose d'un ID pour la page que vous suivez et de la clé unique de l'utilisateur qui l'a visitée. – Matchu

1

magasin juste dans votre base de données user_id, resource_id (éventuellement timestamp) et avant d'augmenter viewed vérification de valeur que SQL comme ceci:

SELECT COUNT(*) FROM ... WHERE user_id = ? AND resource_id = ? (AND timestamp > NOW() - 7 DAYS or sth) 

ne retourne pas 1.

+0

vous voulez dire table séparée pour les besoins visualisés? – Qiao

+0

Oui. (+10 caractères pour ajouter un commentaire:]) – Crozin

0

Cela dépend beaucoup de la situation. Par exemple, si chaque utilisateur est connecté avec un ID utilisateur, il serait très différent si vous faites une page d'accueil où les utilisateurs ne sont pas censés être connectés.

Je suppose que vous êtes dans la dernière catégorie et que les utilisateurs ne sont pas connectés à votre page. Si tel était le cas, je recommande un cookie en utilisant la commande setcookie, cela pourrait se faire comme ceci:

if (empty($_COOKIE['hasViewed'])) { 
    //increment the total number of views in the 
    //database or wherever we are storing it. 
    $viewer->incrementViews(); 
} 
//make sure they have a cookie for next time 
setcookie("hasViewed", "1", time() + 60*60*24*30); 

Notez que dans cet exemple, l'utilisateur serait en mesure de faire votre point de vue d'augmenter à nouveau si ils n'ont pas vu la page dans 30 jours.

+0

mais s'il y a beaucoup de pages à voir ... – Qiao

+0

Incluez un hash du nom de la page (ou un autre moyen d'identifier la page) dans le cookie. –

+1

@Qiao Si c'est le cas, je vous recommande de le stocker dans la session, car si vous pouvez le gérer en envoyant des cookies, ils deviendront peu maniables après un certain temps. Assurez-vous que vos sessions n'expirent pas trop tôt, sinon vous devrez configurer une solution plus complexe. –

Questions connexes