如何使用PHP / JS中的cookie存储投票

时间:2011-11-08 01:31:45

标签: php javascript jquery

在网络的某个地方,我看到一个网站上有一个基本的“喜欢”的博客文章脚本。

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

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,那么它就会因为已经被投票/喜欢而死亡 对
  • 如果没有,则将.active类添加到.likeThis
  • 然后它获得id = like-123number
  • 拆分并剪切“喜欢”部分并获取数字
  • 将ID号作为“likepost = NUM​​BERHERE
  • ”发送到PHP脚本
  • 从AJAX请求成功,它运行my_reloadLikes() 函数,传入值“like-NUMBERHERE”

my_reloadLikes()函数

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

当我运行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中。对我而言,它看起来像是OWN cookie,但是在它上面显示了cookie中的多个值,所以它们只是附加到结尾了吗?我在上面投票的所有ID都在同一页面上,可能是每页1个cookie,希望每个站点只有1个...


就我而言,我基本上已经解剖了代码,我完全理解了上面的所有内容,现在在后端,这将是我的头脑和我需要帮助的地方

好的,当页面加载时,我将从MySQL数据库填充类似的数量,我知道如何添加值并获取此脚本的值的后端。饼干部分是我有点困惑的地方。

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

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

问题

  1. 有没有更好的方法来跟踪我投票/喜欢的项目而不是每个项目的Cookie?
  2. 一些示例PHP代码用于检查cookie,因此我可以为已经投票的项目添加“活动”类(基于它们是否有cookie)
  3. 在wordpress博客上,如何发布到index.php?likepost = 1234或者我最好只是发布到不同的URI页面并手动进行数据库连接而不是使用wordpress的东西?
  4. ====== 感谢您对cookie问题的任何见解,我意识到我有点絮絮叨叨。

1 个答案:

答案 0 :(得分:1)

是的,绝对是在数据库中这样做的。正如我之前所说,cookie可以被修改,并且真正搞砸了你的逻辑。创建一个简单的数据库表:

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

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

但是,如果您愿意,可以省略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. 正如我之前所说,序列化是在一个实体中存储多个条目的常见且很好的做法。基本上,您正在保存对象(或数组)的状态,以便以后可以恢复它。但是,如果使用数据库,则不需要序列化JS数组/对象,但最好知道它是否派上用场。
  2. 根据数据库中的查询添加活动类,参见上文。
  3. 绝对POST到index.php?likepost = 1234。这为您的应用程序保留了一个入口点,WordPress为您提供了这个入口点。这样做的好处是显而易见的 - 让WordPress设置与数据库的连接,为您提供所需的所有功能,而不是重新发明轮子。