2011-11-08 2 views
0

Quelque part sur le web j'ai vu un site qui a un script de base "like" pour les billets de blog. J'essaie de le reproduire, je suis juste un peu confus. Voici le code que j'ai pour le frontendComment stocker des votes avec des cookies dans PHP/JS

Javascript REQUIERT jquery

jQuery(document).ready(function() { 

function my_reloadLikes(who) { 
    var text = jQuery("#" + who).html(); 
    var patt= /(\d)+/; 

    var num = patt.exec(text); 
    num[0]++; 
    text = text.replace(patt,num[0]); 
    jQuery("#" + who).html('<span class="count">' + text + '</span>'); 
} //reloadLikes 


function my_likeInit() { 
    jQuery(".likeThis").click(function() { 
     var classes = jQuery(this).attr("class"); 
     classes = classes.split(" "); 

     if(classes[1] == "active") { 
      return false; 
     } 
     var classes = jQuery(this).addClass("active"); 
     var id = jQuery(this).attr("id"); 
     id = id.split("like-"); 
     jQuery.ajax({ 
      type: "POST", 
      url: "index.php", 
      data: "likepost=" + id[1], 
      success: my_reloadLikes("like-" + id[1]) 
     }); 


     return false; 
    }); 
} 

my_likeInit(); 

}); 

HTML

.like-count .icon { 
    background-position: 0 -19px; 
    width: 13px; 
    height: 11px; 
    float: left; 
    margin: 4px 5px 0 0; 
} 

.like-count a:hover .icon, 
.like-count a.active .icon { background-position: -15px -19px; } 

.like-count, 
.edit-post, 
.comment-count { 
    float: right; 
    margin: 0 0 0 10px; 
} 

<li class="like-count"> 
    <a href="#" class="likeThis active" id="like-356"> 
     <span class="count"><span class="icon"></span> 
     <span class="count">397</span></span> 
    </a> 
</li> 

Voici ce que j'ai recueilli jusqu'à présent ...

my_likeInit() fonction

  • Ajoute un cliquez sur l'événement à la classe .likeThis
  • Enregistre la classe CommeCeci à une variable
  • Splits la valeur de .likeThis s'il y a un « » espace, il vérifie pour voir s'il y a une « classe active » attachée à ou non
  • Si .active se trouve alors il meurt comme cela a été voté alread/aimé pour
  • Dans le cas contraire, il ajoute la classe .active à .likeThis
  • ensuite, il obtient l'id = comme- 123number
  • Divise et coupe la partie "like-" et obtient le numéro
  • Envoyez le numéro d'identification du script PHP comme « likepost = NUMBERHERE
  • En cas de succès de la demande AJAX, il exécute les my_reloadLikes() fonction, en passant de la valeur "comme-NUMBERHERE"

my_reloadLikes() fonction

  • je vais dans l'habitude, mais vous pouvez le voir, il trouve la div par numéro d'identification et ajoute le nombre et puis met à jour le numéro de la page

Quand je lance Firebug, sous Net/XHR je reçois ce,

têtes de demande
POST: likepost=811// dans ce cas, j'avais cliqué pour voter id 811 w3tc_referrer=http%3A%2F%2Ftest.testdomain.com%2F%3Ftheme%3Dtest; 795=795; 835=835; 832=832 C'est une sorte de cookie étant mis en place qui semble enregistrer l'identifiant de toutes les choses que je vote/j'aime.

têtes de réponse Set-Cookie 811=811; expires=Sat, 13-Jan-2807 11:04:20 GMT; path=/ Ici, je peux voir l'identification est définitivement en cours d'enregistrement à un cookie. Pour moi, il semble que ce serait son propre cookie, mais au-dessus, il montre plusieurs valeurs dans le cookie, alors sont-ils simplement ajoutés à la fin? Toutes les pièces d'identité sur lesquelles j'ai voté ci-dessus étaient sur la même page, peut-être un cookie par page, j'espère seulement 1 par site ...


C'est donc aussi loin que je suis, je suis essentiellement disséqué le code et je comprends bien tout ce qui précède, maintenant sur le back-end qui sera hors de ma tête et où je besoin d'aide

Ok, quand une page se charge, je vais remplir le nombre similaire à partir d'une base de données MySQL, je sais comment faire le backend d'ajouter les valeurs et obtenir les valeurs pour ce script. La partie cookie est où je suis un peu confus. Je viens de faire un autre test, je vois maintenant que le script enregistre chaque vote dans un cookie séparé, donc si je vote sur 100 éléments, j'ai 100 cookies pour ce site, cela ne semble pas correct?

