if语句的php评估序列



我在清理用户输入时遇到了问题,我不知道POST数据是否已发送。当我这样做只是为了检查:

if ($_POST["somedata"] == 2)
  DoSomething();

我会收到error_reporint = E_ALL的错误通知,可能没有定义$_POST["somedata"](例如,当加载页面时没有表单)。

所以我现在做这个检查:

if (isset($_POST["somedata"]) && $_POST["somedata"] == 2)
  DoSomething();

这不会输出错误,但对我来说它看起来非常不稳定。我不确定我的PHP版本是运气好还是语句简单。如果if语句更复杂,只要这两项的顺序相同,那么使用它是否也安全?与所有PHP版本一起使用安全吗?

isset与懒惰和(&&)结合使用相对正确(它可以防止严格警告)。一种更高级的方法是根据模式或模型进行自动输入检查。

你可以有:

$schema = array(
    "somedata" => "number"
);

使用模式方法需要一点体系结构,但它消除了您可能担心的不稳定性。


值得一提的是,在语法级别验证输入(我是否获得了所有必需的输入)和在语义级别验证输入之间存在差异。假设您有一个名为GetItem的服务,并且您通过id = 3,语法检查器将检查id属性的存在,以及它是一个数字。然后您需要检查3是否真的存在。

因此,与其返回invalid request (bad input),不如返回no such item

您的方法在功能上是正确的,因为&如果第一项评估为false,则短路。关于稳定性,正如您所怀疑的,有一个小问题,特别是与代码重复有关,主要是您需要始终注意两个键匹配同一字符串(可以说这是代码重复的问题)

一种方法是定义一个函数来进行检查并返回所需密钥处的内容(如果存在),例如:

function arr(array $array, $key, $defaultValue=false) {
    return isset($arrray[$key]) ? $array[$key] : $defaultValue            
}

调用函数只需支付少量的性能损失(可以通过删除$array参数的类型提示来减少性能损失),但是您有一个更稳定的代码

您案例中的使用示例:

if(arr($_POST, 'somedata') === 2)) {
    // do your stuff
}

我们在工作中使用它已经有一段时间了,可以追溯到几年前的代码中。使用它很好,因为它首先检查变量是否真的存在,然后才检查它是否有值。

您的代码片段是正确的。

    if (isset($_POST["somedata"]) && $_POST["somedata"] == 2)
            DoSomething();

我强烈建议您在质量检查中使用三重等式。看看PHP等式(==doubleequals)和身份(==tripleequals)比较运算符有何不同?了解有关平等检查的更多信息。

三重相等意味着它需要是一个整数,而不仅仅是一个字符串,这是一个很好的实践。

最新更新