PHP foreach banlist只检查文件的最后一行

PHP foreach banlist只检查文件的最后一行,php,Php,我有一个简单的网站,我想有能力禁止一些用户使用PHP访问它。以下是我尝试过的方法: $banlist = file('ipbans.txt'); foreach ($banlist as $line) { if ($_SERVER['REMOTE_ADDR'] == $line) { die; } } 不幸的是,对于ipbans.txt最后一行的任何IP地址,这种方法只会导致脚本终止(die)。特别是,我

我有一个简单的网站,我想有能力禁止一些用户使用PHP访问它。以下是我尝试过的方法:

    $banlist = file('ipbans.txt');
    foreach ($banlist as $line)
    {
        if ($_SERVER['REMOTE_ADDR'] == $line) {
            die; 
        }
    }
不幸的是,对于
ipbans.txt
最后一行的任何IP地址,这种方法只会导致脚本终止(
die
)。特别是,我期望的行为是,任何一行
ipbans.txt
上的IP地址的每个连接都将
消亡,但事实并非如此

我的网站太远了,不可能成为大量骚扰的目标,我也不希望禁止这么多IP地址。因此,在本例中,如果在
ipbans.txt
中有数千行代码,则不会出现问题。然而,如果有一种技术上更有效、也更容易实施的方法,我愿意对此进行调查。(只要它仍然是一个PHP解决方案,我就无法实现例如
.htaccess
bans。)


在任何情况下,这最后一行行为的原因是什么?我如何解决这一问题?

我认为问题在于PHP的
文件
方法包括每行的行尾。请注意以下内容中的这一行:

结果数组中的每一行都将包括行尾,除非使用文件\忽略\新\行

您需要使用
trim($line)

$banlist=file('ipbans.txt');
foreach($banlist作为$line)
{
如果($\u服务器['REMOTE\u ADDR']==trim($line)){
死亡
}
}
文件\u忽略\u新行

$banlist=file('ipbans.txt',file\u IGNORE\u NEW\u行);
foreach($banlist作为$line)
{
如果($\u服务器['REMOTE\u ADDR']==$line){
死亡
}
}
更新以包含解释

读取文件内容时,它会读取所有字符,包括行尾(EOF)等不可见的内容。假设您有以下文件:

xx.xx.xx.xx
yy.yy.yy.yy
zz.zz.zz.zz
现在,让我们使用
\n
来表示行尾字符。使用
文件
将其读入数组时,数组内容将为:

[
“xx.xx.xx.xx\n”,
“yy.yy.yy.yy\n”,
“zz.zz.zz.zz”
]

现在,如果远程地址是
xx.xx.xx.xx
,您可以看到与
xx.xx.xx.xx\n
的比较将为false。幸运的是,使用
trim($line)
将删除字符串开头或结尾的任何新行或空白字符。您还可以使用
FILE\u IGNORE\u NEW\u LINES
标志告诉
FILE
方法在将每一行读入数组时为您修剪每一行。

我还应该提到,在从文件中读取内容时,使用
trim
确实是一种最佳做法,除非出于某种原因需要保持前导/尾随空白。您不希望在一行末尾有额外的空间来进行比较,这是您以后可以花费数小时来尝试查找的内容。请尝试以下代码:$banlist=file('ipbans.txt')$状态=真;foreach($banlist作为$line){if($_SERVER['REMOTE\u ADDR']==trim($line)){$status=false;break;}}if(!$status){die;}