【问题标题】:Protect counter views In order not to be manipulated保护柜台视图以免被操纵
【发布时间】:2011-01-09 00:24:48
【问题描述】:

我有这个代码:

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

但是当我一遍又一遍地点击刷新时,计数器会随着每次刷新而增加。

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

【问题讨论】:

  • 您的意思是只想计算唯一访问次数?
  • 是的,这就是我的意思。

标签: php mysql views counter


【解决方案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 简单、干净。您可能需要先使用session_start(),然后再使用$_SESSION,否则会出错。
  • 我明白为什么你可能忽略了它......调用它两次也会引发错误:p
  • 这个解决方案不正确,因为它适用于所有线程,例如我打开了 title1 然后刷新这个线程 ok 计数器不会增加,但是当我打开另一个线程 title2 例如这个线程不会增加也因为从第一个thead就设置了会话,如何将会话链接到线程ID?!
  • 你的服务器没有系统线程ID的概念。为什么将来自同一系统的多个线程像这样捆绑在一起很重要?
【解决方案2】:

一种方法是使用会话。然而,最终,这并不是真正可扩展的。当用户浏览您的网站时,您可能会拥有大量的会话文件。此外,每次用户创建新会话时,您都会记录该视图。

如果您只想为单个用户记录单个视图,则需要存储该用户查看线程。根据您的站点是否只允许登录用户查看线程,或者您的站点是否向公众开放,您必须将每个用户的独特信息存储在一个单独的表中,结构如下(您的里程会因字段类型):

 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 中没有记录,则插入一条记录,然后增加threads 表中的views 列。如果thread_views 中有一行,那么您知道用户已经查看了该线程。

【讨论】:

    【解决方案3】:

    我认为使用 cookie 进行会话是您的最佳选择。您可能希望在第一次访问后设置 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'");
    }
    

    【讨论】:

      【解决方案4】:
      $id = $_GET['id'];
      
      if(!isset($_SESSION['hasBeenCounted']) || $_SESSION['hasBeenCounted'] != $id)
        {
        mysql_query("UPDATE threads SET views = views + 1 WHERE id = '$id'");
        $_SESSION['hasBeenCounted'] = $id;
        }
      

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

      【讨论】:

        猜你喜欢
        • 2011-04-11
        • 1970-01-01
        • 1970-01-01
        • 2022-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-25
        • 1970-01-01
        相关资源
        最近更新 更多