使用Cookie更新唯一视图

时间:2015-05-31 05:23:03

标签: javascript php cookies

我有一个论坛帖子文件thread.php,可以获取主题ID信息。

示例:

thread.php?id=781

我试图创建一个独特的视图设置,但我不知道这是否真的可行:

thread.php

topicId = <?php echo $_GET['id']; ?>;

if ($.cookie("unique"+topicId)!=="1") {
    $.cookie("unique"+topicId,1,{expires: 1000, path: '/'}); // create cookie if it doesn't exist
    $.post('unique.php',{id:topicId}); // update thread unique views
}

unique.php

// connection stuff

$id = mysqli_real_escape_string($conn,$_POST['id']);
mysqli_query($conn,"UPDATE topics SET unique_views=unique_views+1 WHERE id='$id'");

这将为每个不同的线程创建一个新的cookie。因此,如果用户查看100个线程,他们将存储100个cookie。我担心如果为每个线程创建一个新的cookie太多了。这样可以,还是有更好的方法呢?

2 个答案:

答案 0 :(得分:3)

即使可能,也浪费资源。例如,您应该使用JSON将数据序列化为单个cookie。

在Javascript中,您可以使用 JSON.stringify 将主题数组编码为JSON字符串:

$.cookie("cookie_name", JSON.stringify(topicsId_array));

然后您可以使用 JSON.parse

获取数据
var topicsId_array = JSON.parse($.cookie("cookie_name"));

请记住,您可以使用推送 JS方法将元素添加到数组(http://www.w3schools.com/jsref/jsref_push.asp),这样您就可以从cookie中获取数据,然后使用push添加新ID,然后保存它与stringify。

要完成,你应该关心重复。如果您在使用push时不想要它们,可以使用https://api.jquery.com/jQuery.unique/清除数组或使用自己的JS函数,例如:

function unique(array_source)
{
    var array_destination = [];
    var found = false;
    var x, y;

    for (x=0; x<array_source.length; x++)
    {
        found = false;
        for (y=0; y<array_destination.length; y++)
        {
            if (array_source[x] === array_destination[y])
            {
              found = true;
              break;
            }
        }
        if (!found)
        {
            array_destination.push(array_source[x]);
        }
    }
   return array_destination;
}

var topicsId_array = ['aaa', 'bbb', 'ccc', 'aaa'];
topicsId_array = unique(topicsId_array);

最后,这样的事情应该有效:

var topicsId_array = JSON.parse($.cookie("cookie_name"))
topicsId_array.push("your_new_id");
topicsId_array = $.unique(topicsId_array);
$.cookie("cookie_name", JSON.stringify(topicsId_array));;

答案 1 :(得分:0)

在任何情况下,cookie都是HTTP协议的一部分,并且每次HTTP请求都通过线路发送,并且由于请求具有大小限制,因此在某个点上它将超过该大小并且将导致不一致浏览器行为,无论你使用多少小cookie或一个大cookie。

我会选择除cookie以外的解决方案 - 我很可能会将其保留在服务器端