我有这段代码:
$id = $_GET['id'];
mysql_query("UPDATE threads SET views = views + 1 WHERE id = '$id'");
但是当我点击刷新时,每次刷新时计数器都会增加。
如何通过会话或任何其他方式保护此计数器?
答案 0 :(得分:1)
您可以使用(hasBeenCounted)设置会话变量,如果已设置,则不会增加。
if(!isset($_SESSION['hasBeenCounted'])
{
$id = $_GET['id'];
mysql_query("UPDATE threads SET views = views + 1 WHERE id = '$id'");
$_SESSION['hasBeenCounted'] = "counted";
}
编辑:
session_start():
将需要位于您打算使用会话的任何页面的最顶层。
答案 1 :(得分:0)
执行此操作的一种方法是使用会话。但是,最终,这不是真正的可扩展性。当用户浏览您的站点时,您可能会拥有一个庞大的会话文件。此外,每次用户创建新会话时,您都会记录该视图。
如果您只想为单个用户录制单个视图,则需要存储该用户查看该线程的内容。根据您的网站是否仅允许登录用户查看线程,或者您的网站是否向公众开放,您必须在单独的表中存储关于每个用户的独特内容,结构类似于此(您的里程会因字段类型):
CREATE TABLE `thread_views` ( `id` INT( 10 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , `thread_id` INT( 10 ) UNSIGNED NOT NULL , `user_id` INT( 10 ) UNSIGNED NOT NULL , `ts` TIMESTAMP NOT NULL )
每次用户查看该主题时,您都需要检查此表。如果thread_views
中没有记录,请插入一个,并在views
表中增加threads
列。如果thread_views
中有一行,那么您就知道用户已经查看了该帖子。
答案 2 :(得分:0)
我认为使用cookies的会话是你最好的选择。您可能希望在第一次访问后设置cookie,然后如果已经设置了cookie,则不会更新您的视图计数器。
语法类似于:
$expire=time()+2592000; //This is set to expire in 1 month (in seconds)
setcookie("visitor", "Already Visited", $expire);
这是我实现它的方式:
if !(isset($_COOKIE["visitor"]))
{
$expire=time()+2592000; //This is set to expire in 1 month (in seconds)
setcookie("visitor", "Already Visited", $expire);
$id = $_GET['id'];
mysql_query("UPDATE threads SET views = views + 1 WHERE id = '$id'");
}
答案 3 :(得分:0)
$id = $_GET['id'];
if(!isset($_SESSION['hasBeenCounted']) || $_SESSION['hasBeenCounted'] != $id)
{
mysql_query("UPDATE threads SET views = views + 1 WHERE id = '$id'");
$_SESSION['hasBeenCounted'] = $id;
}
我已经修改了代码,现在可以使用了。