-1

我刚刚创建了一个网站,在管理面板中有一个非常重要的统计模块,它可以识别用户是第一次访问该网站(唯一)还是已经访问过该网站(原始)。

要识别用户是否唯一,脚本会检查 ip 是否相同或是否存在 cookie(在同一天)。

if( isset( $_COOKIE['c'] ) && !empty( $_COOKIE['c'] ) && ctype_alnum( $_COOKIE['c'] ) ) { 
$cookie = secure_field( $_COOKIE['c'] ); } else { $cookie = NULL; }

$res = mysqli_query( $con, "SELECT id FROM table WHERE ( ip = '$ip' OR id = '$cookie' ) 
AND DATE_FORMAT( datetime, '%d.%m.%y' ) = DATE_FORMAT( now(), '%d.%m.%y' ) 
ORDER BY datetime DESC LIMIT 1" );

if( mysqli_num_rows( $res ) == 0 ) { $unique = 1; } else { $unique = 0; }

对我来说,这个脚本可以完美运行(我尝试过许多浏览器,删除 cookie,更改 IP,..)。但是现在我刚刚看到一个用户的奇怪行为,它使用相同的 IP 但它的所有访问都注册为唯一!

这里是注册记录(为了隐私,我已经屏蔽了 ip):

2013-09-09 06:06:05 unique  112.201.***.*** Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.36 (K...
2013-09-09 06:06:14 unique  112.201.***.*** Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.36 (K...
2013-09-09 06:11:58 unique  112.201.***.*** Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.36 (K...
2013-09-09 06:14:11 unique  112.201.***.*** Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.36 (K...
2013-09-09 06:17:05 unique  112.201.***.*** Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.36 (K...
2013-09-09 06:17:15 unique  112.201.***.*** Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.36 (K..

这怎么可能?我该如何解决?

4

1 回答 1

0

你从来没有设置过$res这样mysqli_num_rows应该产生一个警告并导致false等于0。因此请求将始终是唯一的。

如果您正确插入 ip 并且 sql 正确,这应该可以工作:

$res = mysqli_query( $con, "SELECT id FROM table WHERE ( ip = '$ip' OR id = '$cookie' ) 
AND DATE_FORMAT( datetime, '%d.%m.%y' ) = DATE_FORMAT( now(), '%d.%m.%y' ) 
ORDER BY datetime DESC LIMIT 1" );

if( mysqli_num_rows( $res ) == 0 ) { $unique = 1; } else { $unique = 0; }

另外:您实际上是否将ip插入表中?

您是否在 phpmyadmin 中手动检查了查询?那样有用吗?

于 2013-09-09T08:31:39.717 回答