X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

2 страниц V   1 2 >
Открыть тему
Тема закрыта
> Проверка POST и GET параметров
Den1xxx
Den1xxx
Topic Starter сообщение 25.6.2014, 23:09; Ответить: Den1xxx
Сообщение #1


Речь пойдёт о инструментах сокращения кода и улучшения его понятности.

Надоело мне как-то писать десятками подобные конструкции:
[PHP]$value=isset($_POST['parameter']) ? $_POST['parameter'] : '';[/PHP]

И придумалась такая функция:
[PHP]/**
* Function for return Post values
* @param mixed
* @return mixed
*/
function post($value,$no_value=''){
return (isset($_POST[$value])?$_POST[$value]:$no_value);
}
[/PHP]
Аналогично написано для Гет, Реквест и Куки, заострять внимание не будем.

Теперь код стал более коротким и понятным:
[PHP]$value=post('parameter');[/PHP]
И если параметра нету, но надо вернуть ответ «Чего-то там не найдено»:
[PHP]$value=post('parameter','Чего-то там не найдено');[/PHP]

Всё отлично и красиво, и некоторое время я катался с удовольствием на этой лошадке, и даже рекомендовал другим.
Только вот незадача. Как проверить значение из многомерного массива?
Допустим есть $_POST['article']['title']
Хотелось бы писать опять что-то вроде $value=post('article[title]'), однако ясно, что это не сработает. И функцию тоже сильно усложнять не хочется.
Как сделать?
Пока думается добавить признак многомерности:
[PHP]function post($value,$no_value='',$recursive=false)[/PHP]
Параметр $recursive установленный в true будет соответственно рекурсивно искать и возвращать значение по ключу $value
Но мне подобное решение не нравится. А новое придумать не могу.
Кажется, лежит на поверхности, но не соображу.

Вот решил спросить у умных людей — может есть идеи на этот счёт?
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
zvse
zvse
сообщение 2.7.2014, 10:49; Ответить: zvse
Сообщение #2


[PHP]
$article = array(
'title' => 'title'
);

function post($value,$no_value=''){
return (isset($value)?$value:$no_value);
}

$value1 = post($article['title']);
$value2 = post($article['empty']);
[/PHP]
В итоге получатся следующие данные:
$value1 = title
$value2 = ''

А вообще, советую вместо isset использовать !empty
Тогда на одно присвоение будет меньше в случае, если строка no_value пустая :)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Witu
Witu
сообщение 2.7.2014, 17:00; Ответить: Witu
Сообщение #3


[php]
function get($param, $default) {
if (strpos($param, ':')) {
$sub = explode(':', $param);
$first = array_shift($sub);

if (!empty($_GET[$first])) {
$search = $_GET[$first];
$total = count($sub);
for ($i = 0; $i < $total; $i++) {
if (!empty($search[$sub[$i]])) {
$search = $search[$sub[$i]];
} else {
return $default;
}

}
return $search;
} else {
return $default;
}
}

return empty($_GET[$param]) ? $default : $_GET[$param];
}
[/php]

?abs[sss][hello]=12312

[php]
print_r(get('abs:sss', '123'));
=>
Array ( [hello] => 12312 )

print_r(get('abs:sss:hello', '123'));
=>
12312

print_r(get('a', '123'));
=>
123
[/php]
всё просто


дабы не клонировать строчки для суперглобальных массивов, я рекомендую просто тупо создать класс с методом call и проверять существование запрошенного суперглобального массива, всё остальное идентично

[php]
class A {
public function __call($name, $arguments)
{
$arrays = array(
'get' => $_GET,
'post' => $_POST,
);

if (!isset($arrays[$name]) || count($arguments) !== 2) {
exit;
}

$array = $arrays[$name];

if (strpos($arguments[0], ':')) {
$sub = explode(':', $arguments[0]);
$first = array_shift($sub);

if (!empty($array[$first])) {
$search = $array[$first];
$total = count($sub);
for ($i = 0; $i < $total; $i++) {
if (!empty($search[$sub[$i]])) {
$search = $search[$sub[$i]];
} else {
return $arguments[1];
}

}
return $search;
} else {
return $arguments[1];
}
}

return empty($array[$arguments[0]]) ? $arguments[1] : $array[$arguments[0]];
}
}

