【问题标题】:if statement returns false even if it's notif 语句返回 false,即使它不是
【发布时间】:2012-05-11 17:59:21
【问题描述】:

我这里有这个小sn-p,即使它满足if 语句,它也会返回false

$urls = $_POST['links'];
    trim($urls);
$urls = explode("\r\n",$urls);
foreach($urls as $url){
    trim($url);
    if(strpos($url,'http://') === false)
        $url = 'http://'.$url;
    $parse = parse_url($url, PHP_URL_HOST);
    if(($parse != 'site.com') || ($parse != 'www.site.com')) //problem here
        echo 'false:'.$parse.'<br>';
    else
        echo 'true:'.$parse;
}

输入来自文本区域:

http://site.com
site.com
http://www.site.com
www.site.com

输出:

true:site.com
true:site.com
false:www.site.com
false:www.site.com

你认为是什么问题?

【问题讨论】:

  • 给您一个小提示:您可以在 GET 和 POST 参数中使用数组,例如 var[0]=abc&var[1]=def 您的 explode 构造有点不安全。
  • @peipst9lker 抱歉,我没明白你的意思,你能解释一下吗?
  • @peipst9lker 我不确定这会有所帮助,因为这 4 行似乎都来自同一个文本区域。我也不确定爆炸是否像您建议的那样不安全。但是,我确实认为他应该使用“\n”作为分隔符而不是“\r\n”。
  • 您应该建议一种安全的方法吗?
  • @peipst9lker @jedwards 我看到了answer here,他推荐了\r\n

标签: php if-statement


【解决方案1】:

我不确定你的真正意图,但下面这行肯定是错误的:

    if(($parse != 'site.com') || ($parse != 'www.site.com')) //problem here

这将始终返回 true,因为如果 parse 不是 'site.com' 则为 true,但如果 parse 不是 'www.site.com' 也为 true,因为它不能同时是它们两者,它必须始终为真。你的意思是 && 而不是 ||?即,逻辑与而不是逻辑或?

if(($parse != 'site.com') && ($parse != 'www.site.com')) 

编辑:实际上,如果您在问题中提出的是期望的行为,即 site.com 为 true,www.site.com 为 false,那么您只需要:

if ($parse == 'site.com')
{
    echo 'false:'.$parse;
}
else if ($parse == 'www.site.com')
{
    echo 'false:'.$parse;
}

也许这不是你真正想要的......

【讨论】:

  • 我在想什么?我的逻辑很差。谢谢
【解决方案2】:

想想你在第二个 if 语句中使用的逻辑。不管$parse 是什么,你总会落入if 分支。 (也就是说,你永远不会落入else 分支。)

考虑以下替代方案:

// "Not A AND Not B"
if(($parse != 'site.com') && ($parse != 'www.site.com'))
// ...

// "Neither A nor B"
if(!(($parse == 'site.com') || ($parse == 'www.site.com')))
// ...

// "Either A or B"
if(($parse == 'site.com') || ($parse == 'www.site.com'))
    echo 'true:'.$parse;
else
    echo 'false:'.$parse.'<br>';
// Note here we also swapped the two branches.

【讨论】:

    【解决方案3】:

    将 if 行改为:

    if(($parse != 'site.com') && ($parse != 'www.site.com'))
    

    【讨论】:

      【解决方案4】:

      替换这一行:

      if(($parse != 'site.com') && ($parse != 'www.site.com'))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-11
        • 2020-08-09
        • 1970-01-01
        • 1970-01-01
        • 2019-08-26
        • 1970-01-01
        • 1970-01-01
        • 2014-09-04
        相关资源
        最近更新 更多