我无法清理用户输入,我不知道,是否已发送POST数据。当我这样做时,检查:
if ($_POST["somedata"] == 2)
DoSomething();
我会收到error_reporint = E_ALL
的错误通知,$_POST["somedata"]
可能未定义(例如,在没有表单的情况下加载页面时)。
所以我现在检查一下:
if (isset($_POST["somedata"]) && $_POST["somedata"] == 2)
DoSomething();
这不会输出错误但对我来说看起来很不稳定。我不确定我是否只是运气好我的PHP版本或声明的简单性。当if语句更复杂时,只要这两个项的顺序相同,它是否也可以安全使用?与所有PHP版本一起使用是否安全?
答案 0 :(得分:2)
将isset
与惰性和(&&
)结合使用是相对正确的(它可以防止严格警告)。更高级的方法是对模式或模型进行自动输入检查。
你可以:
$schema = array(
"somedata" => "number"
);
使用模式方法需要一些架构,但它消除了您可能担心的不稳定性。
值得一提的是,在语法级别验证输入(我是否获得所有必需的输入)和语义级别的输入验证之间存在差异。假设您有一个名为GetItem
的服务,并且您传递id = 3
语法检查程序将检查是否存在id
属性并且它是一个数字。然后,您需要检查3
是否确实存在。
因此,您可能希望返回invalid request (bad input)
而不是返回no such item
。
答案 1 :(得分:0)
您的方法在功能上是正确的,因为&&如果第一项评估为假,则会被短路。关于稳定性,正如您所怀疑的那样,存在一个小问题,特别是与代码重复有关,主要是您需要始终注意两个密钥匹配相同的字符串(这恰好说这是代码重复的问题)。 />
一种方法是定义一个执行检查的函数,并返回所需键的内容(如果存在),例如:
function arr(array $array, $key, $defaultValue=false) {
return isset($arrray[$key]) ? $array[$key] : $defaultValue
}
调用函数会给性能带来很小的性能损失(可以通过删除$ array参数的类型提示来减少它),但是你有一个更稳定的代码。
您的案例中的用法示例:
if(arr($_POST, 'somedata') === 2)) {
// do your stuff
}
答案 2 :(得分:-1)
我们已经在工作中使用了一段时间了,在代码中可以追溯到几年前。它可以使用,因为它首先检查变量实际上是否存在,然后检查它是否有值。
答案 3 :(得分:-1)
您的代码段是正确的。
if (isset($_POST["somedata"]) && $_POST["somedata"] == 2)
DoSomething();
我强烈建议您使用三等于您的质量检查。查看How do the PHP equality (== double equals) and identity (=== triple equals) comparison operators differ?以获取有关相等性检查的更多信息。
三重相等意味着它需要是一个整数而不仅仅是一个字符串,这是一个很好的做法。