0

如何快速验证 CodeIgniter 中的 a GETorPOST变量是否既已设置又为数字以用作视图中的错误或状态消息?

每次我想检查变量时,每次都做这样的事情是非常乏味的:

if ($this->input->get('error', True)) {
    if (is_numeric($this->input->get('error', True))) {
        $data['error'] = $this->input->get('error', True);
    }
}
4

3 回答 3

2

CodeIgniter 的 get_numeric_input()

混合get_numeric_input ( 字符串$name [, bool $required = True [, string $source = "GET" [, bool *$xss_clean* = True ]]] )

下面是我创建的一个函数,因为我厌倦了检查 GET 和 POST 变量是否存在并且是数字的。

这主要用于处理错误或状态消息时,因为我可以使用redirect("original_page.php?error=1");将错误传递给原始页面。在原始页面上,我可以简单地if (isset($error)) { … }根据值执行并显示一条消息。但是,为了安全起见,有必要在将这些变量发送到视图之前检查这些变量。这个过程被证明是相当重复和乏味的。

下面这个函数要添加到底部wwwroot/application/system/core/Input.php

它的用途如下:

示例 1:

function index() {
   if ($error = $this->input->get_numeric_input('error', True, "GET", True)) {
      $data['error'] = $error;
   }
}

在此示例中,如果$_GET['error']既是设置又是数字,它将设置$data['error']为该值。如果它未设置和/或不是数字,它将终止脚本。

示例 2:

function index() {
   if ($error = $this->input->get_numeric_input('error', False, "POST", True)) {
      $data['error'] = $error;
   }
}

在此示例中,如果$_POST['error']既是设置又是数字,它将设置$data['error']为该值。如果它没有设置和/或不是数字,它将继续并且不会在 $data 数组中设置任何值。

第一个参数是要检查的变量名。第二个变量是使检查是否需要的布尔值。如果您将此设置为 TRUE,则如果未设置变量或如果它不是数字,它将显示错误并立即终止脚本。如果设置为 False,那么它将简单地返回 False,脚本将继续运行。第三个变量是 POST 或 GET,它将确定函数是否在 $_GET 或 $_POST 数组中查找变量。最后,第四个变量指示返回时值是否为 XSS_CLEAN。

注意:第二个、第三个和第四个参数都是可选的,并且分别默认为 True、“GET”和 True。

这是代码:

function get_numeric_input($name, $required = True, $source = "GET", $xss_clean = True) {
    if ($source === "GET") {
        if ($this->get($name, $xss_clean)) {
            if (is_numeric($this->get($name, $xss_clean))) {
                return $this->get($name, $xss_clean);
            } else {
                if ($required) {
                    show_error("$source variable $name is not numeric!");
                    log_message('error', "$source variable $name is not numeric!");
                    return False;
                } else {
                    return False;
                }
            }
        } else {
            if ($required) {
                show_error("$source variable $name is not set!");
                log_message('error', "$source variable $name is not set!");
                return False;
            } else {
                return False;
            }
        }
    } elseif ($source === "POST") {
        if ($this->post($name, $xss_clean)) {
            if (is_numeric($this->post($name, $xss_clean))) {
                return $this->post($name, $xss_clean);
            } else {
                if ($required) {
                    show_error("$source variable $name is not numeric!");
                    log_message('error', "$source variable $name is not numeric!");
                    return False;
                } else {
                    return False;
                }
            }
        } else {
            if ($required) {
                show_error("$source variable $name is not set!");
                log_message('error', "$source variable $name is not set!");
                return False;
            } else {
                return False;
            }
        }
    }
}
于 2012-08-13T02:59:13.350 回答
1

一种可能的替代方法是扩展表单验证,以便您也可以验证 $_GET。使用表单验证库确实可以节省时间 imo(扩展版本 - 适合您的需求 - 是可取的)。 CodeIgniter 验证:可以验证 GET 查询字符串吗?谈到这个。

于 2012-08-13T20:06:50.350 回答
1

只需使用中间变量即可获得简短而快速的代码:

$input_error = $this->input->get('error');
$data['error'] = ctype_digit($input_error) ? $input_error : FALSE;


如果你真的想要一个单行:

function validate_integer_input($input) {
    return ctype_digit($input) ? $input : FALSE;
}

$data['error'] = validate_integer_input($this->input->get('error'));


  • $data['error']将始终设置,这是一件好事,因为$data将始终设置在您的视图中,因此您可以简单地做if ($data)而不是if (isset($data)).
  • 在处理 GET 和 POST 输入时,您必须了解输入的某些方面。对于最重要的:
    • 一个 GET/POST 输入,当然,如果它被设置了,它总是字符串类型。
    • 只有''(空) 和'0'字符串评估为 FALSE,所有其他值评估为 TRUE。
    • ctype_digit()需要一个字符串,但此代码可能会将其传递为 FALSE(来自 CI->input)。但这很好,因为 FALSE强制转换为空字符串。


附带说明一下,这种情况不需要 XSS 过滤。

  • XSS 过滤具有相当大的性能影响,应仅在需要时激活。一个经验法则是,对于在 HTML 源中的任何位置显示或包含的数据都需要过滤。
  • 对于这种情况,我们已经确保输入只能包含数字,所以我们是安全的。
于 2012-09-03T06:41:54.017 回答