Прием переменных в скрипте

 
0
 
PHP
ava
Feldmarschall | 11.07.2008, 14:18
Поводом послужила вот эта тема вот эта тема
Разумеется, такая простыня одинаковых операторов не мила сердцу настоящего программиста.
И мы хотим её оптимизировать. И написать какой-нибудь код покрасивше, который обрабатывал бы входящие переменные.
при всей очевидности проблемы, хороших кодов я в своей жизни не встречал.
В своих собственных скриптах я использую менее идеологически правильные, но более простые конструкции.
Давайте напишем хороший код приема внешних переменных.

Главное условие - функция должна быть простой!
Она должна просто читаться и пониматься. Если это будет класс на три страницы, то никто никогда не будет в нем разбираться. Я понимаю, что большинству посетителей форума все равно, что копировать - хоть сто строчек, хоть одну. И смысл даже одной строчки, типа while($row=mysql_fetch) от многих ускользает. Но все же, давайте делать как можно проще. Как минимум, ошибок будем меньше.

Очевидно, что это должна быть функция, которая принимает в качестве аргумента массив с именами разрешенных переменных.
Пусть эти имена будут ключами, а значениями - что с переменной делать.
Ну, тип, к которому привести - это понятно
Дефолтное значение.
Источник - гет, пост, кука.
Чем обработать? вот здесь главное - не переборщить. что может понадобиться сделать со входящими переменными?
может, ничего?
все равно массив сложноватым получается...
Ответы (6)
ava
Mal Hack | 11.07.2008, 13:38 #
1. Свой код покажите для начала.
2. Полная, т.е. пакетная, обработка ВСЕХ входных параметров - технлогическая ошибка. Все параметры где-то так или иначе должны храниться "сырыми".

Цитата (Feldmarschall @ 11.7.2008, 13:18 findReferencedText)
Если это будет класс на три страницы, то никто никогда не будет в нем разбираться. Я понимаю, что большинству посетителей форума все равно, что копировать - хоть сто строчек, хоть одну.

Размер файла - не показатель качества/не качества. Показатель - реализации возложенных функциональных функций и оптимальность сего процесса...

Тема бред по сути в любом случае, т.к. вся обработка входных данных так или иначе зависит от конкретной решаемой задачи...
ava
skyboy | 11.07.2008, 13:50 #
Цитата (Mal Hack @ 11.7.2008, 12:38 findReferencedText)
т.к. вся обработка входных данных так или иначе зависит от конкретной решаемой задачи

можно её формализировать. обработку-то.
Цитата (Mal Hack @ 11.7.2008, 12:38 findReferencedText)
Свой код покажите для начала

ты чего? 0_о речь о подходе. можно в конце-концов вообще без кода обойтись.

Добавлено позднее:
Feldmarschall, мне кажется, лучше не пихать массив и возвращать массив, а передавать имя с параметрами и получать значение smile иначе нам все равно после вызова функции придется обрабатывать результат массив, чтоб вставить полученные значения в "общую" область видимости
ava
Feldmarschall | 11.07.2008, 13:58 #
Черт его знает.
Не стопроцентная применимость не может служить поводом вообще не решать задачу.
В моих скриптах обычно все так и есть - обработкой входящих данных занимается тот код, который с ними работает...
Но централизованность - тоже хорошая штука. Как хорошо в других языках - в секции Var определил все переменные, и дальше работаешь спокойно.
Может, как типовое оставить таки простынку:


/* принимамем POST */
if (isset($_POST['var'])) $var=$_POST['var']; else $_POST['var']="";
if (isset($_POST['var1'])) $var1=$_POST['var1']; else $_POST['var1']="";
if (isset($_POST['var2'])) $var2=$_POST['var2']; else $_POST['var2']="";

/* принимамем COOKIE */
if (isset($_COOKIE['name'])) $cookie_name=$_COOKIE['name']; else $cookie_name="";


Добавлено позднее:
skyboy, что-то вроде такого:

