Если оператор с && и несколькими условиями ИЛИ в PHP

1

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

Я пытаюсь отобразить сообщение об ошибке для формы заказа, если хотя бы одно текстовое поле не заполнено. Ниже приведен фрагмент моего PHP-кода. "CookieGiftBox" - это имя флажка, который пользователи могут выбрать, и если он выбран, они должны ввести количество файлов cookie в соответствии с их желаемыми вкусами в текстовых полях. Как я могу отобразить сообщение об ошибке, которое будет отображаться при выборе флажка IS, но никакие текстовые поля не были заполнены?

<?php
    if (isset($_POST['cookieGiftBox'])
        && (!isset($_POST['sugar']) 
            || ($_POST['chocolateChip'])
            || ($_POST['chocolateChipPecan']) 
            || ($_POST['whiteChocolateRaspberry'])
            || ($_POST['peanutChocolateChip']) 
            || ($_POST['peanutButter'])
            || ($_POST['tripleChocolateChip']) 
            || ($_POST['whiteChocolateChip'])
            || ($_POST['oatmealRaisin']) 
            || ($_POST['cinnamonSpice'])
            || ($_POST['candyChocolateChip']) 
            || ($_POST['butterscotchToffee'])
            || ($_POST['snickerdoodle']))) {
        $error.="<br />Please enter an Amount for Cookie Flavors";
    }
?>
Теги:
if-statement
isset

2 ответа

1
Лучший ответ

&& имеет приоритет над ||, поэтому вам нужно будет использовать круглые скобки для получения ожидаемого результата:

if (isset($_POST['cookieGiftBox']) && (!isset($POST['sugar']) ||...)

На самом деле, чтобы проверить, выбрано ли ничего, вы сделали бы что-то вроде этого: if checkbox is checked and not (sugar is checked or chocolatechip is checked) или эквивалент: if checkbox is checked and sugar is not entered and chocolatechip is not entered... Если вы хотите узнать больше, найдите информацию о булевой алгебре.

Обновление: в вашем примере и в правильном синтаксисе предложение, которое я принял в качестве примера, должно понравиться (для первого предложения обратите внимание на не (!) И круглые скобки вокруг полей, а не на флажок):

if (isset($_POST['cookieGiftBox']) &&
    !(
       isset($_POST['sugar']) ||
       isset($_POST['chocolatechip'])
     )
) { error ...}

Или второе предложение, которое может быть проще понять (обратите внимание на && вместо ||):

if (isset($_POST['cookieGiftBox']) &&
    !isset($_POST['sugar']) &&
    !isset($_POST['chocolatechip'])
) { error...}

Использование ands гарантирует, что это правда (и, таким образом, показывает ошибку), если ни один из полей сахара, шоколада и т.д. Не установлен, когда флажок подарочного флажка установлен. Поэтому, если флажок установлен, и никакие поля не заданы, он выглядит так: (true && !false && !false) что эквивалентно (true && true && true) которое true, поэтому оно показывает ошибку. Если флажок установлен и введен сахар, он будет выглядеть так: (true && !true && !false), equ. to (true && false && true), equ. на false и, таким образом, ошибка не отображается. Если введены как сахар, так и шоколад, также ошибка не будет показана.

  • 0
    Я ценю ответ, однако я не смог заставить его работать. Исходя из вашего примера, я считаю, что у меня есть все скобки в правильных местах. if (isset($_POST['cookieGiftBox']) && (!$_POST['sugar']) || (!$_POST['chocolateChip'])) { вот сокращенная версия того, что у меня есть. Этот код отображает ошибку, если флажок установлен и текст не введен в поля. Однако для очистки сообщения об ошибке необходимо заполнить оба текстовых поля 'sugar' и 'chocolateChip'. Я хотел бы иметь его, где нужно заполнить только одно поле. Итак, один ИЛИ другой ... Как я могу это сделать? Спасибо
  • 0
    Ваше условие истинно, если либо шоколадный чип не установлен, либо установлен флажок, а сахар не установлен (переводится один в один). Я обновил ответ двумя способами решения вашей проблемы.
Показать ещё 2 комментария
0

У меня проблема simillar:

Я стараюсь использовать:

if (isset($this->context->controller->php_self) && ($this->context->controller->php_self != 'category') || ($this->context->controller->php_self != 'product') || ($this->context->controller->php_self != 'index')){... }

То не работало, я изменяю его к:

if (isset($this->context->controller->php_self) && ($this->context->controller->php_self != 'category') && ($this->context->controller->php_self != 'product') && ($this->context->controller->php_self != 'index')){... }

Я не знаю, что это правильно?

Редактировать. Это неверно, но пока я не знаю, как это исправить.

Сообщество Overcoder
Наверх
Меню