【问题标题】:page view counter, code is provided, is it the best way?页面浏览计数器,提供代码,这是最好的方法吗?
【发布时间】:2012-02-07 06:46:06
【问题描述】:

假设我们有一个名为visits 的表,它有两个字段id 用于页面ID,ip 用于用户的IP 地址。

我已经编写了这段代码,我想知道这是否是最好的方法?

    $ip=$_SERVER['REMOTE_ADDR'];
    $id=$_GET['id'];

    $query = "SELECT
    (SELECT COUNT(ip) FROM visits WHERE id = '{$id}' AND WHERE ip ='{$ip}') as visited,
    (SELECT COUNT(ip) FROM visits WHERE id = '{$id}') as pageHits";

    $result=mysql_query($query, $connection);
    $row=mysql_fetch_array($result);

    $pageHits=$row['pageHits'];
    $visited=$row['visited']; //it's either 0 or 1;

    if($visited==0){
        $query ="INSERT INTO visits (ip , id) VALUES ('{$ip}', {$id})"
        $result=mysql_query($query, $connection);
        $pageHits++;
    }

    echo $pageHits;

【问题讨论】:

  • 一旦用户访问了任何页面,它会将访问标志设置为 1 ,因此命中计数器将来不会跟踪任何其他页面。因为所有页面的 IP 地址都相同
  • 你最好只在(ip, id) 上添加一个UNIQUE 约束 - 否则你会遇到竞争条件。
  • 确保清理 GET 参数。就目前而言,它是您代码中的一个开放漏洞

标签: php mysql counter


【解决方案1】:

我什至不会检查数据库中的现有条目。

ipid(组合)上添加UNIQUE 键,然后运行INSERT IGNORE

$ip=$_SERVER['REMOTE_ADDR'];
$id=$_GET['id'];

$query = 'INSERT IGNORE INTO visits (ip, id) VALUES ('.$ip.', '.intval($id).')';
mysql_query($query, $connection);

// and now select the visits:
$query = 'SELECT COUNT(ip) as pageHits FROM visits WHERE id = '.intval($id);
$result = mysql_query($query, $connection);
list($pageHits) = mysql_fetch_array($result);
echo $pageHits;

【讨论】:

    【解决方案2】:

    很大程度上取决于您的用例。对于内部网络中的微不足道的计数器,这可能就足够了。

    虽然我不太清楚“pageHits”到底是什么。似乎是我不会称之为“pageHits”的唯一身份访问者的数量。

    对于每个人都可以看到的网站,这种方法是有问题的。一个明显的问题是通过“id”参数进行 SQL 注入的漏洞。

    当然有很多可用的库可以以不同程度的复杂性进行这种计数。如果没有更多细节和实际用例,很难判断是否需要编写更复杂的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-30
      • 2016-04-22
      • 2014-08-12
      • 1970-01-01
      • 2011-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多