【问题标题】:php: compound if statement (is being ignored)php:复合 if 语句(被忽略)
【发布时间】:2011-05-17 21:10:21
【问题描述】:

如果子域不是“mobile”并且文件名不是“design”或“photo”,我想回显某些内容,因此回显 if(不是“mobile”而不是“design”)或(不是“mobile”而不是“照片”)。

我写的代码是:

<?php
    if ( ($subdomain != mobile) && ($currentFileName != design || $currentFileName != photo) ) {
        echo ('code')
    }
?>

但它不喜欢复合语句。如果我只是做($subdomain!=mobile) 它可以工作;如果我只是做($currentFileName!=design) 它可以工作;如果我只是做($currentFileName!=photo) 它可以工作...... 上面的代码不会导致错误……它只是什么都不做。

有没有一种特殊的方法来复合/分组我只是没有得到的陈述?我觉得这应该不难(而且我已经用 php 完成了更复杂的事情而没有这么多麻烦……)。 我在此之后模仿了我的声明:http://www.php.net/manual/en/control-structures.if.php#101724

谢谢!

编辑: 仅供参考:

$subdomain = implode(array_slice(array_reverse(explode('.', $baseURL)),2)); //resolves to "test"
$basename = basename($_SERVER['REQUEST_URI']); //resolves to "design.php"
$currentFileName = basename($basename, ".php"); //resolves to "design"

新问题是子域“mobile”中的所有内容现在都被捕获,因此其中没有页面从 echo 获取“代码”(即使是那些不是“设计”或“照片”的页面)。

我最近尝试的代码是:

if ( ($subdomain != 'test' && $currentFileName != 'design') && ($subdomain!='test' && $currentFileName != 'photo') ) {
    echo ('ajax code');
}

但仍然没有骰子:(

【问题讨论】:

  • 还有echo之后的分号。
  • 你的 ||声明的一部分将失败。你说的东西不能同时是两个不同的东西,这总是正确的。

标签: php if-statement


【解决方案1】:

你的逻辑有缺陷。你很可能想要&amp;&amp; 而不是||。如果你考虑一下这个陈述,它就会变得很明显。假设以下场景:$currentFileName 是“设计”。它会过去,因为它不是“照片”。如果我们让 $currentFileName 等于 'photo' 它仍然会通过,因为它不等于 'design'。

编辑: 比较字符串时请使用引号。 PHP 将首先尝试查找具有该名称的常量,然后假定它是一个字符串,因为它没有找到。

【讨论】:

  • “移动”中的其他页面没有从回显中获取“代码”。我认为正在发生的事情是它到达 $subdomain != 'mobile' 并停止,因为子域是“移动”但页面不是“设计”或“照片”(它是“关于”)。我尝试像这样将这两个条件放在一起: if ( ($subdomain != 'mobile' && $currentFileName != 'design') && ($subdomain != 'mobile' && $currentFileName != 'photo') ) { echo ('ajax 代码'); } 但这不会使 ajax 代码显示在 subdomain="mobile" 对于不是“设计”或“照片”的页面:(
  • @Jacob 试试if (!($subdomain == "mobile" &amp;&amp; ($currentFileName == "design" || $currentFileName == "photo")))
  • 啊!你真是个天才。这就是我在 shell 脚本中所做的,但我不知道你可以用 php 做一个“如果不是”。哦,谢谢!
【解决方案2】:

|| 替换为&amp;&amp; - 应该有'AND'

if ( ($subdomain != 'mobile') && ($currentFileName != 'design' && $currentFileName != 'photo') ) {
        echo ('code');
    }

【讨论】:

  • @jacob:确保在别人看你有趣之前先去掉括号;)
【解决方案3】:

我知道应该是:

<?php
    if ($subdomain != 'mobile' && $currentFileName != 'design' && $currentFileName != 'photo') {
        echo ('code');
    }
?>

因为“或”可以匹配任何文件名,包括“设计”和“照片”。

好点,添加引号:)

【讨论】:

  • 我刚刚添加了 ';'在回声线中。
  • 顺便说一句,我最初有引号,但后来我得到一个语法解析错误,说 '"' 在第 63 行(引号所在的位置)是意外的。
【解决方案4】:

如果你在比较字符串,你应该引用它们。否则,它认为它们是常数。

试试:

<?php
if ( ($subdomain != 'mobile') && ($currentFileName != 'design' || $currentFileName != 'photo') ) {
  echo 'code';
}
?>

如果仍然无法按预期工作,请调试 $subdomain$currentFileName 以确保它们符合您的想法。

注意:根据 cmets,您的逻辑似乎也不正确。

【讨论】:

  • 我认为“或”是不对的,任何文件名都不等于其中之一,包括“设计”和“照片”。
  • @morgar,同意。但我不能说出用户的逻辑:)
  • 我刚刚在上面添加了这个,但是:$subdomain 解析为“test”或“m”(移动)。 $currentFileName 解析为“设计”或“照片”或“关于”(它是一个基本名称 - .php)
  • 不用担心。听起来你已经解决了上面的问题。反正我没有调整你的逻辑。
猜你喜欢
  • 2020-03-05
  • 1970-01-01
  • 2015-08-13
  • 2014-03-04
  • 1970-01-01
  • 1970-01-01
  • 2018-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多