在开发PHP程序有时需要在某段时间内以来访者IP为根据限制来访者的一些动作,例如页面计数已经浏览一次短时间内再浏览就不再计数,投票次数等。
利用PHP+MYSQL可以很好的实现IP锁定,我写了一个这样的IP锁定模块有一定的通用性,以下是数据库的表结构及PHP代码。
iplock.sql
DROP TABLE IF EXISTS iplock;
CREATE TABLE iplock (
ip varchar(15) DEFAULT '' NOT NULL,
program varchar(200) DEFAULT '' NOT NULL,
item varchar(24) DEFAULT '' NOT NULL,
iplock_time smallint(15) DEFAULT '0' NOT NULL,
last_time datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
counter tinyint(8) DEFAULT '0' NOT NULL,
PRIMARY KEY (ip,program,item) )
iplock.inc <? function iplock($item,$iplock_time,$counter){
global $dbhost,$db;
$ip=$GLOBALS["REMOTE_ADDR"]; $program=__FILE__;
$T_ip='iplock';
$query = "delete from $T_ip where now()-last_time>$iplock_time"; $result = mysql_db_query($db,$query,$dbhost); //清除过期的记录 ipdb_err();
$query = "select counter from $T_ip where ip='$ip' and program='$program' and item='$item'"; $result = mysql_db_query($db,$query,$dbhost);
ipdb_err();
$rows=mysql_num_rows($result);
if ($rows==0){
$query="insert into $T_ip (ip,program,item,iplock_time,last_time,counter)values('$ip','$program','$item',$iplock_time,now(),1)"; $result = mysql_db_query($db,$query,$dbhost);
ipdb_err();
$r=1;} else{
$row=mysql_fetch_array($result);
if($row["counter"]<$counter){
$query = "update $T_ip set last_time=now(),counter=counter+1 where ip='$ip' and program='$program' and item='$item'";
$result = mysql_db_query($db,$query,$dbhost);
ipdb_err();
$r=1;}
else $r=0; }
return($r); }
function ipdb_err(){
$err=mysql_error(); if($err)
exit("<p align=center>数据库发生错误!</p><p align=center>$err</p>"); }
?>
函数的调用不算复杂
$item (唯一的项目名,为了与其他调用该模块的系统区别)
$iplock_time 锁定该IP时间(单位:秒)
$counter 函数执行n次后锁定该IP
|
|