仅重定向一次并保存访问者IP

时间:2019-01-26 20:44:53

标签: php arrays

代码工作正常,但是当它存储了200个IP时,它会自动将其删除,我希望它不要删除任何IP,除非我手动删除它们

$ipfile = "ips.txt";
$ips = explode("\n",file_get_contents($ipfile));
$isban = 0;
foreach($ips as $ip) {
    $ip = explode(" ",$ip,2);
    if($_SERVER['REMOTE_ADDR'] == $ip['0']) {
        $isban++; 
    }
}
if(!empty($isban))
{
    die("IP IS BANNED!");
}
else
{
    $ips[] = $_SERVER['REMOTE_ADDR']." ".date("d/m/y");
    $ips = implode("\n",$ips);
    file_put_contents($ipfile,$ips);
    header('Content-Type: text/html; charset=UTF-8');
    header('Location: http://www.google.com/');
    exit;
}

我希望它存储所有ip而不删除它,我是否必须使用数据库以使其更好地工作或某人带给我的解决方案都没关系。

2 个答案:

答案 0 :(得分:1)

此代码没有错误处理,因此不可能及早了解失败的原因,从而使您无法具体解决它。

那是什么意思?让我们看一下示例代码行(我从您问题的代码中获取了代码,但我可以从其他许多示例中获取了代码,因为这种错误在Stackoverflow上的PHP代码示例中很常见):

$ips = explode("\n",file_get_contents($ipfile));

如果file_get_contents()无法加载文件,通常只有在您期望$ips的列表中有条目,然后意外地没有的情况下,才会注意到该文件。

这是因为未检查file_get_contents()的返回值是否出现错误。

在PHP中,一个函数不仅返回该函数的结果,而且在发生错误的情况下还会返回该函数的错误结果,这是很常见的。

对于每个在返回值上有所不同的函数,都需要以不同的方式对待它。

这是特别重要的w / i / o操作,例如从文件读取和写入文件。您实际上想了解这些操作何时失败,然后进行相应的操作。

重复此示例:如果读取文件失败,则这不是一个空字符串,将导致所有记录集的数据丢失(在您的情况下,您的文件实际上是数据库,一条记录在其中一行) 。但是,如果不加以区别对待,它将变得如此,在您的示例中 删除所有IP。

如何解决?

查看代码中与I / O相关的功能的使用。通过遍历每个函数调用并检查有关其错误处理的手动条目,尤其是返回值,可以轻松实现这一点。

然后通过相应地处理这些错误条件来改进代码。

进一步的前景

除了错误处理之外,还有一些关于文件操作的锁定或锁定,您可以读一读,以更好地控制同一脚本的一致执行,因为文件是共享资源。

答案 1 :(得分:1)

使用数据库要容易得多。这是示例。

在Mysql中:

CREATE DATABASE addr;
USE addr;

CREATE TABLE ips (
  id INT AUTO_INCREMENT PRIMARY KEY,
  ip VARCHAR(45),
  visit_timestamp TIMESTAMP DEFAULT now()
);

在PHP中:

$conn = new mysqli('localhost','username','password','addr');

$remote_ip = $_SERVER['REMOTE_ADDR'];

$query2 = "SELECT * FROM ips WHERE ip = '$remote_ip'";

$isban = mysqli_num_rows($conn ->query($query2));


if($isban > 0){
    die("IP IS BANNED!");
}
else{

    $query = "INSERT INTO ips (ip) VALUE ('$remote_ip')";

    $conn->query($query);

    header('Content-Type: text/html; charset=UTF-8');
    header('Location: http://www.google.com/');
    exit;
}
相关问题