2007/12/02 | PHP学习5:防灌水计数器的制作 代码
类别(网络工程师) | 评论(0) | 阅读(360) | 发表于 00:23

看了 一周学会PHP的: 防灌水计数器 教程 ,可能是时间关系 作者讲这部分讲的太快 不详细

也没有找其相关源代码文档, 对其的方法还是有一点不明白 ,经过N次调试 总算找到解决方法

请看现在做的代码 经测试 完全可以在任何机器上跑  

其实它的原理就是

首先读取数据库中的已有IP  $ ip = getenv('REMOTE_ADDR');

//getenv("HTTP_CLIENT_IP")

//getenv("HTTP_X_FORWARDED_FOR")

//$ _SERVER["REMOTE_ADDR"]

和获取的IP比较 

_________________________________________________

IF( 不同)   (!$ row)  {就加1次}

____________________________

else          相同  {

                              则获取时间差

SELECT TIME_TO_SEC( NOW( ) ) - TIME_TO_SEC( time_at ) FROM `count` WHERE ip = '$ ip' AND name = 'a1' ORDER BY `TIME_TO_SEC( NOW( ) ) - TIME_TO_SEC( time_at )` ASC

使用TIME_TO_SEC( NOW( ) ) - TIME_TO_SEC( time_at )  获取时间差

升序排列哦___________________________________________________________

                    

                                     IF(这个时间差的都大于5秒了)

                                                  {

                                                     加1次

                                                    加了1次以后 就让总数 显示出来

                                                 }

                                        ELSE(这个最小的在5秒内){

                                                  直接 让总数 显示出来}

}

____________________________________________________________________

<?
$ mysql_server_name = "localhost";
$ mysql_username = "a";
$ mysql_password = "a";
$ mysql_database = "a";
//-------
$ ip = getenv('REMOTE_ADDR');
//-----------------------------------------------------------select部分
$ conn=mysql_connect( $ mysql_server_name, $ mysql_username, $ mysql_password );

$ sql = "SELECT * FROM `count` WHERE ip = '$ ip' AND name = 'a1'";

//进行查询(选取)可用 sum(*)代替
$ result=mysql_db_query( $ mysql_database, $ sql,$ conn );

//将查询的结果 --> 抓出一笔
$ row=mysql_fetch_row($ result);

//印出该笔资料的所有拦位[阵列]
//print_r($ row);

//清除查询结果
mysql_free_result($ result);


if (!$ row)
{
//建立连线---透过(服务器位置,使用者名称,使用者密码)
$ conn=mysql_connect( $ mysql_server_name, $ mysql_username, $ mysql_password);

 

//准备好你的SQL语法
$ sql = "INSERT INTO `count` ( `name` , `NEW` , `ip` , `time_at` ) valueS ('a1', '1', '$ ip', NOW( ) )";

//选择你要处理的资料库
mysql_select_db($ mysql_database,$ conn);

//进行查询(或叫做执行)...
$ result = mysql_query($ sql);

//结束并且释放连线
mysql_close($ conn);

}
else
{
$ conn=mysql_connect( $ mysql_server_name, $ mysql_username, $ mysql_password );

$ sql = "SELECT TIME_TO_SEC( NOW( ) ) - TIME_TO_SEC( time_at ) FROM `count` WHERE ip = '$ ip' AND name = 'a1' ORDER BY `TIME_TO_SEC( NOW( ) ) - TIME_TO_SEC( time_at )` ASC";

//进行查询(选取)可用 sum(*)代替
$ result=mysql_db_query( $ mysql_database, $ sql,$ conn );

//将查询的结果 --> 抓出一笔
 $ row2=mysql_fetch_row($ result);

//印出该笔资料的所有拦位[阵列]
//print_r($ row); 测试

//清除查询结果
mysql_free_result($ result);

if ($ row2[0]>5)
{

//建立连线---透过(服务器位置,使用者名称,使用者密码)
$ conn=mysql_connect( $ mysql_server_name, $ mysql_username, $ mysql_password);

 

//准备好你的SQL语法
$ sql = "INSERT INTO `count` ( `name` , `NEW` , `ip` , `time_at` ) valueS ('a1', '1', '$ ip', NOW( ) )";

//选择你要处理的资料库
mysql_select_db($ mysql_database,$ conn);

//进行查询(或叫做执行)...
$ result = mysql_query($ sql);

//结束并且释放连线
mysql_close($ conn);
//-----------------------------------------------------------select部分
$ conn=mysql_connect( $ mysql_server_name, $ mysql_username, $ mysql_password );

$ sql = "SELECT count(*) FROM `count` WHERE name = 'a1'";

//进行查询(选取)可用 sum(*)代替
$ result=mysql_db_query( $ mysql_database,$ sql,$ conn );

//将查询的结果 --> 抓出一笔
$ row3=mysql_fetch_row($ result);

echo  "5秒 --后---".$ row3[0];

//印出该笔资料的所有拦位[阵列]
//print_r($ row);

//清除查询结果
mysql_free_result($ result);}
else{
$ conn=mysql_connect( $ mysql_server_name, $ mysql_username, $ mysql_password );

$ sql = "SELECT count(*) FROM `count` WHERE name = 'a1'";

//进行查询(选取)可用 sum(*)代替---这个好象注释不对哦
$ result=mysql_db_query( $ mysql_database,$ sql,$ conn );

//将查询的结果 --> 抓出一笔
$ row4=mysql_fetch_row($ result);

 

//印出该笔资料的所有拦位[阵列]
//print_r($ row);

//清除查询结果
mysql_free_result($ result);


echo  "5秒 ---内---".$ row4[0];
}

 

}
?>

 


 
0

评论Comments