Проверка года и недели с помощью фильтров. Как уведомить конкретный параметр вне диапазона?

#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. Еще раз спасибо, Майк!

ss1

Исходный код

 <?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>';

}

?>