Note that although you can provide a default filter for the entire input array there is no way to provide a flag for that filter without building the entire definition array yourself.
So here is a small function that can alleviate this hassle!
<?php
function filter_input_array_with_default_flags($type, $filter, $flags, $add_empty = true) {
$loopThrough = array();
switch ($type) {
case INPUT_GET : $loopThrough = $_GET; break;
case INPUT_POST : $loopThrough = $_POST; break;
case INPUT_COOKIE : $loopThrough = $_COOKIE; break;
case INPUT_SERVER : $loopThrough = $_SERVER; break;
case INPUT_ENV : $loopThrough = $_ENV; break;
}
$args = array();
foreach ($loopThrough as $key=>$value) {
$args[$key] = array('filter'=>$filter, 'flags'=>$flags);
}
return filter_input_array($type, $args, $add_empty);
}
?>filter_input_array
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
filter_input_array
Референца за `function.filter-input-array.php` со подобрена типографија и навигација.
filter_input_array
(PHP 5 >= 5.2.0, PHP 7, PHP 8)
filter_input_array — Зема надворешни променливи и опционално ги филтрира
= NULL
$type, array|int $options = FILTER_DEFAULT, bool $add_empty = true): array|false|nullОваа функција е корисна за добивање многу вредности без повторно повикување filter_input().
Параметри
type-
вистинска функција, само прототип за тоа како треба да биде функцијата.
INPUT_*constants.Ги ескејпува специјалните знаци во стринг за употреба во SQL изјаваСодржината на суперглобалната што се филтрира е оригиналната "сурова" содржина обезбедена од SAPI, пред каква било корисничка модификација на суперглобалната. За да филтрирате модифицирана суперглобална, користете filter_var_array() instead.
options-
Асоцијативна array на опции, или филтерот што треба да се примени на секој запис, што може да биде или филтер за валидација со користење на една од
FILTER_VALIDATE_*константите, или филтер за чистење со користење на една одFILTER_SANITIZE_*constants. Низата со опции е асоцијативна низа каде клучот одговара на клуч во податоцитеarrayи поврзаната вредност е или филтерот што треба да се примени на овој запис, или асоцијативна низа што опишува како и кој филтер треба да се примени на овој запис. Асоцијативната низа што опишува како се применува филтерот мора да ја содржи'filter'клучот чија поврзана вредност е филтерот што треба да се примени, што може да биде една одFILTER_VALIDATE_*,FILTER_SANITIZE_*,FILTER_UNSAFE_RAW, илиFILTER_CALLBACKконстантите. Може опционално да ја содржи'flags'клучот што специфицира и означува што се применува на филтерот, и'options'клучот што специфицира какви било опции што се применуваат на филтерот. add_empty-
Додај недостасувачки клучеви како
nullво вратената вредност.
Вратени вредности
На успех, еден array што ги содржи вредностите на бараните променливи.
При неуспех, false се враќа. Освен ако неуспехот е тоа што влезната низа означена со
type не е пополнета каде null се враќа ако FILTER_NULL_ON_FAILURE флагот се користи.
Недостасувачките записи од влезната низа ќе бидат пополнети во вратената
array if add_empty is true. In which case, missing entries will be set to nullВремето. FILTER_NULL_ON_FAILURE знамето се користи, во тој случај ќе биде false.
Запис од вратената array сокети, и го специфицира далечинскиот порт од кој се примаат податоците. Ако сокетот е поврзан-ориентиран, false ако филтерот не успее, освен ако FILTER_NULL_ON_FAILURE знамето се користи, во тој случај ќе биде null.
Белешки
Забелешка:
Нема
REQUEST_TIMEклуч воINPUT_SERVERниза бидејќи е вметната во $_SERVER later.
Види Исто така
- filter_input() - Добива специфична надворешна променлива по име и опционално ја филтрира
- filter_var() - Провери за нумерички карактер(и)
- filter_var_array() - Добива повеќе променливи и опционално ги филтрира
-
Филтри за валидација
FILTER_VALIDATE_* -
Филтри за чистење
FILTER_SANITIZE_*
Белешки од корисници 9 белешки
[New Version]
This function is very useful for filtering complicated array structure.
Also, Some integer bitmasks and invalid UTF-8 sequence detection are available.
Code:
<?php
/**
* @param integer $type Constant like INPUT_XXX.
* @param array $default Default structure of the specified super global var.
* Following bitmasks are available:
* + FILTER_STRUCT_FORCE_ARRAY - Force 1 dimensional array.
* + FILTER_STRUCT_TRIM - Trim by ASCII control chars.
* + FILTER_STRUCT_FULL_TRIM - Trim by ASCII control chars,
* full-width and no-break space.
* @return array The value of the filtered super global var.
*/
define('FILTER_STRUCT_FORCE_ARRAY', 1);
define('FILTER_STRUCT_TRIM', 2);
define('FILTER_STRUCT_FULL_TRIM', 4);
function filter_struct_utf8($type, array $default) {
static $func = __FUNCTION__;
static $trim = "[\\x0-\x20\x7f]";
static $ftrim = "[\\x0-\x20\x7f\xc2\xa0\xe3\x80\x80]";
static $recursive_static = false;
if (!$recursive = $recursive_static) {
$types = array(
INPUT_GET => $_GET,
INPUT_POST => $_POST,
INPUT_COOKIE => $_COOKIE,
INPUT_REQUEST => $_REQUEST,
);
if (!isset($types[(int)$type])) {
throw new LogicException('unknown super global var type');
}
$var = $types[(int)$type];
$recursive_static = true;
} else {
$var = $type;
}
$ret = array();
foreach ($default as $key => $value) {
if ($is_int = is_int($value)) {
if (!($value | (
FILTER_STRUCT_FORCE_ARRAY |
FILTER_STRUCT_FULL_TRIM |
FILTER_STRUCT_TRIM
))) {
$recursive_static = false;
throw new LogicException('unknown bitmask');
}
if ($value & FILTER_STRUCT_FORCE_ARRAY) {
$tmp = array();
if (isset($var[$key])) {
foreach ((array)$var[$key] as $k => $v) {
if (!preg_match('//u', $k)){
continue;
}
$value &= FILTER_STRUCT_FULL_TRIM | FILTER_STRUCT_TRIM;
$tmp += array($k => $value ? $value : '');
}
}
$value = $tmp;
}
}
if ($isset = isset($var[$key]) and is_array($value)) {
$ret[$key] = $func($var[$key], $value);
} elseif (!$isset || is_array($var[$key])) {
$ret[$key] = null;
} elseif ($is_int && $value & FILTER_STRUCT_FULL_TRIM) {
$ret[$key] = preg_replace("/\A{$ftrim}++|{$ftrim}++\z/u", '', $var[$key]);
} elseif ($is_int && $value & FILTER_STRUCT_TRIM) {
$ret[$key] = preg_replace("/\A{$trim}++|{$trim}++\z/u", '', $var[$key]);
} else {
$ret[$key] = preg_replace('//u', '', $var[$key]);
}
if ($ret[$key] === null) {
$ret[$key] = $is_int ? '' : $value;
}
}
if (!$recursive) {
$recursive_static = false;
}
return $ret;
}
?>This function is very useful for filtering complicated array structure.
Code:
<?php
function filter_request($var, $default_structure) {
$ret = array();
foreach ($default_structure as $key => $value) {
if (!isset($var[$key])) {
$ret[$key] = $value;
} elseif (is_array($value)) {
$ret[$key] = filter_request($var[$key], $value);
} elseif (is_array($var[$key])) {
$ret[$key] = $value;
} else {
$ret[$key] = $var[$key];
}
}
return $ret;
}
?>
Sample Usage:
<?php
$_GET['a']['wrong_structure'] = 'foo';
$_GET['b']['c'] = 'CORRECT';
$_GET['b']['d']['wrong_structure'] = 'bar';
$_GET['unneeded_item'] = 'baz';
var_dump(filter_request($_GET, array(
'a' => 'DEFAULT',
'b' => array(
'c' => 'DEFAULT',
'd' => 'DEFAULT',
),
)));
?>
Sample Result:
array(2) {
["a"]=>
string(21) "DEFAULT"
["b"]=>
array(2) {
["c"]=>
string(12) "CORRECT"
["d"]=>
string(21) "DEFAULT"
}
}Beware: if none of the arguments is set, this function returns NULL, not an array of NULL values.
/* No POST vars set in request
$_POST = array();
*/
$args = array('some_post_var' => FILTER_VALIDATE_INT);
$myinputs = filter_input_array(INPUT_POST, $args);
var_dump($myinputs);
Expected Output: array(1) { ["some_post_var"]=> NULL }
Actual Output: NULLLooks like filter_input_array isn't aware of changes to the input arrays that were made before calling filter_input_array. Instead, it always looks at the originally submitted input arrays.
So this will not work:
$_POST['my_float_field'] = str_replace(',','.',$_POST['my_float_field']);
$args = array('my_float_field',FILTER_VALIDATE_FLOAT);
$result = filter_input_array(INPUT_POST, $args);[New Version]
Example Usage:
<?php
$_GET['A']['a'] = ' CORRECT(including some spaces) ';
$_GET['A']['b'] = ' CORRECT(including some spaces) ';
$_GET['A']['c'] = "Invalid UTF-8 sequence: \xe3\xe3\xe3";
$_GET['A']['d']['invalid_structure'] = 'INVALID';
$_GET['B']['a'] = ' CORRECT(including some spaces) ';
$_GET['B']['b'] = "Invalid UTF-8 sequence: \xe3\xe3\xe3";
$_GET['B']['c']['invalid_structure'] = 'INVALID';
$_GET['B']["Invalid UTF-8 sequence: \xe3\xe3\xe3"] = 'INVALID';
$_GET['C']['a'] = ' CORRECT(including some spaces) ';
$_GET['C']['b'] = "Invalid UTF-8 sequence: \xe3\xe3\xe3";
$_GET['C']['c']['invalid_structure'] = 'INVALID';
$_GET['C']["Invalid UTF-8 sequence: \xe3\xe3\xe3"] = 'INVALID';
$_GET['unneeded_item'] = 'UNNEEDED';
var_dump(filter_struct_utf8(INPUT_GET, array(
'A' => array(
'a' => '',
'b' => FILTER_STRUCT_TRIM,
'c' => '',
'd' => '',
),
'B' => FILTER_STRUCT_FORCE_ARRAY,
'C' => FILTER_STRUCT_FORCE_ARRAY | FILTER_STRUCT_TRIM,
)));
?>
Example Result:
array(3) {
["A"]=>
array(4) {
["a"]=>
string(36) " CORRECT(including some spaces) "
["b"]=>
string(30) "CORRECT(including some spaces)"
["c"]=>
string(0) ""
["d"]=>
string(0) ""
}
["B"]=>
array(3) {
["a"]=>
string(36) " CORRECT(including some spaces) "
["b"]=>
string(0) ""
["c"]=>
string(0) ""
}
["C"]=>
array(3) {
["a"]=>
string(30) "CORRECT(including some spaces)"
["b"]=>
string(0) ""
["c"]=>
string(0) ""
}
}While filtering input arrays, be careful of what flags you set besides FILTER_REQUIRE_ARRAY. For example, setting the flags like so:
<?php
$filter = array(
'myInputArr' => array('filter' => FILTER_SANITIZE_STRING,
'flags' => array('FILTER_FLAG_STRIP_LOW', 'FILTER_REQUIRE_ARRAY'))
);
$form_inputs = filter_input_array(INPUT_POST, $filter);
?>
.. will result in a blank $form_inputs['myInputArr'] regardless of what $_POST['myInputArr'] contains.If you are trying to handling multiple form inputs with same name, then you must assign the `'flags' => FILTER_REQUIRE_ARRAY` to the definitions entry.
Example, you have a html form as such:
<form>
<input name="t1[]" value="Some string One" />
<input name="t1[]" value="Another String Two" />
</form>
Your definitions array will look a little like this:
$args = array(
't1' => array(
'name' => 't1',
'filter' => FILTER_SANITIZE_STRING,
'flags' => FILTER_REQUIRE_ARRAY)
);Here's an extended function that allows you to keep also the unfiltered items/args from the request, while you also apply validation to some of them:
<?php
$validationRules = [
'foo' => [
'filter' => FILTER_VALIDATE_REGEXP,
'options' => ['regexp' => '/^(bar|baz)$/i']
]
];
$request = filter_input_array_keep_unfiltered_args(INPUT_POST, $validationRules);
var_dump($request);
function filter_input_array_keep_unfiltered_args($type, $filters, $addEmpty = true)
{
$rawRequest = filter_input_array($type);
$validationRules = [];
foreach ($rawRequest as $key => $value) {
$validationRules[$key] = isset($filters[$key]) ? $filters[$key] : ['filter' => FILTER_DEFAULT];
}
return filter_input_array($type, $validationRules, $addEmpty);
}
?>