PHP检查$_GET变量是否为整数

7
下面的解决方案是我想出来的,用于检查$_GET中的变量是否为整数。它似乎有些复杂,我相信一定有更简单的解决方案。错误数组用于向用户显示消息。
    // Create array to hold errors
    $errors = array();

    // Get ID from URL
    $user_id = isset($_GET['id']) ? $_GET['id'] : '';

    // Check for empty ID
    if (empty($user_id)) {
        array_push($errors, 'Empty user ID');
    } else {
        // Check if ID is numeric
        if (!is_numeric($user_id)) {
            array_push($errors, 'Invalid user ID');
        } else {
            // Get numerical value of string (int or float)
            $num_user_id = $user_id + 0;
            // Check that number is an int
            if (!is_integer($num_user_id))
                array_push($errors, 'Invalid user ID');
        }
    }

1
请查看 http://php.net/manual/de/function.filter-input.php。 - dev0
你尝试过 (int)$_GET['id'] 吗? - Ali Shan
if(empty($_GET['id']) || !is_integer((int)$_GET['id']) { $errors[]='Invalid user ID';} - Steve
1
你可以尝试使用 filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT); - Professor Abronsius
3个回答

7
if (!isset($_GET['id'])) {
    $errors[] = 'Empty user id';
} else if (!ctype_digit($_GET['id'])) {
    $errors[] = 'Invalid id';
} else {
    $num_user_id = (int)$_GET['id'];
}

这涵盖了所有的可能性:未设置和非数字。

如果您需要区分您的错误消息是“未设置”还是“非数字”,那么应该看看filter_input。否则,可以放宽对特定无效性的限制。


一个无效的id就是一个无效的id,为什么无效并不重要。导致id无效的原因比其有效的原因更多。关注所有这些原因并不一定值得这样做。

我假设您正在从数据库中获取具有该id的用户记录;您的错误控制应该更遵循以下逻辑:

  • 如果$_GET['id']根本没有设置:
    • 错误400,错误的请求
  • 否则,使用给定的id从数据库检索记录,不管id长成什么样子(但请注意,无效值可能造成的影响以及您是否真的需要去关心这些)
    • 如果没有找到记录:
      • 错误404,未找到
    • 否则:
      • 显示页面

在此范围内,filter_input非常完美:

if (!$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT)) {
    header("HTTP/1.0 400 Bad Request");
    exit;
}

if (!$user = get_user_record($id)) {
    header('HTTP/1.0 404 Not Found');
    exit;
}

echo $user;

谢谢你的帮助。我会采纳你的建议并与和我一起工作在同一项目上的其他人讨论。 - Peter Bushnell

1
你可以使用 (int) 将传入的 GET 转换为整数。当这个数字 大于0 时,它已经是一个有效的数字了。
<?php
$user_id = isset($_GET['id']) ? (int)$_GET['id'] : 0;

if(0 < $user_id) {
    // Do your foo and bars
}

-1
使用这个简单的函数:
<?php
    function isInteger($input){
        return(ctype_digit(strval($input)));
    }
    $user_id  = isInteger($_GET['id']);

    if($user_id) {
        // its numeric
    } else {
        // it is not numeric
    }
?>

来源:http://php.net/manual/zh/function.is-int.php

将这个概念应用于您的实际操作:

<?php
// Create array to hold errors
    $errors = array();

    // Get ID from URL
    $user_id = isset($_GET['id']) ? $_GET['id'] : '';

    // Check for empty ID
    if (empty($user_id)) {
        array_push($errors, 'Empty user ID');
    } else {
        if(!ctype_digit(strval($user_id))) {
            array_push($errors, 'Invalid user ID');
        } else {
            // Get numerical value of string (int or float)
            $num_user_id = $user_id + 0;
            // Check that number is an int
            if (!ctype_digit(strval($num_user_id)))
                array_push($errors, 'Invalid user ID');
        }
    }
?>

1
这将产生通知,因为您无法确定 $_GET['id'] 是否已设置。 - deceze
@deceze 是的,但那只是给他的一个提示,我已经更新了答案。顺便说一句,谢谢你扣除我的两个点;) - Rehmat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接