如何根据预期类型检查数据有效性?

时间:2018-01-25 09:50:32

标签: php validation

我需要验证从HTTP请求(通常来自$ _POST和$ _GET)收到的一些值与其相关的预期类型。

以下是如何定义可能的参数:

$defs = [ 
'op'       => [ 'type' => 'string' ],
'out'      => [ 'type' => 'integer'],
'throttle' => [ 'type' => 'double']
];

PHP提供了filter_var()函数,它实际上清理了值,但没有告诉格式是否有效。

有没有其他方法可以实现这一点,而无需为每种可能的类型(字符串,布尔值,整数,浮点数,双精度数组,数组)编写正则表达式?

3 个答案:

答案 0 :(得分:1)

修改

由于我不太可能找到进一步开发我的图书馆的时间,我正在提供另一个图书馆供使用 Respect/Validation(R / V)有许多功能可供使用,现在可以使用 ;也就是说,它不像我的那样正在进行中。

这是相同的工作示例,但使用R / V.

use Respect\Validation\Validator as v;

// these are from your POST, I think
$op = "test";
$out = 10.5;
$throttle = 10.5;

$defs = [ 
    "op"       => ["type" => "string"],
    "out"      => ["type" => "integer"],
    "throttle" => ["type" => "double"]
];

foreach ($defs as $name => $settings) {
    if (v::type($settings["type"])->validate($$name)) {
        echo "<p><i>$name</i> is okay</p>";
    } else {
        echo "<p><i>$name</i> is <b>not</b> okay</p>";
    }
}

关于解释,这与我原来的答案相同 - 除了访问错误。

在R / V中,您需要尝试/捕获错误使用不同的验证方法 - assert。见下文。

foreach ($defs as $name => $settings) {
    try {
        v::type($settings["type"])->assert($$name);
        echo "<p>No problem</p>";
    } catch (Respect\Validation\Exceptions\ExceptionInterface $ex) {
        foreach ($ex->getMessages() as $error) {
            echo "<p>$error</p>";
        }
    }
}

在上面的示例中,捕获了错误。 R / V使用getMessages返回所有错误的数组。我用它来迭代它们然后打印它们。

以下原始答案

我创建了一个WIP库:https://github.com/JustCarty/Validator

实施例

如果我已正确理解了这个问题,那么你会像这样使用它:

$v = new Validator();

// these are from your POST, I think
$op = "test";
$out = 10.5;
$throttle = 10.5;

$defs = [ 
    "op"       => ["type" => "string"],
    "out"      => ["type" => "integer"],
    "throttle" => ["type" => "double"]
];

foreach ($defs as $name => $settings) {
    if ($v->clearErrors()->setDataType($settings["type"])->validate($$name)) {
        echo "<p><i>$name</i> is okay</p>";
    } else {
        echo "<p><i>$name</i> is <b>not</b> okay</p>";
    }
}

输出

op 没关系 out 好吧 throttle 没关系

如何运作

它像任何其他类一样初始化。只需创建一个变量并使用new关键字 如您在示例中所见,它是可链接的。

foreach循环将循环遍历您的定义,并将变量(或字符串)的名称存储在名为$name的变量中,将变量中的设置数组存储在$settings中。 第一步是清除以前的错误。这是因为我们没有初始化每次迭代,我们保持相同的实例并更改其属性。 下一个方法是setDataType。我们访问settings数组的type属性,然后设置此验证的数据类型 下一个方法看起来很奇怪。双美元符号将按以下方式评估(我使用第一次迭代作为示例):

$$name;
$op; // outputs "test"

您可以详细了解double dollar here

可以在失败的if语句中访问错误。例如,您可以致电$v->error$v->errno$v->errorList分别检索上一个错误,错误编号或所有错误。

声明

图书馆中还有其他一些选项 请注意,它是 WIP ,因此可能存在一些问题。

我还会在某个时间点创建自述文件......

答案 1 :(得分:0)

更好地使用filter_var功能 这里的文档:http://php.net/manual/en/function.filter-var.php

答案 2 :(得分:0)

当你只想检查某些东西的类型时,PHP有两种方法。您可以使用gettype函数(请参阅示例)或is_TYPE函数(TYPE是占位符)。在这里,您可以看到is_TYPE函数的完整列表。 http://php.net/manual/en/book.var.php

$defs = [ 
    'op'       => [ 'type' => 'string' ],
    'out'      => [ 'type' => 'integer'],
    'throttle' => [ 'type' => 'double']
];

$in = [
    'op' => 'test',
    'out' => 123,
    'throttle' => 1.234
];

foreach ($in as $k => $v) {
    var_dump(gettype($v) === $defs[$k]['type']);
}