PHP is_int не работает должным образом - PullRequest
7 голосов
/ 22 января 2012

У меня есть страница (index.php), которая берет переменную GET из URL и проверяет ее в целях безопасности.Эта переменная GET должна быть только целым числом.Я использую следующий код, чтобы проверить это, но во всех случаях, целое число или нет, я получаю страницу index.php.Заголовок никогда не появляется.После этого кода появляется остальная часть страницы, начинающаяся с тега html.

PHP:

<?php ob_start(); session_start();
$q=trim($_GET['q']);
if (!is_numeric($q)){
header("HTTP/1.0 404 Not Found");
}
?>

Ответы [ 3 ]

21 голосов
/ 22 января 2012

Это не будет целое число, если оно передается в строке запроса.

Попробуйте is_numeric()

5 голосов
/ 22 января 2012

Есть лучший способ сделать это, приведя к int:

$q = (int) $_GET['q'];

is_int - это , ведущий себя как ожидалось.Потому что аргументы GET всегда являются строками.Попробуйте var_dumping их.

0 голосов
/ 21 апреля 2014

Иногда вы хотите проверить ввод, который должен быть числом, но в $_GET или $_POST вы получите его в виде строки.is_numeric() может быть проблематично, поскольку он допускает шестнадцатеричный, двоичный и восьмеричный формат (из руководства):

Thus +0123.45e6 is a valid numeric value. Hexadecimal (e.g. 0xf4c3b00c), Binary (e.g. 0b10100111001), Octal (e.g. 0777) notation is allowed too but only without sign, decimal and exponential part.

Вы не можете использовать is_int(), поскольку это только для целочисленных значений(не строка!) так ... Вы можете проверять числа, которые являются строковыми и целыми числами, следующим образом:

function is_int_val($value){

    if( ! preg_match( '/^-?[0-9]+$/', $value ) ){
        return FALSE;
    }


    /* Disallow leading 0 */

    // cast value to string, to make index work
    $value = (string) $value;

    if( ( $value[0] === '-' && $value[1] == 0 ) || ( $value[0] == 0 && strlen( $value ) > 1 ) ){
        return FALSE;
    }


    return TRUE;
}

is_int_val('33');  // true
is_int_val('33a'); // false
is_int_val('033'); // false

Также можно переопределить функцию is_int (), используя override_function () но это может быть полезно в оригинальной версии.

...