Ваша логика слегка отключена. Второй ||
должен быть &&
:
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"))
Вы можете прочитать это по-английски как «если действие не (добавить или удалить), то».