Думаю, проблема в том, что метод PHP file
включает в себя окончания строк для каждой строки. Обратите внимание на эту строку из документации :
Каждая строка в результирующем массиве будет содержать окончание строки, если не используется FILE_IGNORE_NEW_LINES.
Вам нужно использовать trim($line)
:
$banlist = file('ipbans.txt');
foreach ($banlist as $line)
{
if ($_SERVER['REMOTE_ADDR'] == trim($line)) {
die;
}
}
или FILE_IGNORE_NEW_LINES
:
$banlist = file('ipbans.txt', FILE_IGNORE_NEW_LINES);
foreach ($banlist as $line)
{
if ($_SERVER['REMOTE_ADDR'] == $line) {
die;
}
}
Обновлен, чтобы включить объяснение
Когда вы читаете содержимое файла, он читает все символы, включая невидимые вещи, такие как окончания строк (EOF). Допустим, у вас был следующий файл:
xx.xx.xx.xx
yy.yy.yy.yy
zz.zz.zz.zz
Теперь давайте используем \n
для представления символа окончания строки. Когда вы читаете это в массив, используя file
, содержимое массива будет:
[
"xx.xx.xx.xx\n",
"yy.yy.yy.yy\n",
"zz.zz.zz.zz"
]
Теперь, если удаленный адрес равен xx.xx.xx.xx
, вы можете увидеть, что сравнение с xx.xx.xx.xx\n
будет ложным , К счастью, использование trim($line)
удалит любую новую строку или символы пробела в начале или конце строки. Вы также можете использовать флаг FILE_IGNORE_NEW_LINES
, чтобы сообщить методу file
обрезать каждую строку для вас при чтении ее в массив.