【问题标题】:If inside of foreach always returns false如果 foreach 内部总是返回 false
【发布时间】:2018-09-05 07:07:48
【问题描述】:

我正在研究一组例程,这些例程将根据已知支持者列表检查访问者的 IP 地址。 IF 语句总是返回失败,即使我将 ip 设置为已知错误的 ip。任何帮助将不胜感激。

$toratora="NO DNSBL";

$filename = 'converted.txt';
$contents = file($filename);

foreach($contents as $line):
$newline = ("$line "); //Add a space after each ip.
//If (int) is in front of $newline & $ip, then always true.
//If (int) is not in front of $newline & $ip, then always false.
if ($line == $ip): 
$toratora="YES DNSBL";
endif; 
endforeach;

【问题讨论】:

  • 查看$line$newline的目的是什么?还有什么是$ip(没有这个值就无法回答)另外我讨厌替代语法风格,非{}在代码中,它在HTML中要好得多......但这是一种观点。 ("$line ") 也不需要 ()
  • 又名,如果不说谎的话。因此,我没有看到任何语法错误,您的两个值不相等。这就是简单的答案......
  • 尝试在$line$ip 中使用trim()$line == $ip 中作为trim($line) == ($ip),因为其中可能有空格,这就是它返回错误的原因。
  • 您需要提供更多信息才能获得有用的信息。尝试调试代码,至少在某些值上使用 var_dump 并检查为什么比较总是返回 false。可能是空格、回车……
  • 大家好。谢谢大家的回复。 ip 来自 $_SERVER['REMOTE_ADDR']; ...我得到的 rsync 文件是绑定格式的,所以它都是一条连续的线。这就是我添加 $newline 的原因,所以文件中每个 ip 后面都会有一个空格。对困惑感到抱歉。它应该是 $newline==$ip。

标签: php if-statement foreach


【解决方案1】:

问题在于您的 $line 值,如果您查看 file() 的手册,您会看到

数组的每个元素对应于文件中的一行,带有 换行符仍然附加

由于您的 $ip 变量(我猜)最后没有换行符,比较将失败。正如 cmets 中所建议的,您应该同时修剪 $line 和 $ip 即

if (trim($line) == trim($ip)): 
$toratora="YES DNSBL";
endif; 

【讨论】:

  • 谢谢!那行得通。 if 语句需要“修剪”是一个常见问题吗?
  • 不,在这种情况下您只需要修剪,因为其中一个或两个值的两端都可能有空格,而 == 是完全匹配的,因此两个值上的不同空格将不匹配.如果这解决了您的问题,请将其标记为已接受。谢谢...
  • 像魅力一样工作。再次感谢您。
猜你喜欢
  • 1970-01-01
  • 2023-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
  • 2016-07-20
  • 2021-11-05
相关资源
最近更新 更多