Не понимаю, как происходит этот массив результатов - PullRequest
1 голос
/ 08 января 2010

Я пытаюсь научиться строить последовательность входа в систему. В одной части я хотел определить, оставил ли пользователь какое-либо из 3 обязательных полей пустым:

<code>foreach ( $_POST as $key => $value )
   {
      if ( $key = "school_code" ||
           $key = "user_name"   ||
           $key = "password" )
         {
            if ( $value == "" )
               {
                  $a_blank[] = $key ;
               }  
         }  
   }

if( @sizeof( $a_blank ) > 0 )
   {
      echo '<pre>';
      print_r( $a_blank );
      echo '
'; }

Если пользователь ничего не вводит для школьного кода или имени пользователя, но вводит пароль, а затем нажимает кнопку «Отправить», результатом будет:

Array
(
    [0] => 1
    [1] => 1
)

Почему результат массива не такой (то есть значения $ key)?

Array
(
    [0] => school_code
    [1] => user_name
)

Спасибо!

Ответы [ 6 ]

7 голосов
/ 08 января 2010

Сравнение с ==, а не =.

$key = "school_code" || $key = "user_name" || $key = "password"

Должно быть вместо ==. Вы также можете написать это немного менее многословно:

$options = array("school_code","user_name","password");
if (in_array($key, $options) && empty($value)) {
    $a_blank[] = $key;
}
2 голосов
/ 08 января 2010

Когда вы проводите сравнение, не забудьте использовать два знака равенства (==) вместо одного (=). Один знак равенства - это присвоение, два - сравнение.

Взять это в качестве примера:

$val = false;
if ($val = true)
    foo();

Если вы используете = в операторе if, будет вызван foo(). На самом деле вы устанавливаете значение $val на true прямо внутри оператора if. В этом случае всегда будет истинным . Это не то, что вы хотите.

$val = false;
if ($val == true)
    foo();

Это то, что вы хотите. Здесь foo() не будет вызвано.

Для получения дополнительной информации см. PHP документы .

1 голос
/ 08 января 2010

Две проблемы с этим кодом.

$key = "school_code" || $key = "user_name" || $key = "password" 

Присвоит $ key результат логического или, который всегда будет истинным (== 1).

Другая проблема в том, что в зависимости от браузера «пустые» значения формы не всегда возвращаются так что, если пользователь оставил пароль пустым, он может не появиться в массиве $ _POST.

Вам было бы намного лучше делать простые старые явные "если", а не причудливые приемы с массивами для этого.

$missing = array();
foreach (array('school_code','user_name','password') as $nm
if ( !isset($_POST[$nm] length($_POST[$nm]) == 0 ) {
        $missing[] = $nm;
}
0 голосов
/ 08 января 2010

когда вы используете такой comapring if ($ key == "school_code" || ..)

у вас может быть такая ошибка, если вы неправильно введете "=" вместо "=="

Хороший трюк в том, чтобы использовать его таким образом: if ("school_code" == $ key || ... и у вас никогда не будет этой ошибки, потому что по-другому это будет ошибка

извините за плохой английский.

0 голосов
/ 08 января 2010

Спасибо за помощь в моем вопросе! Я разочарован тем, что "==" против "=" сбил меня с толку еще раз. Хотел бы я установить свою IDE так, чтобы каждый раз, когда я набирал знак равенства, небольшое всплывающее окно спрашивало меня: «ВЫ УВЕРЕНЫ?»

FWIW, вот HTML:

<?php
session_start() ;
$_SESSION["form_token"] = md5( rand( time(), true ) ) ;
?>

<!-- Display login form -->
<div id="login">
<p>Please supply your username, 3-digit school code, and password.</p>

<form action = "<?php echo $_SERVER['PHP_SELF']; ?>"
      method = "post">

<Input type = "hidden"
       name = "form_token"
      value = "<?php echo $_SESSION['form_token']; ?>" />

<dl>
<dt><strong>Username</strong></dt>
<dd><input type = "text"
           name = "user_name" /></dd><br/>

<dt><strong>School code</strong></dt>
<dd><input type = "text"
           name = "school_code" /></dd><br/>

<dt><strong>Password</strong></dt>
<dd><input type = "password"
           name = "password" /></dd> <br/>

<dd><input type = "submit"
           name = "action"
           value = "Login" /></dd>
</dl>
</form>
0 голосов
/ 08 января 2010

Я опробовал этот код (используя == для сравнения, конечно), и он отлично работает.

Вот результат, который я получил:

Array
(
    [0] => school_code
    [1] => password
)

Но при запуске с оригиналом (ошибочно используя знак =) возвращается:

Array
(
    [0] => 1
    [1] => 1
)

Проблема в том, что спрашивающий использует = для сравнения вместо ==. Таким образом, решение состоит в том, чтобы использовать ==, и это будет работать.

Может кто-нибудь объяснить это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...