views:

93

answers:

7

So this may be the way my server is set up but I'm banging my head agianst the wall. What I'm trying to do is say that if $action has no value or has a value that is not "add" or "delete" than have an error else keep running the script. However, I get an error no matter what $action is.

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

$action is being set properly and if run something like if($action =="add") it works. This is on my local host so could be a setting issue.

+6  A: 

Your logic is slightly off. The second || should be &&:

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

You can see why your original line fails by trying out a sample value. Let's say $action is "delete". Here's how the condition reduces down step by step:

// $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)

Oops! The condition just succeeded and printed "error", but it was supposed to fail. In fact, if you think about it, no matter what the value of $action is, one of the two != tests will return true. Switch the || to && and then the second to last line becomes if (true && false), which properly reduces to if (false).

There is a way to use || and have the test work, by the way. You have to negate everything else using De Morgan's law, i.e.:

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

You can read that in English as "if action is not (either add or remove), then".

John Kugelman
A: 

You're saying "if it's not set or it's different from add or it's different from delete". You realize that a != x && a != y, with x != y is necessarily false since a cannot be simultaneously two different values.

Artefacto
+5  A: 

No matter what $action is, it will always either not be "add" OR not be "delete", which is why the if condition always passes. What you want is to use && instead of ||:

(!isset($action)) || ($action !="add" && $action !="delete"))
yjerem
sorry , i donot think this is right way
Extjs Commander
@dumbledor I think this was the easiest way to modify my original code and explain what I did wrong.
BandonRandon
A: 
ina
A: 
if( !( isset($action)  && ($action =="add" || $action =="delete" )) )


i think this is the best and easiest way to do it

Extjs Commander
A: 

not an answer but just in sake of code formatting

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

note exit; statement after header(). that's important thing. header() do not terminate script execution

Col. Shrapnel
+1  A: 

You could also try :

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