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

Pet*_*ell 4 php

下面的解决方案是我已经煮熟以检查$ _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');
        }
    }
Run Code Online (Sandbox Code Playgroud)

dec*_*eze 6

if (!isset($_GET['id'])) {
    $errors[] = 'Empty user id';
} else if (!ctype_digit($_GET['id'])) {
    $errors[] = 'Invalid id';
} else {
    $num_user_id = (int)$_GET['id'];
}
Run Code Online (Sandbox Code Playgroud)

这涵盖了所有可能性:未设置而非数字.

也就是说,如果你需要区分你的错误消息未设置不是数字.否则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;
Run Code Online (Sandbox Code Playgroud)