$var=outside_var("var","P");
$cookie_name=outside_var("name", "C", array("default"=>""));

?
Это гораздо, гораздо лучше. Избавляет от ужасных повторений в первом варианте, но при этом не с помощью чудовищного $var2=isset($_POST['var2'])...

Добавлено позднее:
С одной стороны - да. У меня, как и пишет Mal Hack, обработкой разных переменных занимаются разные участки кода. К примеру, POSt идет прямиком в функцию, формирующую строку set для запроса.
Но с другой стороны, инициализация и обработка - это разные вещи.
Мы сейчас говорим об инициализации. И предварительная обработка массива $_POST, наверное, не помешает...

просто хочется навести какой-то порядок в инициализации переменных и в частности - принимаемых снаружи.
что-то надо отвечать таким новичкам, у которых $$k=$v.
ava
sTa1kEr | 12.07.2008, 01:48 #
За что я не люблю PHP, так это за то что в нем все уже придумано и изобретено 1000 и один раз еще в позапрошлом столетии.
Feldmarschall, 90% из того, что вы предложили реализовать, уже есть в PHP. Причем условие KISS полностью удовлетворено. Да, я говорю про http://php.net/filter

Что же дают эти функции?

$var1 = filter_input(INPUT_POST, 'var1'); // Вместо $var1 = isset($_POST['var1']) ? $_POST['var1'] : null;
$var2 = filter_input(INPUT_COOKIE, 'var2', FILTER_SANITIZE_STRING); // Вместо $var2 = isset($_COOKIE['var2']) ? strip_tags($_COOKIE['var2']) : '';
$var3 = filter_input(INPUT_GET, 'var3', FILTER_SANITIZE_NUMBER_INT); // Вместо $var3 = intval($_GET['var3']);

// Или формируем массив с требуемыми полями, как в примере http://php.net/filter-input-array, а затем
extract(filter_input_array(INPUT_REQUEST, $fields)); // И вся любовь...

// Еще одно применение
$some = filter_var($other); // Вместо $some = $other !== null ? $other : null;
$message = filter_var($message, FILTER_SANITIZE_SPECIAL_CHARS); // Вместо $message = htmlspecialchars($other); // Хотя это уже изврат

По моему, все очень лаконично и просто.

Теперь о недостатках, на мой взгляд.
1. Отсутствие возможности задавать дефолтное значение.
2. Формировать список полей в массиве не очень удобно.

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

Добавлено позднее:
Как бы я это реализовал для начала:

// Где-то в начале скрипта, класс статический. Или можно синглтон патен реализовать
Filte::addPost('var1', Filter::INT);
Filte::addGet('var2', Filter::STR, 'default string');

// В любом месте кода
$var1 = Filter::post('var1');
$var2 = Filter::get('var2');

// Или для обычных переменных
$isset = Filter::var($isset, 'default');
$some = Filter::var($some, Filter::SPECIAL_CHARS);
ava
Mal Hack | 12.07.2008, 03:35 #
Цитата (Feldmarschall @ 11.7.2008, 13:58 findReferencedText)
Как хорошо в других языках - в секции Var определил все переменные, и дальше работаешь спокойно.

Это только в делфи, в сях такого нет. Причем на счет такой жесткой структуризации кода программы многие против...
Си в этом плане в 1000 раз удобнее, уж по работе с типами 100%.

Цитата (Feldmarschall @ 11.7.2008, 13:58 findReferencedText)
Может, как типовое оставить таки простынку:

Если нужно, чтобы некоторые значения как бы всегда были заданы или имели какое-то фиксированное значение, можно заюзать arra_walk, куда включить либо свою функцию, либо через create_function. Но пу сути это лишнее, т.к. что проверять пустое значение, что isset все равно, та же песня, только в другой тональности... Это ничем не облегчит, наоборот, увеличит кол-во операций.

Хотя, в редких случаях, такое действительно надо, но в очень редких.
ava
Glip | 12.07.2008, 21:21 #
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
advanced
Отправить