Как проверить значение option у формы

_ne_scaju_

Всем привет, возник такой вопрос, я не когда не задумывался об этом, теперь решил спросить у знающих.
Есть форма вида:

HTML:
  1.             <form action=«/adminuser/banned/10» method=«POST»>
  2.               <div class=«form-group»>
  3.                 <input type=«text» class=«form-control input-sm» value=«<?=$user[‘user_login’];?>» disabled>
  4.               </div>
  5.               <div class=«form-group»>
  6.               <select name=«type_ban» class=«form-control input-sm»>
  7.                 <option>Тип бана</option>
  8.                 <option value=«0»>Предупреждения</option>
  9.                 <option value=«1»>Бан</option>
  10.                 <option value=«2»>Бан на комментарии</option>
  11.               </select>
  12.               </div>
  13.               <div class=«form-group»>
  14.               <select name=«end_ban» class=«form-control input-sm»>
  15.                 <option>Время бана</option>
  16.                 <option value=«10»>10 мин</option>
  17.                 <option value=«30»>30 мин</option>
  18.                 <option value=«60»>1 час</option>
  19.                 <option value=«180»>3 часа</option>
  20.               </select>
  21.               </div>
  22.               <div class=«form-group»>
  23.                   <input type=«text» name=«comment_ban» placeholder=«причина бана» class=«form-control input-sm»>
  24.               </div>
  25.               <div class=«row»>
  26.                   <div class=«col-xs-6 col-sm-6 col-md-6»>
  27.                       <input type=«submit» class=«btn btn-outline-success» value=«забанить»>
  28.                   </div>
  29.               </div>
  30.             </form>

у формы есть поля option в которых описаны value, каким образом можно проверять значение value что его изменять нельзя, т.е. когда тестировал перед вставкой данных в базу, я изменил значение одного из value с помощью инспектора браузера, и в базу улетело значение которое я установил в value, а по логике там начальное значение которое по сути изменять нельзя. Как предотвратить изменение значения value?
Второй вопрос заключается в не понимании как проверить поля option на пустоту. Когда делаю проверку:

PHP:
  1. if (empty($post[‘type_ban’])) {
  2.     $this -> error = ‘Поле обязательно к заполнению’;
  3.     return false;
  4. }

проверка не срабатывает из-за того что находится значение option у которого даже нет value:

HTML:
  1. <option>Время бана</option>

т.е. если я отправлю форму, то значение «Время бана» по сути и запишется так как это значение string (строка). Так как проверить значение на пустоту исключив первый option который без value?

 

MouseZver

PHP:
  1. $input = filter_input_array ( INPUT_POST, [
  2.     ‘type_ban’ => [
  3.         ‘filter’ => FILTER_CALLBACK,
  4.         ‘options’ => function ( int $value ): int | bool
  5.         {
  6.             if ( in_array ( $value, [ 0,1,2 ], true ) )
  7.             {
  8.                 return $value;
  9.             }
  10.          
  11.             return false;
  12.         }
  13.     ],
  14.     ‘end_ban’ => [
  15.         ‘filter’ => FILTER_CALLBACK,
  16.         ‘options’ => function ( int $value ): int | bool
  17.         {
  18.             if ( in_array ( $value, [ 10,30,60,180 ], true ) )
  19.             {
  20.                 return $value;
  21.             }
  22.          
  23.             return false;
  24.         }
  25.     ],
  26.     ‘comment_ban’ => FILTER_DEFAULT
  27. ] );

http://htmlbook.ru/html/input/required

 

_ne_scaju_

круть спасибо, сейчас применю проверю))

 

miketomlin

Если «словари» хранятся в БД, то соответственно по БД проверяешь.
— Добавлено —
И форму тоже по данным из БД формируешь.

 

_ne_scaju_

переменная $value от куда, что это само поле value?

 

miketomlin

Читай доки по FILTER_CALLBACK ;)

Это значение поля. Полями обычно называют «именованные» контролы, т.е. целиком раскрывающиеся списки в данном случае.

 

_ne_scaju_

я не понял, как оно туда попала, эта переменная $value т.е. если я использую этот кусок кода в контроллере. а в модели проверяю эти поля, как я этот $value отдам в функцию FILTER_CALLBACK

 

_ne_scaju_

у меня не выходит, сижу думаю что-не так делаю, как это поле $value передать в эту функцию калбека, если это и есть поле name=»type_ban'», при вызове калбек функции как мы отдаем еще раз поле я не пойму, не буду я же писать вместо $value -> $_POST[‘…’]

