Массив PHP через foreach для проверки

Я делаю учебник по PHP. Я нахожусь в разделе обновления урока CRUD и работаю над сценарием проверки. Я точно следовал коду ... Я думаю, но все еще не работает правильно. Вот проблема: когда я нажимаю «Отправить», чтобы попытаться проверить проверку с пустым полем имени меню, оно проходит без ошибок ... и обновляет навигацию с пустым элементом списка? Я просмотрел код, и все кажется правильным, но я очень новичок в этом, поэтому проблемы легко упускаются из виду.

Вот код:

if(isset($_POST['submit'])) {
    $errors = array();

    $required_fields = array('menu_name', 'position', 'visible');   
    foreach($required_fields as $fieldname) {
        if(!isset($_POST[$fieldname]) || (empty($_POST[$fieldname]) && $_POST[$fieldname] != 0) ) {
            $errors[] = $fieldname;
        }
    }

    if(empty($errors)) {
        //Perform Update
        $id = mysql_prep($_GET['subj']);
        $menu_name = mysql_prep($_POST['menu_name']);
        $position = mysql_prep($_POST['position']);
        $visible = mysql_prep($_POST['visible']);

        $query = "UPDATE subjects SET
                    menu_name = '{$menu_name}',
                    position = {$position},
                    visible = {$visible} WHERE id = {$id}";

        $result = mysql_query($query, $connection);

        if(mysql_affected_rows() == 1){
            // success
            $message = "Subject was sucessfully updated"; 
        }else{
            $message = "The subject update failed.";
            $message .= "<br />" . mysql_error();
        }
    }else{
        //error occured
        $message = "There were " . count($errors) . " errors in the form.";
    }
} // end if(isset($_POST['submit']) )
?>

И код из тела:

<h2>Edit Subject: <?php echo $sel_subject['menu_name']; ?></h2>
<?php 
    if(!empty($message)){
        echo "<p class=\"message\">" . $message . "</p>";
    }
?>
<?php
    if(!empty($errors)){
        echo "<p class=\"errors\">";
        echo "Please review the folowing fields: <br />";
        foreach($errors as $error){
            echo "-" . $error . "</p>";
        }
    }
?>

Теперь, когда я меняю (пусто($_POST[$fieldname]) на (пусто($_POST['menu_name']), он выдает ошибки, но они для позиции и видимых полей, которые оказались правильными...? пропущен символ, который я просто не вижу. Я в основном копировал и вставлял, чтобы предотвратить эти глупые ошибки.. Примечание: проверка позиции и видимости работает... я думаю... поскольку вы не можете оставить эти поля все равно пустые, откуда мне знать...

Любая помощь приветствуется.


person EZDC    schedule 16.08.2012    source источник
comment
Вы пытались повторить SQL-запрос, чтобы убедиться, что он выглядит так, как вы думаете?   -  person andrewsi    schedule 16.08.2012
comment
Можете ли вы дать больше информации, можете ли вы сделать var_dump($_POST) в верхней части кода и предоставить вывод?   -  person netigger    schedule 16.08.2012
comment
дамп дает мне это: массив 'menu_name' => строка '' (длина = 0) 'позиция' => строка '7' (длина = 1) 'видимый' => строка '1' (длина = 1) 'отправить ' =› строка 'Редактировать тему' (длина=12)   -  person EZDC    schedule 16.08.2012


Ответы (1)


Ошибка именно здесь:

$_POST[$fieldname] != 0

Пустая строка = 0, потому что 0 ложно. Итак, в вашем операторе if вы говорите, что он пуст (что есть) И НЕ равен 0 (что он и делает).

Что вы можете сделать, это

  1. Полностью отбросьте оператор !=0, так как пустой проверит это.
  2. Используйте правильный оператор: !=="0", если вы хотите принять "0" в качестве опции.

Когда вы используете 3 равенства или !==, он проверяет тип. 0===0 и 0==false, "0"==0, "0"==false и false===false, НО 0!==false, 0!=="0" и "0 "!==ложь. Я надеюсь, что в этом есть смысл.

ИЗМЕНИТЬ

Давайте углубимся в землю немного дальше, проведя серию тестов.

$a='';
$b="0";
if(empty($a))
    echo'$a is empty<br/>';
if(empty($b))
    echo'$b is empty<br/>';
if($a!=0)
    echo'$a does not equal 0/false<br/>';
if($b!=0)
    echo'$b does not equal 0/false<br/>';
if($a!==0)
    echo'$a does not equal integer 0<br/>';
if($b!==0)
    echo'$b does not equal integer 0<br/>';
if($a!=="0")
    echo'$a does not equal string 0<br/>';
if($b!=="0")
    echo'$b does not equal string 0<br/>';

Вывод выше будет

$a is empty
$b is empty
$a does not equal integer 0
$b does not equal integer 0
$a does not equal string 0

Выводы: $a==$b, $a!==$b. $a И $b — это числа от == до 0 и от == до false, ни одно из них не является целым числом, оба являются строками, и пустая строка — это не то же самое, что строка, содержащая символ 0.

Изменить $_POST[$fieldname]!=0 на $_POST[$fieldname]!=="0"

person Tim Withers    schedule 16.08.2012
comment
$_POST[$fieldname] никогда не будет === 0. - person Waleed Khan; 16.08.2012
comment
Совершенно верно, это всегда будет строка, поэтому ее, вероятно, следует просто отбросить. - person Tim Withers; 16.08.2012
comment
В видео говорится, что $_POST[$fieldname] != 0) используется для видимого поля, поскольку видимость отключена = 0, тогда вы получите сообщение об ошибке... смысл? - person EZDC; 16.08.2012
comment
Измените его на: !==0, так как это строка, которую отправляет поле, вероятно, равное 0 или 1. Видео вводит вас в заблуждение. - person Tim Withers; 16.08.2012
comment
@user980988 user980988 Я побил для тебя дохлую лошадь из пословицы. - person Tim Withers; 16.08.2012
comment
Благодарю. Странно хоть на видео он работает...? не знаю почему. хотя видео 2007 года, может быть старая версия php...? - person EZDC; 16.08.2012