#php #validation
#php #проверка
Вопрос:
Я создал следующий код, чтобы лучше понять фильтры php.
В основном он проверяет 2 конкретных параметра URL-адреса year amp; week по 2 целочисленным фильтрам.
Дело в том, что он не уведомляет вас о том, какие параметры были введены правильно, НО, как оказалось, находятся вне диапазона. В настоящее время ВСЕ или НИЧЕГО; Я не могу сказать пользователю, ЧТО конкретно пошло не так.
var_dump($result)
Показанное возвращает это:
array(2) {
["year"]=> int(2019)
["week"]=> bool(false)
}
Кто-нибудь может показать мне, как создать это уведомление?
Вот код. Помните, что для его тестирования вы должны сделать это в своей локальной среде разработки.
/*
URL Samples to try
code.php - ERROR
code.php? - ERROR
code.php?year=2018amp;week=0 - OUT OF RANGE
code.php?year=2018amp;week=1 - OUT OF RANGE
code.php?year=2019amp;week=1 - IN RANGE
code.php?year=2019amp;week=52 - IN RANGE
code.php?year=2019amp;week=0 - OUT OF RANGE
code.php?year=2019amp;week=53 - OUT OF RANGE
code.php?year=2026amp;week=1 - OUT OF RANGE
code.php?year=2026amp;week=52 - OUT OF RANGE
*/
// Custom URL PHP filters
$filters = [
'year' => [ 'filter' => FILTER_VALIDATE_INT, 'options' => ['min_range' => 2019, 'max_range' => 2025] ],
'week' => [ 'filter' => FILTER_VALIDATE_INT, 'options' => ['min_range' => 1, 'max_range' => 52 ] ]
];
/* Begin validation(s)... */
// At least 1 URL parameter is required.
if (!is_null($result = filter_input_array(INPUT_GET, $filters))) {
// If we made it this far...
// Search result array for any keys containing null or false
if(!in_array(null || false, $result)) {
// If all key/value pairs from array $filters validated successfuly...
echo 'Status: Validation success.<br>';
echo 'Reason: All URL parameters decleared in $filters are present';
echo '<br>';
echo 'and have been validated against their respective filters.';
echo '<br><br>';
echo '<hr>';
echo '<strong>$result</strong> output';
echo '<br><br>';
echo 'print_r:<br>';
print_r($result);
echo '<br><br>';
echo 'var_dump:<br>';
var_dump($result);
// Inner IF
} else {
// If even 1 array key is found to contain a null or false value...
echo 'Status: Validation failed.<br>';
echo 'Reason: Corrupted url pars or One or more null or false values found.';
echo '<br><br>';
echo '<hr>';
echo '<strong>$result</strong> output';
echo '<br><br>';
echo 'print_r:<br>';
print_r($result);
echo '<br><br>';
echo 'var_dump:<br>';
var_dump($result); ////// Output from this call is shown above
}
// Outter IF
} else {
echo 'Status: URL failed.';
echo '<br>';
echo 'Reason: At least 1 URL parameter is required.';
echo '<br><br>';
echo 'Sample: <code>code.php<strong>?year=2019amp;week=52</strong></code>';
echo '<br><br>';
echo '<hr>';
echo '<strong>$result</strong> output';
echo '<br><br>';
echo 'var_dump:<br>';
print_r($result);
echo '<br><br>';
echo 'var_dump:<br>';
var_dump($result);
}
Комментарии:
1. Что
var_dump($result)
показывает вам, когда он терпит неудачу?2. прямой
NULL
, как будто$result
ничего не значит до того момента, пока он не станет массивом.3. В документации говорится: «Если входной массив, обозначенный типом, не заполнен, функция возвращает NULL»
4. Я вижу. Я создал outter
if
именно для этого.5. Итак, в чем ваш вопрос?
Ответ №1:
Согласно документации, filter_input_array
возвращает «Массив, содержащий значения запрошенных переменных при успешном выполнении… Значение массива будет FALSE
, если фильтр не работает или NULL
если переменная не установлена. » Итак, все, что вам нужно сделать, это выполнить поиск в массиве false
или null
:
<?php
// sample data
$result = ["year"=>2019, "week"=>false, "day"=>null];
// remove non-false/null values
$failed = array_filter($result, function($v){return $v===false || $v===null;});
// now loop through the failed fields
foreach($failed as $k=>$v) {
$msg = ($v === null) ? "Field %s was missingn" : "Field %s failed validationn";
printf($msg, $k);
}
Это выводит:
Field week failed validation
Field day was missing
Комментарии:
1. Рад помочь!
Ответ №2:
Пример для всех, кто хочет знать, как обрабатывать параметры URL с помощью фильтров PHP. Еще раз спасибо, Майк!
Исходный код
<?php
/*
URL Samples to try
code.php - ERROR
code.php? - ERROR
code.php?year=2018amp;week=0 - OUT OF RANGE
code.php?year=2018amp;week=1 - OUT OF RANGE
code.php?year=2019amp;week=1 - IN RANGE
code.php?year=2019amp;week=52 - IN RANGE
code.php?year=2019amp;week=0 - OUT OF RANGE
code.php?year=2019amp;week=53 - OUT OF RANGE
code.php?year=2026amp;week=1 - OUT OF RANGE
code.php?year=2026amp;week=52 - OUT OF RANGE
*/
// PREPARE FILTER
$FILTER_VALIDATE_INT_RANGE_YEAR = [
'filter' => FILTER_VALIDATE_INT,
'options' => [ 'min_range' => 2019, 'max_range' => 2025 ]
];
// PREPARE FILTER
$FILTER_VALIDATE_INT_RANGE_WEEK = [
'filter' => FILTER_VALIDATE_INT,
'options' => [ 'min_range' => 1, 'max_range' => 52 ]
];
// PREPARE FILTER
$FILTER_VALIDATE_INT_RANGE_DAYS = [
'filter' => FILTER_VALIDATE_INT,
'options' => [ 'min_range' => 1, 'max_range' => 365 ]
];
// ACTIVATE FILTERS
$FILTERS_ACTIVE = [ // 'url_parameter' => php filter
'year' => $FILTER_VALIDATE_INT_RANGE_YEAR,
'week' => $FILTER_VALIDATE_INT_RANGE_WEEK,
'day' => $FILTER_VALIDATE_INT_RANGE_DAYS
];
/*
ABOUT filter_input_array
According to the PHP documentation, filter_input_array returns an array containing
the values of the requested variables on completion.
In order for it to work, at least 1 URL parameter must be correctly formed or entered.
1. A $VALIDATE variable will be entirely NULL if there isn't at least 1 url_parameter correctly formed or entered.
2. A $VALIDATE array key=>value will be NULL if that particular filter parameter is not set.
3. A $VALIDATE array key=>value will be FALSE if that particular filter fails.
*/
// EXECUTE FILTERS
// If we have at least 1 URL parameter correctly formed or entered...
if ( !is_null( $VALIDATE = filter_input_array( INPUT_GET, $FILTERS_ACTIVE ) ) ) {
/*
ABOUT array_filter
According to the PHP documentation, array_filter filters elements of an array
using an optional callback function.
If no callback is supplied, all key=>value pairs of $VALIDATE equal to FALSE will be removed.
*/
// ARRAY FILTER - PASSED
// int | key=>value pairs
$INT_ARRAY_FILTER = array_filter( $VALIDATE, 'is_int' );
// ARRAY FILTER - UNSET
// null | key=>value pairs
$NULL_ARRAY_FILTER = array_filter( $VALIDATE, function($value) { return $value === null; } );
// ARRAY FILTER - FAILED
// false | key=>value pairs
$FALSE_ARRAY_FILTER = array_filter( $VALIDATE, function($value) { return $value === false; } );
echo '<h3>URL Input</h3>';
// VALIDATE - PASS
// LOOP through INT_ARRAY_FILTER - array
foreach( $INT_ARRAY_FILTER as $key => $value ) {
// integer in filter range
$msg = "URL Parameter <strong style="color:green;"><code>%s=%s</code></strong> | in filter range.<br>";
// RENDER
printf( $msg, $key, $value );
}
// VALIDATE - UNSET
// LOOP through NULL_ARRAY_FILTER - array
foreach( $NULL_ARRAY_FILTER as $key => $value ) {
// null = unset
$msg = "URL Parameter <strong style="color:darkorange;"><code>%s=</code></strong> | unset.<br>";
// RENDER
printf( $msg, $key, $value );
}
// VALIDATE - FAIL
// LOOP through FALSE_ARRAY_FILTER - array
foreach( $FALSE_ARRAY_FILTER as $key=>$value ) {
// null = unset
$msg = "URL Parameter <strong style="color:red;"><code>%s=</code></strong> | out of filter range.<br>";
// RENDER
printf( $msg, $key, $value );
}
echo '<br>';
echo '<hr>';
echo '<h3>Output</h3>';
echo 'var_dump (<strong style="color:blue;">$VALIDATE</strong>):';
echo '<br>';
var_dump( $VALIDATE );
echo '<br><br>';
echo 'var_dump (<strong style="color:green;">$INT_ARRAY_FILTER</strong>):';
echo '<br>';
var_dump( $INT_ARRAY_FILTER );
echo '<br><br>';
echo 'var_dump (<strong style="color:darkorange;">$NULL_ARRAY_FILTER</strong>):';
echo '<br>';
var_dump( $NULL_ARRAY_FILTER );
echo '<br><br>';
echo 'var_dump (<strong style="color:red;">$FALSE_ARRAY_FILTER</strong>):';
echo '<br>';
var_dump( $FALSE_ARRAY_FILTER );
echo '<br><br>';
// Outter IF
} else {
// $VALIDATE = NULL
echo '<h3>URL Input Error</h3>';
echo 'URL Parameter(s) <strong>not present</strong> in URL | missing.';
echo '<br>';
echo 'At least 1 URL parameter is required!';
echo '<br><br>';
echo '<strong>URL Example:</strong> <code>index.php<strong>?year=2019</strong></code>';
echo '<br><br>';
echo '<hr>';
echo '<h3>Output</h3>';
echo 'var_dump (<strong style="color:blue;">$VALIDATE</strong>):';
echo '<br>';
var_dump( $VALIDATE );
echo '<br><br>';
}
?>