php filter var возвращает неверный результат

Я хотел использовать функцию php filer_var, но она возвращает неверный результат, похоже, она не учитывает диапазон:

$v = 54;

$int_opts = array (

    'min_range' => 0,
    'max_range' => 24

);

if ( filter_var($v, FILTER_VALIDATE_INT, $int_opts) ) echo 'an integer';

else echo 'not an integer';

Это не должно быть целое число, так как 54 не находится между 0 и 24, но оно возвращает true и возвращает «целое число».

В чем проблема?

Спасибо.


person medk    schedule 01.09.2011    source источник
comment
Действительно, подтверждено на PHP 5.3 в Windows. Я тоже не вижу ничего плохого в синтаксисе. filter_var() действительно глючит?   -  person Pekka    schedule 01.09.2011
comment
да я на win7 x86 с PHP 5.3.5   -  person medk    schedule 01.09.2011
comment
Ах, это действительно синтаксис. Смотрите мой ответ.   -  person Pekka    schedule 01.09.2011
comment
PHP 5.2 Win7x32 - работает нормально.   -  person J0HN    schedule 01.09.2011
comment
@J0HN: x86 или x64 нет x32 :)   -  person medk    schedule 01.09.2011


Ответы (3)


Массив «options» должен иметь элемент с именем «options». Из руководства:

$options = array(
    'options' => array(
        'default' => 3, // value to return if the filter fails
        // other options here
        'min_range' => 0
    ),
    'flags' => FILTER_FLAG_ALLOW_OCTAL,
);

вы не передаете это, поэтому отображаемое поведение в порядке.

person Pekka    schedule 01.09.2011
comment
В этом очень легко ошибиться - он должен был быть разработан по-другому, IMO. - person Pekka; 01.09.2011
comment
хорошо, я только что нашел проблему. min_range и max_range должны быть помещены в массив параметров внутри основного массива, если вы перепроверите мой исходный код, вы найдете ошибку. и даже без дефолта и флажков. Спасибо, в любом случае. - person medk; 01.09.2011

$options = array(); 
$options['options']['min_range'] = 0; 
$options['options']['max_range'] = 24; 
$options['flags'] = FILTER_FLAG_ALLOW_OCTAL; 
var_dump(filter_var(54, FILTER_VALIDATE_INT, $options)); //bool(false)
var_dump(filter_var(21, FILTER_VALIDATE_INT, $options)); //int(21)

Это работает следующим образом.

О FILTER_FLAG_ALLOW_OCTAL:

Рассматривает входные данные, начинающиеся с нуля (0), как восьмеричные числа. Это позволяет только последующим цифрам быть 0-7. Согласно этому:

var_dump(filter_var(06, FILTER_VALIDATE_INT, $options)); //int(6)
var_dump(filter_var(09, FILTER_VALIDATE_INT, $options)); //int(0)
person Community    schedule 01.09.2011

В версии 5.3.8 исправлена ​​ошибка № 47745, которая означала, что FILTER_VALIDATE_INT не допускал минимальное целое число.

Файл, который вы, возможно, захотите проверить, это ext/filter/logical_filters.c.

void php_filter_int(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */
{
....
person thomas-peter    schedule 01.09.2011