【问题标题】:Updating unique views using cookies使用 cookie 更新唯一视图
【发布时间】:2015-08-13 18:28:37
【问题描述】:

我有一个论坛主题文件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 是否太多。可以吗?或者有更好的方法吗?

【问题讨论】:

    标签: javascript php cookies


    【解决方案1】:

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

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

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

    然后就可以用JSON.parse获取数据了:

    var topicsId_array = JSON.parse($.cookie("cookie_name"));
    

    请记住,您可以使用 push JS 方法将元素添加到数组 (http://www.w3schools.com/jsref/jsref_push.asp),这样您就可以从 cookie 中获取数据,并使用 push 添加新的 Id,然后使用字符串化。

    最后,您应该注意重复项。使用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));;
    

    【讨论】:

    • 只是一个问题 - 因为它需要检查 topicId 是否在那个大 cookie 中设置了值“1”,并且实际上还需要存储 cookie 值“1”,我将如何这样做并设置 if 语句?
    • 好的,对我来说,如果你只想保存访问过的主题,你应该使用像 var topicsId_array = [1, 2, 4, 26]; 这样的 id 数组(简单高效),因此在数组中只应保留设置为 1 的主题(并删除其他主题)。但是,如果您的情况并非如此,并且您需要存储其他数据(例如视图数量或其他任何内容),您可以使用对象数组并存储您想要的所有内容。 Stringify 也可以很好地工作。这里有一个例子:http://jsfiddle.net/y11zLra7
    【解决方案2】:

    在任何情况下,cookie 都是 HTTP 协议的一部分,并且通过网络与每个 HTTP 请求一起发送,并且由于请求有大小限制,在某个点它会超过该大小并导致不一致浏览器行为,无论您使用许多小 cookie 还是一个大 cookie。

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

    【讨论】:

      猜你喜欢
      • 2021-12-17
      • 1970-01-01
      • 2016-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多