如何在PHP/JS中使用Cookie存储投票


How to store votes with cookies in PHP/JS

在网上的某个地方,我看到一个网站有一个基本的博客文章"赞"脚本。

我正在尝试复制它,我只是有点困惑。这是我的前端代码

Javascript,需要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>

以下是我迄今为止收集到的。。。

my_likeInit((函数

  • 将单击事件添加到.likeThis类
  • 将likeThis类保存到变量
  • 拆分的值。like如果有"空格,则它正在检查查看是否有"活动"类附加到它
  • 如果找到.active,它就会死亡,因为它已经被投票/点赞for
  • 如果没有,它会将.active类添加到.likeThis
  • 然后它得到id=like-123数字
  • 将其拆分并剪切"赞"部分,得到数字
  • 以"likepost=NUMBERHERE"的形式将id号发送到PHP脚本
  • AJAX请求成功后,它将运行my_reloadLikes((函数,传入值"like NUMBERHERE">

my_reloadLikes((函数

  • 我不会深入研究,但你可以看到,它通过ID号和添加号码,然后更新页面上的号码

当我运行firebug时,在Net/XHR下,我得到了这个,

请求标头
POST: likepost=811//在这种情况下,我点击了对id 811的投票w3tc_referrer=http%3A%2F%2Ftest.testdomain.com%2F%3Ftheme%3Dtest; 795=795; 835=835; 832=832这是正在设置的某种cookie,似乎可以保存我投票/喜欢的所有东西的id。

响应标头Set-Cookie 811=811; expires=Sat, 13-Jan-2807 11:04:20 GMT; path=/在这里,我可以看到id确实被保存到了cookie中。对我来说,这看起来像是它自己的cookie,但上面显示了cookie中的多个值,所以它们只是附加到末尾吗?我上面投票的所有ID都在同一个页面上,可能是每页1个cookie,希望每个网站只有1个。。。


就我而言,我基本上已经分析了代码,我完全理解了上面的一切,现在在后端,这将是我无法想象的,我需要的帮助

好的,当一个页面加载时,我会从MySQL数据库中填充类似的计数,我知道如何为这个脚本添加值和获取值。饼干部分是我有点困惑的地方。

我刚刚做了另一个测试,我现在看到脚本确实将每个投票保存到一个单独的cookie中,所以如果我对100个项目进行投票,我有100个该网站的cookie,这似乎不对吗?

有更好的方法吗?Cookie会识别我是否已经投票,并阻止我再次投票,直到我的Cookie被清除。这将出现在wordpress博客上,因此用户不会登录,因此除了cookie和/或IP地址之外,没有太多选项。

问题

  1. 有没有更好的方法来跟踪我投票/喜欢的项目,而不是每个项目的cookie
  2. 一些用于检查cookie的示例PHP代码,这样我就可以向已经投票的项目添加一个"活动"类(取决于他们是否有cookie(
  3. 在wordpress博客上,我如何发布到index.php?likepost=1234还是我更适合发布到另一个URI页面,手动进行DB连接,而不是使用wordpress的东西

=========谢谢你对饼干问题的任何见解,我意识到我有点漫无边际。

是的,一定要在数据库中执行此操作。正如我之前所说的,cookie可以被修改,这真的会打乱你的逻辑。创建一个简单的数据库表:

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

like_id上创建主键(自动递增(,这样就可以轻松地删除行。然后在post_id, user_id上创建一个UNIQUE索引,这将有助于数据并发,因为用户不可能在数据库级别多次喜欢同一篇文章。

但是,如果您愿意,可以省略like_id。这不是必要的,完全取决于你的喜好。

现在,您可以查询出所需的任何信息。比如说,一个帖子的点赞数量:

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

或者确定用户是否喜欢这篇文章:

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

解决您的其他问题:

  1. 正如我前面所说,序列化是将多个条目存储在一个实体中的一种常见且非常好的做法。本质上,您是在保存对象(或数组(的状态,以便以后可以恢复它。然而,如果您使用DB,则不需要序列化JS数组/对象,但了解它很有用
  2. 根据数据库中的查询添加活动类,请参见上文
  3. 肯定是POST到index.php?likepost=1234。这为WordPress为您提供的应用程序维护了一个单一的入口点。这样做的好处是显而易见的——让WordPress设置你与数据库的连接,并为你提供所需的所有功能,而不是重新发明轮子