PHP если не заявления - PullRequest
       18

PHP если не заявления

13 голосов
/ 31 июля 2010

Возможно, так настроен мой сервер, но я бьюсь головой о стену.То, что я пытаюсь сделать, это сказать, что если $action не имеет значения или имеет значение, которое не «добавить» или «удалить», то, если есть ошибка, продолжайте запускать скрипт.Тем не менее, я получаю сообщение об ошибке, независимо от того, что $action.

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

$action устанавливается правильно, и если запустить что-то вроде if($action =="add"), это работает.Это на моем локальном хосте, поэтому может быть проблема с настройкой.

Ответы [ 7 ]

24 голосов
/ 31 июля 2010

Ваша логика слегка отключена. Второй || должен быть &&:

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)

Oops! Условие просто выполнено и напечатано «ошибка», но оно должно было завершиться неудачей. Фактически, если вы подумаете об этом, независимо от значения $action, один из двух тестов != вернет true. Переключите || на &&, а затем строка с последней до последней становится if (true && false), что должным образом уменьшается до if (false).

Между прочим, есть способ использовать || и выполнить тестовую работу. Вы должны отрицать все остальное, используя закон де Моргана , т. Е .:

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

Вы можете прочитать это по-английски как «если действие не (добавить или удалить), то».

10 голосов
/ 31 июля 2010

Независимо от того, что такое $ action, оно всегда не будет «добавлять» ИЛИ не будет «удалять», поэтому условие if всегда выполняется. Вам нужно использовать && вместо ||:

(!isset($action)) || ($action !="add" && $action !="delete"))
3 голосов
/ 31 июля 2010

Вы также можете попробовать:

if ((!isset($action)) || !($action == "add" || $action == "delete")) {
  // Do your stuff
}
3 голосов
/ 31 июля 2010

Вы говорите "если он не установлен или отличается от добавления или отличается от удаления". Вы понимаете, что a != x && a != y с x != y обязательно false, поскольку a не может быть одновременно двумя разными значениями.

0 голосов
/ 31 июля 2010

не ответ, а просто ради форматирования кода

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

note exit; оператор после header (). это важная вещь header () не прекращает выполнение скрипта

0 голосов
/ 31 июля 2010
if( !( isset($action)  && ($action =="add" || $action =="delete" )) )


я думаю, что это лучший и самый простой способ сделать это

0 голосов
/ 31 июля 2010

для дальнейшего использования, вы можете быстро создать таблицу истинности, чтобы проверить, оценивает ли она, как вы хотите ... это похоже на судоку.

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

пример:

column 1 is issetaction, column 2 and 3 evaluates !="add","delete" respectively</p> <p>if($a=add) T && (F && T) => T && F => FALSE</p> <p>if($a=delete) T && (T && F) => T && F => FALSE</p> <p>if($a=nothing) T && (T && T) => T && T => TRUE

...