Y a-t-il un meilleur moyen? Les cookies identifient si j'ai déjà voté et m'empêchent de voter à nouveau jusqu'à ce que mes cookies soient effacés. Ce sera sur un blog wordpress afin que les utilisateurs ne seront pas connectés, donc il n'y a pas beaucoup d'options en dehors de cookies et/ou adresse IP.

Questions

  1. est-il une meilleure façon de garder une trace des articles que j'ai voté/aimé au lieu d'un cookie pour chaque élément?
  2. Certains exemples de code PHP pour vérifier un cookie afin que je puisse ajouter une classe "active" aux éléments qui ont déjà voté (basé sur s'ils ont un cookie pour cela)
  3. Sur un blog wordpress, comment puis-je POST à ​​index.php? Likepost = 1234 ou suis-je mieux de simplement poster sur une page URI différente et faire une connexion DB manuellement au lieu d'utiliser les trucs wordpress?

========= Merci pour toute connaissance sur les questions de biscuits, je me rends compte que je peu rambled là-bas un peu.

+2

Pour répondre # 1, la sérialisation est un excellent moyen de stocker plusieurs entrées de données dans une entité. http://api.jquery.com/serializeArray/. Cependant, je ne ferais pas cela en utilisant des cookies - Ils peuvent être facilement modifiés par l'utilisateur et visser votre logique. – nickb

+0

Alors, comment recommanderiez-vous? Stocker dans DB? – JasonDavis

+0

Je recommande d'enregistrer des votes/aime dans DB. C'est la manière logique. Comme vous le savez, les cookies sont côté client. Vous devriez vérifier auprès de DB si l'utilisateur a voté ou non. – onatm

Répondre

1

Oui, certainement le faire dans la base de données. Comme je l'ai dit plus tôt, les cookies peuvent être modifiés et vraiment bousiller votre logique. Créer une table de base de données simple:

------------------------------- 
|   likes   | 
------------------------------- 
| like_id | post_id | user_id | 
------------------------------- 

Créer une clé primaire (incrémentation automatique) sur like_id, de sorte que vous pouvez facilement supprimer des lignes. Créez ensuite un index UNIQUE sur post_id, user_id, ce qui facilitera la concurrence de données car il est impossible pour un utilisateur d'aimer le même article plus d'une fois au niveau de la base de données. Toutefois, vous pouvez omettre like_id si vous préférez. Ce n'est pas nécessaire, et tout dépend de votre préférence.

Maintenant, vous pouvez interroger toute information dont vous avez besoin. Dites, le nombre de gens pour un poste:

SELECT COUNT(*) FROM likes WHERE post_id = $post_id 

ou pour déterminer si un utilisateur a aimé ce post:

SELECT like_id FROM likes WHERE post_id = $post_id AND user_id = $user_id 

Pour faire face au reste de vos questions:

  1. Comme je l'ai dit plus tôt, la sérialisation est une pratique courante et géniale pour stocker plusieurs entrées dans une entité. Essentiellement, vous enregistrez l'état d'un objet (ou d'un tableau) afin qu'il puisse être restauré plus tard. Cependant, si vous utilisez la base de données, vous n'aurez pas besoin de sérialiser un tableau/objet JS, mais il est bon de le savoir car il est pratique.
  2. Ajoutez une classe active basée sur une requête de la base de données, voir ci-dessus.
  3. Définitivement POST à ​​index.php? Likepost = 1234. Cela maintient un seul point d'entrée dans votre application, que WordPress vous fournit. Les avantages pour cela sont évidents - Laissez WordPress configurer votre connexion à la base de données et vous fournir toutes les fonctionnalités dont vous avez besoin au lieu de réinventer la roue.
+0

merci pour les conseils, ma principale raison pour considérer la version cookie était parce qu'il n'y a pas user_id, tous les spectateurs sont invités, de sorte que le seul moyen serait d'utiliser IP qui, comme vous le savez, n'est pas la meilleure solution – JasonDavis

+0

Pour ce faire, utilisez des cookies uniquement pour les invités et ne laissez pas leurs goûts affecter la base de données. Alors, qui s'en soucie s'ils gâchent les cookies, ils ne font que jouer avec l'écran de leur côté. Gardez juste à l'esprit lorsque vous créez la partie cookie que vous ne pouvez pas croire que le cookie n'est pas modifié par l'utilisateur. – nickb

Questions connexes