- 论坛徽章:
- 0
|
现在的问题有一个网站,这个网站为每个人提供一个人主页显示其信息,现在需要记录下个人主页有被多少人访问过?先要确定怎样才算是一次有效的访问 1、在一天时间内(24小时),同一个IP的访问只能算做一次。 2、一个用户有多个页面,在同一天内访问所有页面也只能算作一次。 3、对内网中多人共享同一IP的情况具有一定程度的支持。
解决这个问题需要一个用于排重的临时数据库,记录某个用户的信息被哪些人访问,访问时间,如果上一次的访问和这一次的访问时间是在同一天发生的只能算作一次。
怎么判定访问的人的身份是同一个人,可以采用记录IP和cookie的方法,记录IP就是同一个IP只能算一个人,还有一种就是记录下cookie,相比较而言cookie要精确一点。
为了让这个临时的表不能太大,影响性能和浪费空间,可以把两天前的数据清空以节省空间。
=================================================================================== php的一个实现 - <?php
-
/****************************************************
-
功能:判定个人空间是否是有效访问
-
网站:www.lalabe.com
-
邮件:huyi8888@gmail.com
-
*****************************************************/
-
error_reporting(E_ALL);
-
$link = mysql_connect('localhost', 'root', '123456')
-
or die('Could not connect: ' . mysql_error());
-
mysql_select_db('do') or die('Could not select database');
-
-
//获取客户端IP
-
function getip()
-
{
-
if(getenv('HTTP_CLIENT_IP')) {
-
$ip = getenv('HTTP_CLIENT_IP');
-
} elseif(getenv('HTTP_X_FORWARDED_FOR')) {
-
$ip = getenv('HTTP_X_FORWARDED_FOR');
-
} elseif(getenv('REMOTE_ADDR')) {
-
$ip = getenv('REMOTE_ADDR');
-
} else {
-
$ip = 'Unknown';
-
}
-
return $ip;
-
}
-
-
/*
-
确保在执行这个函数前没有向页面输出内容,因为这里有cookie的操作
-
*/
-
function ck_effect_visit($user_id, $type='ip')
-
{
-
$ip = getip();
-
$ip = ip2long($ip);
-
$rnd = rand(1000,9999);
-
$time = time();
-
$state = true;
-
-
//只考虑IP
-
if ($type == 'ip')
-
{
-
$query = mysql_query("SELECT * FROM `visit_temp` WHERE ip='$ip'");
-
while($row = mysql_fetch_array($query))
-
{
-
if (date("d",$row['lastvisit']) == date("d", $time))
-
return false;
-
}
-
mysql_query("INSERT INTO `visit_temp`(user_id,lastvisit,ip,rand)VALUES('$user_id','$time','$ip','$rnd')");
-
return true;
-
}
-
//采用cookie来排重,可以考虑到多人共享同一IP上网的情况
-
if (empty($_COOKIE['__utz']))
-
{
-
setcookie('__utz', $ip.'_'.$rnd, time()+ 3600*24);
-
mysql_query("INSERT INTO `visit_temp`(user_id,lastvisit,ip,rand)VALUES('$user_id','$time','$ip','$rnd');");
-
}
-
else
-
{
-
$ck_arr = explode("_", $_COOKIE['__utz']);
-
$cli_ip = $ck_arr[0];
-
$cli_rnd = $ck_arr[1];
-
$query = mysql_query("SELECT * FROM `visit_temp` WHERE user_id='$user_id' AND ip = '$cli_ip'");
-
$flag = false;
-
if (mysql_num_rows($query) > 0)
-
{
-
while($row = mysql_fetch_array($query))
-
{
-
if ($row['rand'] == $cli_rnd)
-
{
-
if (date("d",$row['lastvisit']) != date("d", $time))
-
{
-
mysql_query("UPDATE `visit_temp` SET lastvisit='$time' WHERE user_id='$user_id' AND ip='$cli_ip' AND rand='$cli_rnd'");
-
$state = true;
-
//$_COOKIE['__utz'] = $ip.'_'.$rnd;
-
setcookie('__utz', $ip.'_'.$rnd, time()+ 3600*24);
-
}
-
else
-
{
-
if ($cli_ip != $ip)
-
{
-
mysql_query("UPDATE `visit_temp` SET lastvisit='$time',$ip='$ip' WHERE user_id='$user_id' AND ip='$cli_ip' AND rand='$cli_rnd'");
-
setcookie('__utz', $ip.'_'.$rnd, time()+ 3600*24);
-
}
-
$state = false;
-
}
-
$flag = true;
-
break;
-
}
-
}
-
if (!$flag)
-
{
-
mysql_query("INSERT INTO `visit_temp`(user_id,lastvisit,ip,rand)VALUES('$user_id','$time','$ip','$rnd');");
-
$state = true;
-
//$_COOKIE['__utz'] = $ip.'_'.$rnd;
-
setcookie('__utz', $ip.'_'.$rnd, time()+ 3600*24);
-
}
-
}
-
else
-
{
-
mysql_query("INSERT INTO `visit_temp`(user_id,lastvisit,ip,rand)VALUES('$user_id','$time','$ip','$rnd')");
-
//$_COOKIE['__utz'] = $ip.'_'.$rnd;
-
setcookie('__utz', $ip.'_'.$rnd, time()+ 3600*24);
-
$state = true;
-
}
-
}
-
return $state;
-
}
-
$user_id = 1;
-
$visit_stat = ck_effect_visit($user_id);
-
$word = ($visit_stat == true) ? "有效访问" : "无效访问";
-
echo $word;
-
mysql_close($link);
-
?>
|
|