php评估if语句的序列

时间:2015-04-10 13:15:29

标签: php syntax

我无法清理用户输入,我不知道,是否已发送POST数据。当我这样做时,检查:

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

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

所以我现在检查一下:

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

这不会输出错误但对我来说看起来很不稳定。我不确定我是否只是运气好我的PHP版本或声明的简单性。当if语句更复杂时,只要这两个项的顺序相同,它是否也可以安全使用?与所有PHP版本一起使用是否安全?

4 个答案:

答案 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?以获取有关相等性检查的更多信息。

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