【问题标题】:PHP if not statementsPHP if not 语句
【发布时间】:2011-03-23 13:27:07
【问题描述】:

这可能是我的服务器的设置方式,但我的头撞到了墙上。我想说的是,如果$action 没有值或没有“添加”或“删除”的值,则出现错误,否则继续运行脚本。但是,无论$action 是什么,我都会收到错误消息。

 $action = $_GET['a'];
 if((!isset($action)) || ($action != "add" || $action != "delete")){
     //header("location:index.php");
     echo "error <br>";
 }

$action 设置正确,如果运行类似if($action =="add") 的东西,它可以工作。这是在我的本地主机上,所以可能是设置问题。

【问题讨论】:

  • 如果你在上一行设置了$action,那么检查是否设置了是没有意义的
  • 弹片,如果 url 的 "?a=xxx" 部分中没有任何内容,则 $action 应该为空。我想如果我将$action 设置为静态变量,那你是对的。然而,因为用户输入数据,所以有可能出现问题。如果我错了,请纠正我。
  • 哎呀,我的错。 isset() 在空变量上返回 false。无论如何,您应该检查是否设置了 $_GET['a'],而不是 $action。否则你会得到“未定义的索引”错误。
  • 您能解释一下“未设置索引”的错误吗?我从来没有听说过。
  • error_reporting(E_ALL);

标签: php if-statement conditional-operator


【解决方案1】:

你的逻辑有点不对劲。第二个|| 应该是&amp;&amp;

if ((!isset($action)) || ($action != "add" && $action != "delete"))

您可以通过尝试示例值来了解原始行失败的原因。假设$action"delete"。以下是病情逐步降低的方法:

// $action == "delete"
if ((!isset($action)) || ($action != "add" || $action != "delete"))
if ((!true) || ($action != "add" || $action != "delete"))
if (false || ($action != "add" || $action != "delete"))
if ($action != "add" || $action != "delete")
if (true || $action != "delete")
if (true || false)
if (true)

哎呀!条件刚刚成功并打印了“错误”,但它应该失败。事实上,仔细想想,无论$action 的值是多少,!= 的两个测试之一都会返回 true。将|| 切换为&amp;&amp;,然后倒数第二行变为if (true &amp;&amp; false),适当缩减为if (false)

顺便说一句,有一种方法可以使用|| 并进行测试。您必须使用De Morgan's law 否定其他所有内容,即:

if ((!isset($action)) || !($action == "add" || $action == "delete"))

您可以用英文将其理解为“如果操作不是(添加或删除),那么”。

【讨论】:

    【解决方案2】:

    无论 $action 是什么,它总是要么不是“添加”,要么不是“删除”,这就是 if 条件总是通过的原因。你想要的是使用 && 而不是 ||:

    (!isset($action)) || ($action !="add" && $action !="delete"))
    

    【讨论】:

    • @dumbledor 我认为这是修改我的原始代码并解释我做错了什么的最简单方法。
    【解决方案3】:

    您是在说“如果它没有设置或者它与添加不同或与删除不同”。您意识到a != x &amp;&amp; a != yx != y 必然是false,因为a 不能同时是两个不同的值。

    【讨论】:

      【解决方案4】:

      你也可以试试:

      if ((!isset($action)) || !($action == "add" || $action == "delete")) {
        // Do your stuff
      }
      

      【讨论】:

        【解决方案5】:

        为了将来参考,您可以快速创建一个真值表来检查它是否按照您想要的方式进行评估...有点像Sudoku

        (!isset($action)) && ($action != "add" && $action != "delete"))
        

        例子:

        column 1 is issetaction, column 2 and 3 evaluates !="add","delete" respectively

        if($a=add) T && (F && T) => T && F => 假

        if($a=delete) T && (T && F) => T && F => FALSE

        if($a=nothing) T && (T && T) => T && T => 真

        【讨论】:

          【解决方案6】:

          我认为这是最好和最简单的方法:

          if (!(isset($action) && ($action == "add" || $action == "delete")))
          

          【讨论】:

            【解决方案7】:

            不是答案,只是为了代码格式化

            if((isset($_GET['a'])) $action=$_GET['a']; else $action ="";
            if(!($action === "add" OR $action === "delete")){
              header("location: /index.php");
              exit;
            }
            

            注意 header() 之后的 exit; 语句。这才是最重要的。 header() 不会终止脚本执行。

            【讨论】:

              猜你喜欢
              • 2021-10-20
              • 2012-06-05
              • 2017-06-26
              • 2012-01-03
              • 2017-10-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多