Помощник
|
Проверка POST и GET параметров |
Den1xxx
|
Сообщение
#1
|
||
|
|
||
|
|||
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 |
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
|
Сообщение
#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 |
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 |
3.7.2014, 5:35;
Ответить: Witu
Сообщение
#6
|
|
Den1xxx, там тоже самое практически. На входе нужно указать 1 из массивов, $parents - ключи массивов для поиска, $key_exists - это для каких то внешних проверок (за пределами метода)
|
|
|
zvse |
3.7.2014, 12:22;
Ответить: zvse
Сообщение
#7
|
|
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
|
Сообщение
#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
|
Сообщение
#9
|
|
Можно сделать что-то подобное, конечно 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 |
3.7.2014, 17:21;
Ответить: Witu
Сообщение
#10
|
|
Den1xxx, не вижу ничего сложного... чес слово
|
|
|
|
Похожие темы
Тема | Ответов | Автор | Просмотров | Последний ответ | |
---|---|---|---|---|---|
Проверка позиций сайтов в поисковых системах с помощью 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 |
Текстовая версия | Сейчас: 28.3.2024, 13:46 |