PHP if not statements

后端 未结 7 2065
南方客
南方客 2020-12-17 10:46

This may be the way my server is set up, but I\'m banging my head against the wall. I\'m trying to say that if $action has no value or has a value that is not \

相关标签:
7条回答
  • 2020-12-17 11:09

    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".

    0 讨论(0)
  • 2020-12-17 11:09

    You could also try:

    if ((!isset($action)) || !($action == "add" || $action == "delete")) {
      // Do your stuff
    }
    
    0 讨论(0)
  • 2020-12-17 11:10

    For future reference, you can quickly create a truth table to check if it evaluates the way you want... it's kind of like Sudoku.

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

    Example:

    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

    0 讨论(0)
  • 2020-12-17 11:11

    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"))
    
    0 讨论(0)
  • 2020-12-17 11:12

    Not an answer, but just for the 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 the exit; statement after header(). That's the important thing. header() does not terminate script execution.

    0 讨论(0)
  • 2020-12-17 11:17

    I think this is the best and easiest way to do it:

    if (!(isset($action) && ($action == "add" || $action == "delete")))
    
    0 讨论(0)
提交回复
热议问题