如何根据预期类型检查数据有效性?
我需要验证从HTTP请求(通常来自$ _POST和$ _GET)收到的一些值与它们相关的预期类型。
这是如何定义可能的参数:
$defs = [
'op' => [ 'type' => 'string' ],
'out' => [ 'type' => 'integer'],
'throttle' => [ 'type' => 'double']
];
PHP提供了filter_var()函数,它实际上会清理这些值,但不会告诉格式是否有效。
是否有另一种方法来实现这一点,而不必为每种可能的类型(字符串,布尔值,整数,浮点数,双精度数组)编写正则表达式?
编辑
由于我不太可能会找到时间进一步发展我的图书馆,因此我正在提供另一个图书馆来使用。
尊重/验证(R / V)有许多功能可供使用,现在即可使用; 也就是说,这不是我的工作。
这是相同的工作示例,但使用R / V。
use RespectValidationValidator 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 (RespectValidationExceptionsExceptionInterface $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是好的
出来是不行的
油门没关系
怎么运行的
它像任何其他类一样被初始化。 只需创建一个变量并使用new
关键字。
它可以链接,就像你在例子中看到的那样。
foreach循环将循环遍历您的定义,并将变量(或字符串)的名称存储在名为$name
的变量中,并将设置数组存储在$settings
的变量中。
第一步是清除以前的错误。 这是因为我们不会初始化每个迭代,我们保持相同的实例并更改其属性。 下一个方法是setDataType
。 我们访问settings数组的type属性,然后为此验证设置数据类型。
下一个方法看起来很奇怪。 双美元符号将按以下方式评估(我使用第一次迭代作为示例):
$$name;
$op; // outputs "test"
你可以在这里阅读更多关于双倍美元的信息。
在失败的if语句中可以访问这些错误。 例如,您可以调用$v->error
, $v->errno
或$v->errorList
来分别检索最后一个错误,错误编号或所有错误。
放弃
图书馆还有其他一些选择。
请注意,这是WIP ,因此可能存在一些问题。
我也会在某个时间点创建一个自述文件...
更好地使用filter_var
函数。
文档在这里:http://php.net/manual/en/function.filter-var.php
当您只想检查某种东西时,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']);
}
链接地址: http://www.djcxy.com/p/92709.html