仅跟踪唯一身份访问者

时间:2010-10-23 01:11:51

标签: php counter

目前我有一个名为“hits.php”的文件,在我要跟踪页面点击的任何页面上我只使用<?php include("hits.php"); ?>

我如何才能跟踪唯一身份访问者?我的命中是错误的,因为它可以被同一个人刷新并且命中率上升。

这是我的来源:

<?php
 $hits = file_get_contents("./client/hits.txt"); 
 $hits = $hits + 1; 

 $handle = fopen("./client/hits.txt", "w"); 
 fwrite($handle, $hits); 
 fclose($handle); 

 print $hits; 

?>

我真的不知道如何进行cookie检查......有没有办法检查IP?或者我该怎么办?

感谢StackO。

7 个答案:

答案 0 :(得分:17)

最简单的方法是进行cookie检查。

更好的方法是创建SQL数据库并将IP地址指定为主键。然后,每当用户访问时,您都会将该IP插入数据库。

  1. 创建一个包含在检查$_SESSION['logged']的所有网页上的功能,您可以为其分配所需的任何“标记”。
  2. 如果$_SESSION['logged']返回'false',则将其IP地址插入MySQL数据库。
  3. $_SESSION['logged']设置为“true”,这样就不会浪费资源多次记录IP。
  4. 注意:创建MySQL表时,请将IP地址'字段指定为键。

    <?php 
      session_start();
      if (!$_SESSION['status']) {
        $connection = mysql_connect("localhost", "user", "password");
        mysql_select_db("ip_log", $connection);
    
        $ip = $_SERVER['REMOTE_ADDR'];
        mysql_query("INSERT INTO `database`.`table` (IP) VALUES ('$ip')");
    
        mysql_close($connection);
        $_SESSION['status'] = true;
      }
    ?>
    

答案 1 :(得分:3)

没有完美的解决方案,但前两种方法(IP地址和/或cookie)最可靠,组合可能更好。

我没有重新发明轮子,而是使用了现成的解决方案。出于商业原因,我避免了谷歌分析(我不希望谷歌知道我的网站统计数据 - 他们的最大利益不是我的)。它们可能适用于非商业网站,或者如果您不使用Google进行广告宣传。还有许多替代品。例如,我使用Getclicky.com

答案 2 :(得分:2)

  1. 在基本级别,您可以使用PHP $_SERVER['REMOTE_ADDR']属性获取客户端的IP地址
  2. 考虑设置cookie或使用会话,但这可以通过删除cookie或cookie拒绝来解决。有关详细信息,请参阅PHP setcookie文档。
  3. 还有其他浏览器指纹识别方法 - 查看您在https://panopticlick.eff.org/index.php可以想象使用的所有不同数据

答案 3 :(得分:2)

如果你不能谷歌分析怎么样?你可以做一个数据库或用其中的IP创建另一个文件,但是这样的平面文件会变得复杂。

答案 4 :(得分:1)

我发现质量非常差的解决方案,只是一种快速而肮脏的方式。

我也在开发类似的东西,并制定了一种快速的方法,无需冗余。

每次有人访问其他用户的个人资料时,我都需要一个计数器。

伪:

  • 创建一个包含查看者姓名和查看者姓名(daily_views表)的表。
  • 检查查看者的名字是否与观众姓名一致(在同一行上)。
  • 如果它们不存在,请更新用户计数器+1(在用户表中)。
  • 别无所事。
  • 通过cron job每24/12小时重置整个表值null。

这将拒绝访问相同用户配置文件的同一个人添加1 计数器刷新一整天(或12小时),而上述解决方案 通过格伦尼尔森确实会在计数器上加1,但拒绝加入每个 用户的计数器同时。

不仅如此,如果你要注销并重新登录网站,那么 它只会重新添加到计数器中,其中有些情况下巨魔和haxorz 想要使用这个(当会话被销毁并再次启动时)。

以下是我的示例表:

users 
{
user_id INT(8) auto increment, user_name varchar(32), user_counter INT(12)
};
daily_views
{
view_id INT(8) auto increment, viewer_name VARCHAR(32), viewee_name VARCHAR(32)
};

以下是我编写的示例代码:

<?php
session_start();
$uname = $_SESSION['username'];
$vieweepage = $_GET['name']; //gets the name of the persons page/profile via previous page/form
$connect = mysql_connect("localhost","user","password") or die("Couldn't connect; check your mysql_connect() settings");
$database = mysql_select_db("database") or die("Could not locate database!");

$query = mysql_query("SELECT user_counter from users");
$query = mysql_fetch_row($query);
$counter = $query[0];
$viewcheck = mysql_query("SELECT viewer_name from daily_views WHERE viewee_name='$vieweepage'");
$viewrow = mysql_num_rows($viewcheck);

$newcounter = $counter + 1;

if($viewrow == 0)
{
$update = mysql_query("UPDATE users SET user_counter='$newcounter' WHERE user_name='$vieweepage'");
$insert = mysql_query("INSERT into daily_views (viewer_name, viewee_name) VALUES ('$uname', '$vieweepage')");
}
?>

答案 5 :(得分:0)

目前我正在使用remote addresssession ID访问者。我认为它是有效的访问者,因为单个用户可以在一天内没有时间访问而计数器不依赖于刷新它只取决于新会话

答案 6 :(得分:0)

您可以在javascript中将时间戳保存到localStoage。浏览器不会删除LocalStoage,因此应保存您进行检查。我知道这不是服务器端检查,但还是有帮助的。