Мои действия в контроллере создал этот массив данных формы:

PHP:
  1.      
  2. if ($_SERVER[‘REQUEST_METHOD’] == ‘POST’) {
  3.      $rulles = [
  4.         ‘type_ban’ => [
  5.           ‘filter’ => FILTER_CALLBACK,
  6.           ‘options’ => function($value) {
  7.             if (in_array($value, [ 0,1,2 ], true)) {
  8.               return $value;
  9.             }
  10.             return false;
  11.           }
  12.         ],
  13.         ‘end_ban’ => [
  14.           ‘filter’ => FILTER_CALLBACK,
  15.           ‘options’ => function($value) {
  16.             if (in_array($value, [ 10,30,60,180 ], true)) {
  17.               return $value;
  18.             }
  19.             return false;
  20.           }
  21.         ],  
  22.         ‘comment_ban’ => FILTER_DEFAULT
  23.       ];
  24.  
  25.       # получаем переменные и фильтруем их
  26.      $filter = filter_input_array(INPUT_POST, $rulles);
  27.  
  28.     # проверяем форму после отправки на правильность заполнения
  29.    if (!$this -> model -> checkFormBanedExists($filter)) {
  30.       $this -> view -> message(‘error’, $this -> model -> error);
  31.     }
  32. }

далее в модели пытаюсь проверить все поля:

PHP:
  1.   public function checkFormBanedExists($post)
  2.   {
  3.     # проверяем поле html в форме, если имя для поля input изменено выводим ошибку
  4.    if (!isset($post[‘type_ban’]) || !isset($post[‘end_ban’]) || !isset($post[‘comment_ban’])) {
  5.       $this -> error = ‘Изменять поля ввода в режиме разработчика запрещено!!!’;
  6.       return false;
  7.     }
  8.     if ($post[‘type_ban’])) {
  9.       $this -> error = ‘выбери тип бана’;
  10.       return false;
  11.     }
  12.     return true;
  13.   }

опять же в контроллере вызываю функцию из модели, если есть ошибки показываю их, но при любом раскладе я не могу получить значения все время ошибку кидает, что же я не так сделал?

 

MouseZver

Ты умудрился сломать синтаксис пхп, при этом ошибки игноришь. Поздравляю, я отписываюсь отсюда.

P.s: выучи получаемый результат с filter_input_array, а не городить isset дубляжем, который умеет принимать mixed vars

 

_ne_scaju_

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

 

_ne_scaju_

вида типа:

PHP:
  1.  # проверяем поле html в форме, если имя для поля input изменено выводим ошибку
  2.  if (in_array (null, $data, true)) {
  3.     $this -> error = ‘Изменять поля ввода в режиме разработчика запрещено!!!’;
  4.     return false;
  5.  }
 

Drunkenmunky

PHP:
  1. <pre>
  2. <?php
  3. $good_options = array(‘type’ => array(‘0’, ‘1’, ‘2’),
  4. ‘end’ => array(10, 30, 60, 180)
  5. );
  6.  
  7. if(isset($_POST[‘type_ban’], $_POST[‘end_ban’], $_POST[‘comment_ban’]))
  8. {
  9.   if (in_array($_POST[‘type_ban’], $good_options[‘type’]))
  10.    {
  11.     echo ‘type: ‘.$_POST[‘type_ban’].‘<br>’;
  12.    }
  13.   else
  14.   {
  15.   echo ‘нет такого типа<br>’;
  16.   }
  17.  
  18.   if (in_array((int)$_POST[‘end_ban’], $good_options[‘end’], TRUE))
  19.    {
  20.     echo ‘end: ‘.$_POST[‘end_ban’].‘<br>’;
  21.    }
  22.   else
  23.   {
  24.   echo ‘не тот конец<br>’;
  25.   }
  26. }
  27. ?>
 

_ne_scaju_

все работает спасибо, вот пример того что получилось:

PHP:
  1.   public function checkFormBanedExists($data)
  2.   {
  3.    # массив значений для полей по умолчанию
  4.    $options = [
  5.       ‘type’ => [‘0’, ‘1’, ‘2’],
  6.       ‘end’ => [’10’, ’30’, ’60’, ‘180’],
  7.     ];
  8.     # проверяем поле html в форме, если имя для поля input изменено выводим ошибку
  9.    if (in_array(null, $data, true)) {
  10.       $this -> error = ‘Изменять поля ввода в режиме разработчика запрещено!!!’;
  11.       return false;
  12.     } elseif (!in_array($data[‘type_ban’], $options[‘type’], true)) {
  13.       $this -> error = ‘Тип бана обязателен’;
  14.       return false;
  15.     } elseif (!in_array($data[‘end_ban’], $options[‘end’], true)) {
  16.       $this -> error = ‘Время бана обязательно’;
  17.       return false;
  18.     }else {
  19.       if (empty($data[‘comment_ban’])){
  20.         $this -> error = ‘Причина бана обязательна’;
  21.         return false;
  22.       }
  23.     }
  24.     return true;
  25.   }

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

PHP:
  1. if (!in_array($data[‘type_ban’], [‘0’, ‘1’, ‘2’], true)) {}
  2. if (!in_array($data[‘end_ban’], [’10’, ’30’, ’60’, ‘180’], true)) {}

Два вопроса одним махом решены, всем спасибо за обсуждения.

 

_ne_scaju_

дополняю запись, добавил проверку, если пользователь не подтвердил email что банить такое нельзя.

PHP:
  1.   public function checkFormBanedExists($banned_uid, $data)
  2.   {
  3.     # массив значений для полей по умолчанию
  4.    $options = [
  5.       ‘type’ => [‘0’, ‘1’, ‘2’],
  6.       ‘end’ => [’10’, ’30’, ’60’, ‘180’],
  7.     ];
  8.  
  9.    # получаем данные о конкретном пользователе (по его uid)
  10.    $user = $this -> getUserById($banned_uid);
  11.  
  12.     # проверяем поле html в форме, если имя для поля input изменено выводим ошибку
  13.    if (in_array(null, $data, true)) {
  14.       $this -> error = ‘Изменять поля ввода в режиме разработчика запрещено!!!’;
  15.       return false;
  16.     } elseif ($user[‘status’] != 1) {
  17.       $this -> error = ‘Пользователь не подтвердил свою почту, банить запрещено!!!’;
  18.       return false;
  19.     } else {
  20.       if (!in_array($data[‘type_ban’], $options[‘type’], true)) {
  21.         $this -> error = ‘Тип бана обязателен’;
  22.         return false;
  23.       } elseif (!in_array($data[‘end_ban’], $options[‘end’], true)) {
  24.         $this -> error = ‘Время бана обязательно’;
  25.         return false;
  26.       }
  27.       elseif (empty($data[‘comment_ban’])) {
  28.         $this -> error = ‘Причина бана обязательна’;
  29.         return false;
  30.       }
  31.     }
  32.     return true;
  33.   }
 

_ne_scaju_

Изменил структуру проверок, исправляюсь, если пользователь не подтвердил email, банить в этом случае такого пользователя нельзя.

PHP:
  1.   public function checkFormBanedExists($banned_uid, $data)
  2.   {
  3.     # массив значений для полей по умолчанию
  4.    $options = [
  5.       ‘type’ => [‘0’, ‘1’, ‘2’],
  6.       ‘end’ => [’10’, ’30’, ’60’, ‘180’],
  7.     ];
  8.  
  9.     # получаем данные о конкретном пользователе (по его uid)
  10.    $user = $this -> getUserById($banned_uid);
  11.  
  12.     # проверяем поле html в форме, если имя для поля input изменено выводим ошибку
  13.    if (in_array(null, $data, true)) {
  14.       $this -> error = ‘Изменять поля ввода в режиме разработчика запрещено!!!’;
  15.       return false;
  16.     } else {
  17.       if (!in_array($data[‘type_ban’], $options[‘type’], true)) {
  18.         $this -> error = ‘Тип бана обязателен’;
  19.         return false;
  20.       }
  21.       if (!in_array($data[‘end_ban’], $options[‘end’], true)) {
  22.         $this -> error = ‘Время бана обязательно’;
  23.         return false;
  24.       }
  25.       if (empty($data[‘comment_ban’])) {
  26.         $this -> error = ‘Причина бана обязательна’;
  27.         return false;
  28.       }
  29.       if ($user[‘status’] != 1) {
  30.         $this -> error = ‘Пользователь не подтвердил свою почту, банить запрещено!!!’;
  31.         return false;
  32.       }
  33.     }
  34.     return true;
  35.   }
 

Добавить комментарий

Ваш адрес email не будет опубликован.