$a = new A();
echo $a->get('abs:ss', 'default');
[/php]
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Den1xxx
Den1xxx
Topic Starter сообщение 2.7.2014, 23:04; Ответить: Den1xxx
Сообщение #4


zvse,
$value1 = post($article['title']);
Потеряна вся суть — проверяем именно массив Пост, иначе никакой автоматизацией не пахнет.



HTMLandPHP, я такой вариант тоже рассматривал.
Отверг по причине:
1. В Пост-запросе может быть двоеточие. Если уж эксплодить, то наверное по ’][’
2. Вместо 1 строчки проверки городить класс на 42 строки — неэффективно.
Учитывая, что в этом классе ещё и цикл задействован — неэффективно вдвойне.

Должно быть простое решение, сравнение if, возможно по ссылке. Но я пока не дошёл как это сделать.
С использованием передачи параметра по ссылке для меня — это пока тёмный лес.
Несколько раз пытался разобраться, не получилось.

Вот какая-то крутая функция навроде того, что я хотел сделать.
Я только не пойму как она работает и даёт ли то что нужно.
Из Друпала, https://api.drupal.org/api/drupal/core!...ray::getValue/8

[PHP]public static function &getValue(array &$array, array $parents, &$key_exists = NULL) {
$ref = &$array;
foreach ($parents as $parent) {
if (is_array($ref) && array_key_exists($parent, $ref)) {
$ref = &$ref[$parent];
} else {
$key_exists = FALSE;
$null = NULL;
return $null;
}
}
$key_exists = TRUE;
return $ref;
}
[/PHP]
Судя по документации, это не совсем то что надо.
Однако и с этим пока не разобрался, не получается.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Arks
Arks
сообщение 3.7.2014, 0:26; Ответить: Arks
Сообщение #5


[PHP]
<?php

$testArray = [
'level1' => [
'level2' => [
'level3.' => [
'val' => 'I\'m a test value'
]
]
]
];

function checkPostValue($array, $search, $default) {
$key = strtok($search, '.');
if($key === false) {
return $array;
}
if(is_array($array)) {
$k = key($array);
if(rtrim($k, '.') === $key) {
return checkPostValue($array[$k], substr($search, strlen($key)+1), $default);
}
}
return $default;
}

assert("checkPostValue(".var_export($testArray, true).", 'level1.level2.level3', 'default') === ['val' => 'I\'m a test value']");
assert("checkPostValue(".var_export($testArray, true).", 'level1.level2.level4', 'default') === 'default'");
assert("checkPostValue(".var_export($testArray, true).", 'level1.level2.level3.level4', 'default') === 'default'");

[/PHP]

Хотя вообще-то можно так и не заморачиваться. Точки в ключах массива не будет потому что это бред. Достаточно просто array_key_exists. Под свои нужды я думаю допилить несложно.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Witu
Witu
сообщение 3.7.2014, 5:35; Ответить: Witu
Сообщение #6


Den1xxx, там тоже самое практически. На входе нужно указать 1 из массивов, $parents - ключи массивов для поиска, $key_exists - это для каких то внешних проверок (за пределами метода)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
zvse
zvse
сообщение 3.7.2014, 12:22; Ответить: zvse
Сообщение #7


(Den1xxx @ 3.7.2014, 02:04) *
zvse,
$value1 = post($article['title']);
Потеряна вся суть — проверяем именно массив Пост, иначе никакой автоматизацией не пахнет.

Немного тогда не понимаю смысл.
Можно сделать что-то подобное, конечно

[PHP]
function post($value,$no_value='', $array = '') {
$exist = !empty($array)? $_POST[$value][$array]:$_POST[$value];
return (isset($exist)?$exits:$no_value);
}
[/PHP]
А третьим параметром передавать вложенный параметр.

Или же я вообще не понимаю в чем состоит задача...
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Den1xxx
Den1xxx
Topic Starter сообщение 3.7.2014, 12:58; Ответить: Den1xxx
Сообщение #8


Arks,
HTMLandPHP,
всё это и сложно, и интуитивно-непонятно, и нерасширяемо.
Не говоря уже про то, что в ключах массивов возможны и точки, и двоеточия.

Пока вот что у меня получилось, и работает:
[PHP]function check_param($value,$novalue='') {
return (eval('return (isset('.$value.') ? '.$value.' : \''.$novalue.'\');'));
}

//use
echo check_param('$_POST[\'sqlq\']','Не найдено'),'«br />';

[/PHP]

То есть получилось универсальнее (возможны проверки любых суперглобальных параметров — GET,POST,REQUEST,COOKIE,SERVER).
Но, блин. Тут напрашивался ещё более короткий вариант, но не сработал:
[PHP]function checkPost($value,$default='') {
$post='_POST'.$value;
return (isset($$post) ? $$post : $default);
}[/PHP]
То есть, без eval, используем «переменные переменных».
Возможно, ошибка в том, что переменная $_POST['php'] неправильно воспринимается?
Здесь http://www.php.net/manual/ru/language.variables.variable.php вскользь об этом написано, но я пока не разобрался.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Den1xxx
Den1xxx
Topic Starter сообщение 3.7.2014, 13:15; Ответить: Den1xxx
Сообщение #9


(zvse @ 3.7.2014, 15:22) *
Можно сделать что-то подобное, конечно

1
2
3
4
5

function post($value,$no_value='', $array = '') {
$exist = !empty($array)? $_POST[$value][$array]:$_POST[$value];
return (isset($exist)?$exits:$no_value);
}

А третьим параметром передавать вложенный параметр.

Или же я вообще не понимаю в чем состоит задача...

Во-первых, у Вас в 3 строчке $exist определён в любом случае,
во-вторых, там же, второй параметр неверен.
Задача состоит — писать меньше кода при проверке суперглобального массива (встречается часто), и при этом чтобы было понятно что этот код делает.
Перечитал тему — вроде бы всё чётко изложено, не пойму что там может быть непонятного.
Возможно, Вы редко сталкиваетесь с подобной проверкой, потому не понятно — чего сыр-бор?
Сейчас специально сделал поиск — в движке 161 раз встречается проверка только POST параметра.
А есть ещё ГЕТ, Куки и т.п.
Так что автоматизация подобного назрела.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Witu
Witu
сообщение 3.7.2014, 17:21; Ответить: Witu
Сообщение #10


Den1xxx, не вижу ничего сложного... чес слово
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
2 страниц V   1 2 >
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Горячая тема (нет новых ответов) Проверка позиций сайтов в поисковых системах с помощью Positon.ru
Мониторинг продвижения сайтов
182 Positon 178934 23.2.2024, 9:53
автор: Positon
Открытая тема (нет новых ответов) Get-Web.site - Качественная верстка сайтов
0 GetWeb 1488 29.7.2019, 20:08
автор: GetWeb
Открытая тема (нет новых ответов) Проверка качества прогона по трастовым сайтам, профилям, каталогам
0 bestweb20_mw 1383 21.12.2017, 18:36
автор: bestweb20_mw
Открытая тема (нет новых ответов) Фейк вконтакте - лучшая фотомодель (проверка на валид, админка)
0 Quant 2202 26.5.2017, 14:33
автор: Quant
Горячая тема (нет новых ответов) Чистим сайты от вирусов, рекомендации, проверка сервера на уязвимость!
80 Rxp 56444 16.2.2017, 15:05
автор: Andro11


 



RSS Текстовая версия Сейчас: 28.3.2024, 13:46
Дизайн