回 帖 发 新 帖 刷新版面

主题:[原创]PHP简单的防刷计数器--已经图片化

单独的效果演示地址www.aibiancheng.cn/counter.php

整体效果演示www.aibiancheng.cn

请先把线面的内容导入数据库

CREATE TABLE aibiancheng_counter(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
user_ip CHAR(25) NOT NULL,
diftime INT UNSIGNED NOT NULL,
PRIMARY KEY(id)
);

//counter.php

<html>

<head>
   <title></title>
</head>

<body>
<?php
   global $ip,$now;
   global $dbhost,$dbuser,$dbpassword,$imgpath;
   //下面的配置文件必须准确的填写,不然的话,肯定运行不正常的
   $dbhost="您的MYSQL服务器名";   //如果你的空间和MYSQL数据库在一起的话一般是localhost
   $dbuser="用户名";
   $dbpassword="数据库密码";
   $dbname="数据库名";
   //配置文件结束,下面的内容非有必要,请勿改动
$user_IP = ($_SERVER["HTTP_VIA"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"];

$user_IP = ($user_IP) ? $user_IP : $_SERVER["REMOTE_ADDR"];

//echo $user_IP;

//下面的内容是一个函数用来得到访问者的IP
function get_real_ip(){

$ip=false;

if(!empty($_SERVER["HTTP_CLIENT_IP"])){

   $ip = $_SERVER["HTTP_CLIENT_IP"];

}

if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {

   $ips = explode (", ", $_SERVER['HTTP_X_FORWARDED_FOR']);

   if ($ip) { array_unshift($ips, $ip); $ip = FALSE; }

   for ($i = 0; $i < count($ips); $i++) {

    if (!eregi ("^(10|172\.16|192\.168)\.", $ips[$i])) {

     $ip = $ips[$i];

     break;

    }

   }

}

return ($ip ? $ip : $_SERVER['REMOTE_ADDR']);

}

//获取访问者的IP结束,下面的内容是展示访问者的IP
$ip=get_real_ip();
//展示访问者的IP结束,下面的内容是获得登录时服务器的时间
$now=time();
//下面的语句中减去了一个庞大的数,这是为了减小数据量因为time函数得到的是当前的时间
//它是以一个比较老的时间做起点,如果我们用它的起点,数据量将比较的庞大,减去一个很大的数
//可以让我们的数据处理简单,占用的数据库空间小
$now=$now-1188032807;
//下面的语句是用来查询相同的IP在你的网站上的访问记录的
     $link = mysql_connect($dbhost, $dbuser, $dbpassword)
         or die("Could not connect : " . mysql_error());
     mysql_select_db($dbname) or die("Could not select database");

     /* 执行 SQL 查询 */
     global $result;
     $query = "SELECT * FROM aibiancheng_counter WHERE user_ip='$ip'";
     $result = mysql_query($query) or die("Query failed : " . mysql_error());
     global $col_value;
     while ($line = mysql_fetch_array($result, MYSQL_ASSOC))
         foreach ($line as $col_value);
     if((!$result)||$now-$col_value>=600)//600s是用来防止恶意刷新,自己根据网站的统计要求配置
     {
     $con = mysql_connect($dbhost,$dbuser,$dbpassword);
mysql_select_db($dbname, $con);
$strSql="insert    into    aibiancheng_counter (user_ip,diftime)
     values('$ip','$now')";
   $result=mysql_query($strSql,$con);
mysql_close($con);
}
/*连接数据库*/
$link = mysql_connect($dbhost, $dbuser, $dbpassword)
         or die("Could not connect : " . mysql_error());
     mysql_select_db($dbname) or die("Could not select database");

     /* 执行 SQL 查询 */
     $query = "SELECT * FROM aibiancheng_counter";
     $result = mysql_query($query) or die("Query failed : " . mysql_error());
     global $counter,$counter_len;
     while ($line = mysql_fetch_array($result, MYSQL_ASSOC))
     $counter++;
$counter_len=strlen($counter);
for($i=8-$counter_len;$i>0;$i--)
echo "<img src='pic/0.jpg' align=left>"; //这里涉及到图片,如果你使用的不是JPG的请更改,或者文件夹名不一样,请改
   for($i=0;$i<$counter_len;$i++)
   {
   $number=substr($counter,$i,1);
   if(isset($number))
   {
     echo "<img src='pic/".$number.".jpg' align=left>";//同上说明
   }
   }
?>


</body>

</html>
附件中有我使用的图片,相信大家会做的更好的啊

回复列表 (共2个回复)

沙发

你的图片真漂亮,你是用图片告诉用户他登录的次数(次数小于千万次),对吗?
这个创意非常棒,无论是谁都会把目光在这个数字图片上多驻留一会儿的。
我想最后一个查询可以省去,把$counter++;放到处理时间的查询里,并在下面的条件语句中加一句
if((!$result)||$now-$col_value>=600)
{
    。
    $counter++;
}
另外从$user_IP = 到函数结束我没看懂,请解释一下好吗?谢谢!

板凳

好文,顶一个~

我来回复

您尚未登录,请登录后再回复。点此登录或注册