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 » » Вопросы новичков » инициализация входящих данных

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

1. DlTA - 15 Июля, 2014 - 15:05:51 - перейти к сообщению
в очередной раз делая обработку формы ловлю себя на мысли что писать
PHP:
скопировать код в буфер обмена
  1. $a = !empty($_REQUEST['a'])?$_REQUEST['a']:'';

очень скучно, возникает вопрос как бы сократить эту запись?!

варианты $a=@$_REQUEST['a']; не рассматриваем, генерация нотисов хоть и с принудительным их скрытием не интересна.

в начале думал сделать чет типа
$a = getData($__REQUEST['a']);
но понял что фигня, ошибка в азах

потом пришел вариант типа
PHP:
скопировать код в буфер обмена
  1. /**
  2. * @property mixed[] $arr входной массив с данными
  3. * @property string $name имя проверяемой переменно
  4. */
  5. $a = getData($__REQUEST, 'a'); // {return !empty($arr[$name])?$arr[$name]:''; }

это уже хоть работоспособно

и уже его можно обернуть в типа
getPOSTData($name);
getGETData($name);
...

а как у вас обстоят с этим дела?
2. Panoptik - 15 Июля, 2014 - 15:17:53 - перейти к сообщению
глобальный объект $request содержащий методы получения данных

$request->getQuery // GET
$request->getPost // POST
$request->getParam // POST OR GET

еще вариант попроще
http://php.net/manual/en/class.arrayobject.php

я бы наверное за неимением другого его и использовал
3. DlTA - 15 Июля, 2014 - 15:26:55 - перейти к сообщению
Panoptik пишет:
глобальный объект $request содержащий методы получения данных

$request->getQuery // GET
$request->getPost // POST
$request->getParam // POST OR GET

я надеюсь что объект $request получается из какого то конструктора, а то чет не нахожу такого в стандартном описании

Panoptik пишет:
http://php.net/manual/en/class.arrayobject.php
я бы наверное за неимением другого его и использовал

php.net пишет:
Класс ArrayObject, Данный класс позволяет работать с объектами как с массивами.

чет слабо понимаю, зачем? ведь все равно нужно проверять наличие переменной/ключа?!
4. Sail - 15 Июля, 2014 - 15:30:23 - перейти к сообщению
filter_input(), однако!
И из тамошнего примера:
PHP:
скопировать код в буфер обмена
  1. $search_html = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_SPECIAL_CHARS);
  2. $search_url = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_ENCODED);
5. DlTA - 15 Июля, 2014 - 15:41:48 - перейти к сообщению
Sail пишет:
filter_input(), однако!
по сути близко, но вот интерфейс отвратительно продуман, и о возвращаемых значениях хорошего не скажешь.
все равно нужна обертка
6. DelphinPRO - 15 Июля, 2014 - 16:05:46 - перейти к сообщению
DlTA пишет:
и уже его можно обернуть в типа
getPOSTData($name);
getGETData($name);
...

а как у вас обстоят с этим дела?

у меня так же и обстоят. только в объектном виде, типа как у Panoptikа
7. armancho7777777 - 15 Июля, 2014 - 17:07:33 - перейти к сообщению
DlTA пишет:
очень скучно, возникает вопрос как бы сократить эту запись?!

А Вы в Zend FW загляните.

PHP:
скопировать код в буфер обмена
  1. class Request {
  2.  
  3.     // ....
  4.  
  5.     public function getPost($key, $default = null)
  6.     {
  7.         if(array_key_exists($key, $this->_post)) {
  8.             return $this->_post[$key];
  9.         }
  10.  
  11.         return $default;
  12.     }
  13.  
  14.     // ....
  15.  
  16. }
