PHP is_int未按预期执行

时间:2012-01-22 19:25:29

标签: php isinteger

我有一个页面(index.php)从URL中获取GET变量并检查它是否安全。此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 个答案:

答案 0 :(得分:21)

如果它在查询字符串中传递,它将不是整数。

尝试is_numeric()

答案 1 :(得分:5)

有一种更好的方法可以做到这一点,即转换为int:

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

is_int 的行为符合预期。因为GET参数总是字符串。尝试var_dumping它们。

答案 2 :(得分:0)

有时您想要验证应该是数字的输入,但在$_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

也可以使用override_function()覆盖is_int()函数,但它在原始版本中仍然有用。