【问题标题】:PHP - if == not working for 0 or "" [duplicate]PHP - 如果 == 不适用于 0 或“” [重复]
【发布时间】:2014-05-30 03:05:12
【问题描述】:

我正在使用 if 查询检查请求的验证,

if ($request_userid == $userid) {
...
}

按预期工作。但进一步的测试表明,如果 $request_userid$userid 为 0 或 "",则条件为真,脚本运行 if 查询,但它不应该。

我目前正在解决它:

if ($userid == "" ) {
exit ("exit");
}

但我不认为这是正确的方法?

您能否解释一下为什么它不适用于 if 查询以及检查它的正确方法是什么?

【问题讨论】:

  • @CBroe 在某种程度上,它可能在某种程度上是对其他线程的欺骗。但更大的范围似乎是用户输入验证的基本概念以及如何针对在处理用户生成的数据时可能出现的未知数据进行编码。

标签: php if-statement


【解决方案1】:

这里是the PHP page on comparison operators

您正在使用双等号进行松散比较。将其更改为三等号,它将按类型和值进行检查。

另请参阅booleans & casting 上的此页面。

'' == 0 计算结果为 TRUE 的原因是整数 0 在转换为布尔值时会转换为 FALSE。空字符串 ('') 也转换为 FALSE。因此,您的比较最终看起来像 if (false == false),这是真的。

【讨论】:

  • 所以 $a === $b 是正确的吗?我已经尝试过了,但它没有任何区别。我得到与 == 相同的结果。当我理解正确时,12 == 21 为真,12 === 21 为假,对吗?
  • $a === $b 是编写条件的有效方式。 12 == 21 是真的,12 === 21 也是真的。但是12 === '21' 会是假的,因为'21' 是一个字符串,12 是一个整数。通过严格比较 (===),这两个变量必须是等价的并且它们必须是相同的类型。
  • 非常感谢 - 如果 ($request_userid === "$userid") 可以正常工作 - 只是为了绝对确定 - 这是检查的正确方法吗?抱歉再次询问,我对 php 很陌生。
  • 没有最终的“正确”检查方法。这取决于您的用例。但通常,使用严格比较进行检查会更安全,以确保您知道自己得到了什么。但在某些情况下,您可能需要松散的比较。所以这一切都取决于。
【解决方案2】:

你可以使用

if ($request_userid === $userid && $userid != "" )

【讨论】:

    【解决方案3】:

    为什么它不适用于 if 查询?

    因为您使用 == 比较运算符比较类型,所以 "" 的类型和假设 $userid = "SpongeBob" 将匹配。

    检查它的正确方法是什么?

    现在,如果您使用=== 比较运算符,您将比较相等性,如果它们相同,您将进行比较,并且 $userid = "SpongeBob" 不会与 "" 匹配

    【讨论】:

    • "SpongeBob" == "" 应该返回 false(即使比较松散)。这两个都是字符串,所以不需要类型转换。
    【解决方案4】:

    只需将逻辑更改为:

    if ((!empty($request_userid) && !empty($userid)) && ($request_userid === $userid)) {
    ...
    }
    

    问题是0null 在您执行== 时总是相等的,它在两种不同的数据类型之间进行比较;即:null0。但是=== 确保两个值具有相同的类型。所以0null 永远不会与=== 匹配。 !empty() 检查是另一个验证级别,确保 === 永远不会发生,除非 $request_userid$userid 100% 不为空。

    也就是说,您当前用于解决此问题的条件将起作用:

    if ($userid == "" ) {
       exit ("exit");
    }
    

    但我建议将其更改为:

    if (empty($userid)) {
       exit ("exit");
    }
    

    归根结底,这不是一个杂乱无章的事情,而只是一种处理验证用户输入现实的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-28
      • 2016-07-09
      • 2016-07-10
      • 1970-01-01
      • 2017-06-06
      • 1970-01-01
      相关资源
      最近更新 更多