保护计数器视图为了不被操纵

时间:2011-01-09 00:24:48

标签: php mysql views counter

我有这段代码:

$id = $_GET['id'];
mysql_query("UPDATE threads SET views = views + 1 WHERE id = '$id'");

但是当我点击刷新时,每次刷新时计数器都会增加。

如何通过会话或任何其他方式保护此计数器?

4 个答案:

答案 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;
  }

我已经修改了代码,现在可以使用了。