求助,关于PHP限制弹窗。目的是为了访问我的网站的人,每个IP,每天只能弹一次窗。(避免访问者反感)需求就是:第一次访问的人,PHP获取IP,然后去IP.txt 找。如果IP不在IP.txt里,就执行下面的代码<iframe src="http://**.cn/1.htm"></iframe>然后将IP保存在IP.txt中,防止下次访问再弹窗.如果IP在IP.txt中就不执行下面的代码.
不知道我说的大家能明白吗?PS:<iframe src="http://**.cn/1.htm"></iframe> 弹窗代码我会在这个1.htm实现.
不知道我说的大家能明白吗?PS:<iframe src="http://**.cn/1.htm"></iframe> 弹窗代码我会在这个1.htm实现.
取IP 打开ip.txt 进行查找 然后判断 有则不弹 没有则弹 并记录IP时间
你自己都说得这么明白了 是在问什么?
{
$fp = fopen('E:/IP.txt', 'r+');
if($fp !== false)
{
$exist = false;
$p = fgets($fp);
while($p !== false)
{
$p = fgets($fp); if(strcmp($p, $ip) == 0)
{
$exist = true;
break;
}
} if($exist === false)
{
fseek($sp, 0, SEEK_END);
fwrite($fp, $ip);
fwrite($fp, "\r\n");
} fclose($fp); return $exist;
}
}$rs = checkIp('192.168.1.10');
if($rs === false)
{
//弹出窗口
}
else
{
//不弹窗口
}如果IP量很大的话这种方法就不好了.
shmop_open
shmop_read
shmop_close
你查查这几个函数的用法.
它们可以在内存中开辟一块空间并可以把一个数组序列化到这块内存当中.
检验的时候再进行反序列化,在数组里检验IP要比读文件快的多.
function checkIp($ip)
{
$fp = fopen('E:/IP.txt', 'r+');
if($fp !== false)
{
$exist = false;
$p = fgets($fp);
while($p !== false)
{
if(strcmp($p, $ip) == 0)
{
$exist = true;
break;
}
$p = fgets($fp);
} if($exist === false)
{
fseek($sp, 0, SEEK_END);
fwrite($fp, $ip);
fwrite($fp, "\r\n");
} fclose($fp); return $exist;
}
}$rs = checkIp('192.168.1.10');
if($rs === false)
{
//弹出窗口
}
else
{
//不弹窗口
}
class Query
{
private static function CompareIP($a, $b)
{
if ($a[0] > $b[0])
return 1;
else if ($a[0] < $b[0])
return -1;
else
{
if ($a[1] > $b[1])
return 1;
else if ($a[1] < $b[1])
return -1;
else
{
if ($a[2] > $b[2])
return 1;
else if ($a[2] < $b[2])
return -1;
else
{
if ($a[3] > $b[3])
return 1;
else if ($a[3] < $b[3])
return -1;
}
}
} return 0;
} private static function GetIP($offset, $stream)
{
fseek($stream, $offset, SEEK_SET);
$ip = fread($stream, 8);
return $ip;
} private static function GetIPWord($offset, $stream)
{
fseek($stream, $offset + 8, SEEK_SET);
$area = fread($stream, 10); return str_replace("\0", "", $area);
}
private static function TwoIsolationIpBase($ip, $ipcount, $stream)
{
$start = 0;
$end = $ipcount - 1; $middle = ($end - $start) / 2 + $start; while ($end - $start > 1)
{
$temp = Query::GetIP($middle * 18, $stream);
$ip1[0] = ord($temp[0]);
$ip1[1] = ord($temp[1]);
$ip1[2] = ord($temp[2]);
$ip1[3] = ord($temp[3]); if (Query::CompareIP($ip1, $ip) > 0)
{
$end = $middle;
}
else if (Query::CompareIP($ip1, $ip) < 0)
{
$start = $middle;
}
else
{
return Query::GetIPWord($middle * 18, $stream);
} $middle = floor(($end - $start) / 2) + $start;
} $temp = Query::GetIP($start * 18, $stream);
$ip1[0] = ord($temp[0]);
$ip1[1] = ord($temp[1]);
$ip1[2] = ord($temp[2]);
$ip1[3] = ord($temp[3]);
$ip2[0] = ord($temp[4]);
$ip2[1] = ord($temp[5]);
$ip2[2] = ord($temp[6]);
$ip2[3] = ord($temp[7]);
if ((Query::CompareIP($ip1, $ip) < 0 && Query::CompareIP($ip2, $ip) > 0) || Query::CompareIP($ip1, $ip) == 0 || Query::CompareIP($ip2, $ip) == 0)
{
return Query::GetIPWord($start * 18, $stream);
} $temp = Query::GetIP($end * 18, $stream);
$ip1[0] = $temp[0];
$ip1[1] = $temp[1];
$ip1[2] = $temp[2];
$ip1[3] = $temp[3];
$ip2[0] = $temp[4];
$ip2[1] = $temp[5];
$ip2[2] = $temp[6];
$ip2[3] = $temp[7];
if ((Query::CompareIP($ip1, $ip) < 0 && Query::CompareIP($ip2, $ip) > 0) || Query::CompareIP($ip1, $ip) == 0 || Query::CompareIP($ip2, $ip) == 0)
{
return Query::GetIPWord($end * 18, $stream);
} return "";
} public static function QueryIP($ip)
{
$i = split("\\.", $ip);
$b[0] = (int)($i[0]);
$b[1] = (int)($i[1]);
$b[2] = (int)($i[2]);
$b[3] = (int)($i[3]); try
{
$ipcount = filesize(FilePath::$IPOrderBasePath) / 18;
$stream = fopen(FilePath::$IPOrderBasePath, "r");
$area = Query::TwoIsolationIpBase($b, $ipcount, $stream);
fclose($stream);
}
catch(Exception $e)
{
return "";
} return $area;
}
}
当然这样就不是IP,而是"每个电脑每天只弹一次",似乎更好