看了 一周学会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];
}
}
?>
回复Comments
作者:
{commentrecontent}