проверка isset внутри цикла foreach

Приносим извинения, если это глупый вопрос, но я изучаю PHP прямо сейчас, и у меня возникла проблема с выполнением проверки isset для значения $ _POST, которое может существовать или не существовать в зависимости от того, отправил ли пользователь форму или нет .

Если я сделаю следующее вне контекста цикла foreach, я получу сообщение с неопределенным индексом (когда форма еще не отправлена), как я и ожидал:

if ($_POST['dorm'] == "somethingrandom"){ ... }

Насколько я понимаю, я получаю эту ошибку, потому что значение $ _POST не существует, и мне нужно запустить его с помощью проверки isset () или! Empty () вместо того, чтобы просто предполагать, что оно существует. Но если у меня есть точно такой же код внутри цикла foreach, я не получаю сообщение об ошибке:

<form action="test.php" method="post">
<select name="dorm">
<?php foreach ($DORMS as $dorm){
    if ($_POST['dorm'] == $dorm){
        echo "<option selected value=\"$dorm\">$dorm</option>";
    } else {
        echo "<option value=\"$dorm\">$dorm</option>";
    }
}
?> // end php tag
</select>
</form>

Опять же, приведенный выше код не создает ошибок, хотя я не выполняю никаких проверок isset () или! Empty (). Мне просто интересно, является ли это ожидаемым поведением, и если да, то почему?

Будем признательны за любые разъяснения! Спасибо.


person Joe    schedule 31.12.2013    source источник
comment
Я получаю неопределенный индекс внутри И вне циклов foreach, как и ожидалось, используя php 5.3.10. Какую версию ты используешь?   -  person Marc B    schedule 31.12.2013
comment
в каждом цикле может быть ничего нет .. :)   -  person user1844933    schedule 31.12.2013
comment
Не могли бы вы просто повторить значения $ _POST ['dorm'] и $ dorm в цикле foreach, тогда вы сможете узнать, какие значения приходят.   -  person Ravichandran Jothi    schedule 31.12.2013
comment
Вы пропустили закрытый тег php после закрывающей скобки оператора if.   -  person Microbe    schedule 31.12.2013
comment
ваш foreach dosent работает на этот раз   -  person Arun Killu    schedule 31.12.2013
comment
проверьте мой ответ. если у вас есть какие-либо проблемы, сообщите мне. я помогу тебе @ user927839   -  person Padmanathan J    schedule 31.12.2013
comment
$ DORMS - это набор, который я установил, который включает 9 разных названий общежитий. Извините, я не включил его выше, но он есть в моем коде. И я знаю, что он проходит цикл, потому что поле выбора правильно отображается на странице. Спасибо, Натан, за то, что нашли время предложить этот пример, но сейчас я больше озабочен выяснением, почему я получаю undefined вне цикла foreach, а не внутри него. Марк: Я использую PHP 5.4.12 локально в WAMP. Спасибо, ребята, за все ответы!   -  person Joe    schedule 31.12.2013
comment
Всем, кому интересно, ответ chanchal118 помог мне понять это. По какой-то причине уведомление не появляется на отображаемой странице, когда ошибка возникает внутри моего цикла foreach. Но если вы посмотрите на исходный код страницы в Firebug, ошибки есть. Еще раз спасибо всем за помощь. Пока не разрешено голосовать, иначе я бы стал.   -  person Joe    schedule 31.12.2013
comment
@ user927839 Вы можете принять ответ, если считаете, что это правильно.   -  person chanchal118    schedule 31.12.2013


Ответы (6)


Если $DORMS пуст, внутри foreach не ожидается никаких уведомлений или ошибок. Код внутри foreach не выполняется, если $DORMS пуст. Если у вас есть значение в $DORMS, вы можете увидеть это уведомление, используя инструменты разработчика Chrome или firebug.

введите описание изображения здесь

РЕДАКТИРОВАТЬ

Уведомление не имеет ничего общего с циклом foreach. Вы не видите уведомления, потому что оно создается внутри элемента <select> в html. Браузер не отображает нормальный текст внутри <select>. Если бы ваш foreach цикл находился внутри элемента <p> html, вы могли бы увидеть это сообщение, когда браузер выведет его.

