php如果不是陈述

时间:2010-07-31 05:29:02

标签: php if-statement conditional-operator

这可能是我的服务器设置方式,但我正在撞墙。我要做的是说,如果$action没有值或者具有不是“添加”或“删除”的值而不是有错误,那么继续运行脚本。但是,无论$action是什么,我都会收到错误。

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

$action,如果运行if($action =="add")之类的话,则可以正常运行。这是在我的本地主机上,因此可能是设置问题。

7 个答案:

答案 0 :(得分:23)

你的逻辑略有偏差。第二个||应为&&

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。将||切换为&&,然后第二行到最后一行变为if (true && false),其正确缩小为if (false)

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

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

你可以用英语读作“如果动作不是(添加或删除),那么”。

答案 1 :(得分:9)

无论$ action是什么,它总是不是“add”或者不是“delete”,这就是if条件总是通过的原因。你想要的是使用&amp;&amp;而不是||:

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

答案 2 :(得分:3)

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

答案 3 :(得分:3)

您也可以尝试:

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

答案 4 :(得分:0)

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

(!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 => FALSE

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

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

答案 5 :(得分:0)

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


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

答案 6 :(得分:0)

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

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

在header()之后注意exit;语句。这很重要。 header()不终止脚本执行