使用 cookie 更新独特的视图
Updating unique views using 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 是否太多了。这样可以吗,或者有更好的方法吗?
即使有可能,那也是一种资源浪费。例如,您应该使用 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中获取数据添加新的Id用 push 然后用 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));;
在任何情况下,cookie 都是 HTTP 协议的一部分,并且随着每个 HTTP 请求通过网络发送,并且由于请求有大小限制,在某个时候它会超过该大小并将导致浏览器行为不一致,无论您使用许多小 cookie 还是一个大 cookie。
我会选择 cookie 以外的解决方案 - 很可能我会在服务器端保留它
我有一个论坛线程文件 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 是否太多了。这样可以吗,或者有更好的方法吗?
即使有可能,那也是一种资源浪费。例如,您应该使用 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中获取数据添加新的Id用 push 然后用 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));;
在任何情况下,cookie 都是 HTTP 协议的一部分,并且随着每个 HTTP 请求通过网络发送,并且由于请求有大小限制,在某个时候它会超过该大小并将导致浏览器行为不一致,无论您使用许多小 cookie 还是一个大 cookie。
我会选择 cookie 以外的解决方案 - 很可能我会在服务器端保留它