PHP, если не операторы

Это может быть способом, которым настраивается мой сервер, но я ударяю головой о стену. Я пытаюсь сказать это если $action не имеет никакого значения или имеет значение, которое не является, "добавляют" или "удаляют", затем имеют ошибку, еще продолжают управлять сценарием. Однако я получаю ошибку независимо от того, что $action .

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

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

15
задан Peter Mortensen 23 November 2019 в 21:35
поделиться

7 ответов

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

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

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

// $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 , один из двух ! = тестов вернет истину. Переключите || на && , а затем предпоследняя строка станет if (true && false) , что должным образом сокращается до if (false) .

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

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

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

26
ответ дан 1 December 2019 в 00:49
поделиться

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

(!isset($action)) || ($action !="add" && $action !="delete"))
10
ответ дан 1 December 2019 в 00:49
поделиться

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

3
ответ дан 1 December 2019 в 00:49
поделиться

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

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

Обратите внимание на оператор exit; после header (). Это важная вещь. header () не прекращает выполнение скрипта.

0
ответ дан 1 December 2019 в 00:49
поделиться

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

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

Пример:

столбец 1 issetaction, столбец 2 и 3 оценивают! = "Add", "delete" соответственно

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

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

if ($ a = ничего) T && (T && T) => T && T => ИСТИНА

0
ответ дан 1 December 2019 в 00:49
поделиться

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

if ((!isset($action)) || !($action == "add" || $action == "delete")) {
  // Do your stuff
}
3
ответ дан 1 December 2019 в 00:49
поделиться

Я думаю, что это самый лучший и простой способ:

if (!(isset($action) && ($action == "add" || $action == "delete")))
0
ответ дан 1 December 2019 в 00:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: