这可能是我的服务器设置方式,但我正在撞墙。我要做的是说,如果$action
没有值或者具有不是“添加”或“删除”的值而不是有错误,那么继续运行脚本。但是,无论$action
是什么,我都会收到错误。
$action= $_GET['a'];
if((!isset($action)) || ($action !="add" || $action !="delete") ){
//header("location:index.php");
echo "error <br>";
}
正确设置了 $action
,如果运行if($action =="add")
之类的话,则可以正常运行。这是在我的本地主机上,因此可能是设置问题。
答案 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()不终止脚本执行