<p>
<?php foreach ($DORMS as $dorm){
    if ($_POST['dorm'] == $dorm){
        echo "<option selected value=\"$dorm\">$dorm</option>";
    } else {
        echo "<option value=\"$dorm\">$dorm</option>";
    }
}
?>
</p>
person chanchal118    schedule 31.12.2013
comment
Спасибо за комментарий. $ DORMS - это массив с присвоенными ему 9 строками. И я почти уверен, что код foreach выполняется, потому что элемент select правильно отображается на странице. Я просто не получаю сообщение об ошибке, как я ожидал. - person Joe; 31.12.2013
comment
Затем вы можете увидеть это сообщение об ошибке с помощью инструментов firebug или chrome dev. Он находится внутри исходного кода страницы. - person chanchal118; 31.12.2013
comment
Да, ты прав! Ошибки обнаруживаются в firebug. Просто странно, что уведомление появляется на странице, когда код находится вне цикла foreach, но не когда он внутри. Спасибо за вашу помощь! - person Joe; 31.12.2013
comment
Это не странно. Если бы этот цикл foreach находился внутри тега <p> html, вы могли бы увидеть это сообщение. Он находится внутри <select>. Обычный текст внутри select не отображается в браузере. - person chanchal118; 31.12.2013
comment
Думаю, я имел в виду, что это было странно для меня. Но теперь, когда вы это объяснили, в этом есть большой смысл. Еще раз спасибо! - person Joe; 31.12.2013

вы можете проверить, отправлена ​​ли форма методом POST, двумя способами

if($_POST){
   ...
}

or

if(isset($_POST['your_variable'])){
   ...
}
person Yogesh Gupta    schedule 31.12.2013
comment
Спасибо, Йогеш. В этом есть смысл, но я пытаюсь понять, почему я не получаю неопределенное уведомление, когда не выполняю проверку внутри цикла foreach. - person Joe; 31.12.2013
comment
На самом деле он выдает предупреждающее сообщение, но, поскольку вы использовали тег select, предупреждающее сообщение появляется под ним. Поскольку тег select предназначен для отображения только содержащегося тега option, текст (здесь предупреждающее сообщение), кроме тегов option, игнорируется. - person Yogesh Gupta; 31.12.2013

Это может происходить из-за того, что он не попадает в цикл.

person Érycson Nóbrega    schedule 31.12.2013

Попробуй это

  <?php
    if (isset($_POST['dorm'])) 
  {
    $DORMS = $rows; //array from database
    foreach($DORMS  as $dorm){
         if($row['dorm'] == $_POST['dorm']){
              $isSelected = ' selected="selected"'; // if the option submited in form is as same as this row we add the selected tag
         } else {
              $isSelected = ''; // else we remove any tag
         }
         echo "<option value='".$row['id']."'".$isSelected.">".$row['name']."</option>";
       }
  }
    ?>
person Padmanathan J    schedule 31.12.2013

Единственная причина этого может быть в том, что массив $DORMS пуст. В этом случае цикл foreach никогда не выполнит тело, поэтому он никогда не будет пытаться получить доступ к несуществующему $_POST['dorm'].

Что вам нужно сделать, так это установить другую переменную для выбранного общежития и защитить это с помощью isset проверки:

$dorm_input = isset($_POST['dorm']) ? $_POST['dorm] : null;

Затем в вашем цикле проверьте if ($dorm == $dorm_input)

person Barmar    schedule 31.12.2013
comment
А как насчет случая по умолчанию, когда публикация не выполняется. В этом случае выбор не будет создан. - person kuldeep.kamboj; 31.12.2013
comment
Спасибо, Бармар, за ваш ответ. В этом есть смысл, и я уверен, что это сработает. Я просто пытаюсь концептуально понять, почему я не получаю сообщение об ошибке, если я не выполняю проверку isset внутри цикла foreach. Я не включил его в свой исходный пост, но массив $ DORMS имеет присвоенные ему 9 строковых значений. Я почти уверен, что цикл foreach выполняется, потому что выбор правильно отображается на странице. - person Joe; 31.12.2013

Как говорят другие, пустые $ DORMS могут быть причиной того, что вас не заметили. Для проверки вашего кода вы можете сделать что-то вроде.

if (is_array($DORMS) && sizeof($DORMS) > 0) {
    foreach ($DORMS as $dorm) {
        if (isset($_POST['dorm']) && $_POST['dorm'] == $dorm){
            echo "<option selected value=\"$dorm\">$dorm</option>";
        } else {
            echo "<option value=\"$dorm\">$dorm</option>";
        }
    }
}
person kuldeep.kamboj    schedule 31.12.2013