Возможно, так настроен мой сервер, но я бьюсь головой об стену. Я пытаюсь сделать так: если $action
не имеет значения или имеет значение, которое не является "add" или "delete", то произойдет ошибка, в противном случае скрипт будет выполняться. Однако я получаю ошибку независимо от того, какое значение имеет $action
.
$action= $_GET['a'];
if((!isset($action)) || ($action !="add" || $action !="delete") ){
//header("location:index.php");
echo "error <br>";
}
$action
устанавливается правильно, и если запустить что-то вроде if($action =="add")
, то все работает. Это происходит на моем локальном хосте, поэтому может быть проблемой настройки.
Ваша логика немного нарушена. Второе ||
должно быть &&
:
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)
Упс! Условие только что выполнилось и напечатало "ошибку", но оно должно было завершиться неудачей. На самом деле, если подумать, независимо от значения $action
, один из двух тестов !=
вернет true. Поменяйте ||
на &&
, и тогда предпоследняя строка станет if (true && false)
, которая правильно сводится к if (false)
.
Кстати, есть способ использовать ||
и заставить тест работать. Вы должны отрицать все остальное, используя закон Де Моргана, то есть:
if ((!isset($action)) || !($action == "add" || $action == "delete"))
На английском это можно прочитать как "if action is not (either add or remove), then".
Независимо от того, каким будет $action, оно всегда будет либо не "добавлять", либо не "удалять", поэтому условие if всегда проходит. Вы хотите использовать && вместо ||:
(!isset($action)) || ($action !="add" && $action !="delete"))
Вы говорите "если оно не задано, или оно отличается от add, или оно отличается от delete". Вы понимаете, что a != x && a != y
, при x != y
обязательно ложно
, так как a
не может быть одновременно двумя разными значениями.