8. OrmaJever - 15 Июля, 2014 - 18:08:18 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. class request implements ArrayAccess
  2. {
  3.     private $data;
  4.  
  5.     public function __construct( &$var ) {
  6.         $this->data = $var;
  7.     }
  8.  
  9.     public function offsetExists ( $key )
  10.     {
  11.         return isset( $this->data[ $key ] );
  12.     }
  13.  
  14.     public function offsetUnset ( $key )
  15.     {
  16.         unset( $this->data[ $key ] );
  17.     }
  18.  
  19.     public function offsetGet ( $key)
  20.     {
  21.         return isset( $this->data[ $key ] ) ? $this->data[ $key ] : null;
  22.     }
  23.  
  24.     public function offsetSet ( $key, $value )
  25.     {
  26.         if ( is_null( $key ) ) {
  27.             $this->data[] = $value;
  28.         } else {
  29.             $this->data[ $key ] = $value;
  30.         }
  31.     }
  32.  
  33.     public function safe($key)
  34.     {
  35.         return addslashes( $this->offsetGet( $key ) );
  36.     }
  37. }
  38.  
  39. $_GET     = new Request( $_GET );
  40. $_POST    = new Request( $_POST );
  41. $_COOKIE  = new Request( $_COOKIE );
  42. $_REQUEST = new Request( $_REQUEST );
  43. $_SESSION = new Request( $_SESSION );
  44.  
  45. echo $_GET['несуществующий элемент'];
  46. echo $_GET['lang'] ?: 'default_value';
  47.  
9. DlTA - 15 Июля, 2014 - 18:30:48 - перейти к сообщению
прикольно, а метод "safe" не описан в интерфейсе, он откуда?
10. OrmaJever - 15 Июля, 2014 - 18:44:25 - перейти к сообщению
да то я для себя делал, что бы в запросы фильтровать данные, хотя вроде им даже не и пользовался Закатив глазки

PHP:
скопировать код в буфер обмена
  1. $mysqli->query('SELECT * FROM table WHERE name ="'. $_GET->safe('name').'"');
  2. // иначе нужно было бы фильтровать
  3. $mysqli->query('SELECT * FROM table WHERE name ="'. $mysqli->escape_string($_GET['name']).'"');
  4.  
11. Мелкий - 15 Июля, 2014 - 18:52:51 - перейти к сообщению
DlTA пишет:
он откуда?

Свой собственный метод.
Класс обязан реализовать все методы интерфейса, но очень странно считать, что это должны быть единственные методы класса.

Несколько странная идея реализовать полноценные offsetUnset и offsetSet, я бы там исключения воткнул. Нечего менять входные данные.
А вот для сессии откровенно неудобно, см. $_SESSION['foo']['bar'] = 1;
12. OrmaJever - 15 Июля, 2014 - 18:59:26 - перейти к сообщению
Мелкий пишет:
Несколько странная идея реализовать полноценные offsetUnset и offsetSet, я бы там исключения воткнул. Нечего менять входные данные.

никто не мешает доработать со своей фантазией Подмигивание
Мелкий пишет:
А вот для сессии откровенно неудобно, см. $_SESSION['foo']['bar'] = 1;

ну во всяком случае это лучше чем ничего Улыбка Так хотя бы первый уровень можно без нотисов юзать. Опять же если не нравиться можете убрать Улыбка
(Добавление)
и вообще если у кого-то будут доработки этого класса то выкладывайте их сюда, может и себе применю Улыбка
13. teddy - 15 Июля, 2014 - 19:25:06 - перейти к сообщению
OrmaJever пишет:
и вообще если у кого-то будут доработки этого класса то выкладывайте их сюда, может и себе применю

Ну хорошо... я тут обратил внимание, что в Вашем примере нельзя прогнать через цикл данные. Т.е например если сделать $_GET = new Request( $_GET ); - то крышка $_GET-у Улыбка

Ну... я это исправил добавив в Ваш код реализацию интерфейса Iterator. Код в спойлере

Спойлер (Отобразить)

Пример для итерации объекта лежит в конце класса
14. OrmaJever - 15 Июля, 2014 - 19:56:44 - перейти к сообщению
teddy пишет:
Ну... я это исправил добавив в Ваш код реализацию интерфейса Iterator

Да, спасибо, правильное замечание, в цикле ещё не использовал поэтому забыл. Но вот только не надо порно, цикл должен быть таким Подмигивание
PHP:
скопировать код в буфер обмена
  1. foreach( $_GET as $k => $v) {
  2.     echo $k, ' => ', $v, '<br>';
  3. }
15. teddy - 15 Июля, 2014 - 20:01:08 - перейти к сообщению
А чего порно то)

У меня лично такой принцип - если я использую какую то возможность, то обычно стараюсть не выходить в коде за пределы этого интерфейса когда нахожусь в его контексте... но тут наверное на любителя, пойдет и форыч)

 

Powered by ExBB FM 1.0 RC1