Это может быть способом, которым настраивается мой сервер, но я ударяю головой о стену. Я пытаюсь сказать это если $action
не имеет никакого значения или имеет значение, которое не является, "добавляют" или "удаляют", затем имеют ошибку, еще продолжают управлять сценарием. Однако я получаю ошибку независимо от того, что $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
- это «удалить»
. Вот как условие уменьшается шаг за шагом:
// $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"))
]. Вы можете прочитать это по-английски как «если действия нет (добавить или удалить), то».
Независимо от того, что такое $ action, оно всегда либо не будет «добавить», либо не будет «удалить», поэтому условие if всегда выполняется. Вы хотите использовать && вместо ||:
(!isset($action)) || ($action !="add" && $action !="delete"))
Вы говорите «если он не установлен или отличается от добавления или отличается от удаления». Вы понимаете, что a! = X && a! = Y
, с x! = Y
обязательно false
, поскольку a
не может быть одновременно два разных значения.
Не ответ, но просто для форматирования кода
if((isset($_GET['a'])) $action=$_GET['a']; else $action ="";
if(!($action === "add" OR $action === "delete")){
header("location: /index.php");
exit;
}
Обратите внимание на оператор exit;
после header (). Это важная вещь. header () не прекращает выполнение скрипта.
Для дальнейшего использования вы можете быстро создать таблицу истинности, чтобы проверить, оценивает ли она так, как вы хотите ... это вроде как Судоку .
(!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 => ИСТИНА
Вы также можете попробовать:
if ((!isset($action)) || !($action == "add" || $action == "delete")) {
// Do your stuff
}
Я думаю, что это самый лучший и простой способ:
if (!(isset($action) && ($action == "add" || $action == "delete")))