这是我的代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<body>
<?php
class visitors
{
static $i;
function __construct()
{
$this->checkIp();
}
function createFile()
{
$fp=fopen("visit.txt","a+");
if($fp)
{
echo "<br /> File created";
return $fp;
}
else
{
echo "File creation Error Check permissions";
exit;
}
}
function fetchIp()
{
$ip=$_SERVER['REMOTE_ADDR'];
//$ip=ip2long($ip);
return $ip;
}
function writeFile()
{
$fp=$this->createFile();
$ip=$this->fetchIp();
//echo $ip;
$space="\r\n";
fwrite($fp,$ip.$space);
//self::$i++;
//echo self::$i;
}
function checkIp()
{
$fp=$this->createFile();
$ip=$this->fetchIp();
while(!feof($fp))
{
$data.=fgets($fp);
}
$uip=explode("\r\n",$data);
foreach($uip as $key)
{
if(strpos($key,$ip)!==0)
{
$this->writeFile();
}
}
}
}
$v=new visitors();
?>
</body>
</html>
我正在尝试将每个访问者的IP地址存储在一个文本文件中,如果第二次访问同一个访问者,他的ip将被写入文本文件。要实现这一点,我会读取该文件并与当前的ip进行比较如果它们是相同的,它不会调用写入函数。问题是一切正常但文件每次都在换行中使用相同的ip写入。比较部分失败。请帮我解决这个问题。保留静态i变量部分我已经评论说没问题了。谢谢。
注意: 我已经阅读了An optimized method to compare IP addresses with wildcards in PHP?并从中得到了strpos的想法。之前我使用了ip2long和long2ip,但它也导致了同样的错误。我也读过PHP不支持来自here的无符号整数。这会影响我的比较操作,因为ip地址是无符号的32位整数。
答案 0 :(得分:3)
您不需要每次循环,只需使用stristr()查看IP是否存在。
更改功能
function checkIp()
{
$fp=$this->createFile();
$ip=$this->fetchIp();
while(!feof($fp))
{
$data.=fgets($fp);
}
$uip=explode("\r\n",$data);
foreach($uip as $key)
{
if(strpos($key,$ip)!==0)
{
$this->writeFile();
}
}
}
带
function checkIp()
{
$fp=$this->createFile();
$ip=$this->fetchIp();
while(!feof($fp))
{
$data.=fgets($fp);
}
if(!stristr($data, $ip)){
$this->writeFile();
}
}
答案 1 :(得分:1)
记住ip的常用方法是将它们存储在数据库中。这样,你总是有他们的ip的记录,如果你愿意,甚至更多。 =)
祝你好运