Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Не работает валидация формы
Форумы портала PHP.SU » » Вопросы новичков » Не работает валидация формы

Страниц (1): [1]
 

1. Linne - 21 Января, 2018 - 20:15:23 - перейти к сообщению
Здравствуйте, товарищи! Улыбка

Есть такой код для обновления пароля:

PHP:
скопировать код в буфер обмена
  1. if(isset($_POST['submit'])){
  2.  
  3.     if(empty($_POST['password'])){
  4.         header('Refresh: 3; URL = /admin/newpass');
  5.         echo '<p class="error">Введите новый пароль!</p>';
  6.     }
  7.     /* elseif (!preg_match('/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.*\s).*$/u', $password)) {
  8.         header('Refresh: 3; URL = /admin/newpass');
  9.         echo '<p class="error">Пароль может состоять только из цифр и букв латинского алфавита!</p>';
  10.     } */
  11.  
  12.     else{
  13.  
  14.         $doc =newDOMDocument('1.0','UTF-8');
  15.         $doc->formatOutput =true;
  16.         $doc->load('xml/admin.xml');
  17.         $root = $doc->documentElement;
  18.  
  19.         if(isset($_POST['password'])){
  20.             $password = $_POST['password'];
  21.  
  22.             $pass = $root->getElementsByTagName('password');
  23.  
  24.             if(isset($password['password'])and trim($password['password'])!=''){
  25.  
  26.                 $pass = $pass->item(0);
  27.                 $pass->nodeValue = crypt($password['password']);
  28.             }
  29.  
  30.         }
  31.  
  32.         $doc->save('xml/admin.xml');
  33.  
  34.         header('Refresh: 3; URL = /admin');
  35.         echo '<p class="valid">Пароль обновлён</p>';
  36.  
  37.         }
  38.  
  39. }


Этот код работает отлично, но, пропускает пустое поле. Т. е., если ничего не ввести и отправить на сервер, то всё равно выводится «Пароль обновлён», при этом, конечно, записи в файл не происходит.

Вроде бы всё логично: есть условие, что поле должно быть заполнено и если всё ОК, то пропускаем на перезапись в файл. Вообще не могу понять в чём может быть проблема.
2. Sail - 21 Января, 2018 - 21:05:56 - перейти к сообщению
Linne, чудес ведь не бывает.
Возможно, выполняется вовсе не этот участок кода.
Ну и результат var_dump($_POST); можно посмотреть. В самом начале скрипта...
3. Linne - 21 Января, 2018 - 21:16:32 - перейти к сообщению
Sail пишет:
Linne, чудес ведь не бывает.
Возможно, выполняется вовсе не этот участок кода.
Ну и результат var_dump($_POST); можно посмотреть. В самом начале скрипта...


Вывод var_dump($_POST):

PHP:
скопировать код в буфер обмена
  1. array(2) { ["password"]=> array(1) { ["password"]=> string(0) "" } ["submit"]=> string(16) "Изменить" }


Это при отправке пустого поля.

А это вывод, при вводе 14-значного пароля:

PHP:
скопировать код в буфер обмена
  1. array(2) { ["password"]=> array(1) { ["password"]=> string(14) "12345678901234" } ["submit"]=> string(16) "Изменить" }
4. Sail - 21 Января, 2018 - 21:40:00 - перейти к сообщению
Linne, то есть, в 3-й строчке проверяется: "А не пуст ли массив?"
А массив не пуст. Потому что в нем есть элемент ["password"]=> string(0) ""
Вероятно, в форме name='password[]'?
5. Linne - 21 Января, 2018 - 21:41:19 - перейти к сообщению
Sail пишет:
Linne, то есть, в 3-й строчке проверяется: "А не пуст ли массив?"
А массив не пуст. Потому что в нем есть элемент ["password"]=> string(0) ""
Вероятно, в форме name='password[]'?


А что же мне с этим можно сделать? Однако

Вот форма:

PHP:
скопировать код в буфер обмена
  1.        
  2. echo '
  3.   <fieldset>
  4.         <legend>Смена пароля администратора</legend>
  5.         <form name="newpass" action="addnewpass" method="POST">
  6.                 <p><label for="password">Введите новый пароль: </label></p>
  7.                 <p><input type="password" name="password[password]" /></p>
  8.                 <p><input type="submit" name="submit" value="Изменить" />
  9.                 <input type="button" onclick="window.location=\'/admin\';" value="Отмена" /></p>
  10.         </form>
  11.   </fieldset>
  12. ';
6. Sail - 21 Января, 2018 - 21:49:42 - перейти к сообщению
Linne, на Ваше усмотрение (ну, или требования системы): либо сделать, чтобы значение пароля передавалось не в массив (name='password'), либо проверять isset($_POST['password'] && empty($_POST['password']['password']))
7. Linne - 21 Января, 2018 - 21:56:55 - перейти к сообщению
Sail пишет:
Linne, на Ваше усмотрение (ну, или требования системы): либо сделать, чтобы значение пароля передавалось не в массив (name='password'), либо проверять isset($_POST['password'] && empty($_POST['password']['password']))


Вот спасибо-то! Улыбка

Я использовал второй вариант, с проверкой:

PHP:
скопировать код в буфер обмена
  1. if (isset($_POST['password']) && empty($_POST['password']['password']))

 

Powered by ExBB FM 1.0 RC1