时间:2010-07-26 08:42:44

标签: php

13 个答案:

答案 0 :(得分:310)

答案 1 :(得分:211)

您永远不应该使用==进行字符串比较。 ===没问题。

$something = 0;
echo ('password123' == $something) ? 'true' : 'false';

只需运行上面的代码,您就会明白为什么。

$something = 0;
echo ('password123' === $something) ? 'true' : 'false';

现在,情况好一点。

答案 2 :(得分:96)

不要在PHP中使用==。它不会做你期望的。即使您将字符串与字符串进行比较,PHP也会隐式地将它们转换为浮点数,并在它们看起来是数字时进行数值比较。

例如'1e3' == '1000'返回true。您应该使用===代替。

答案 3 :(得分:43)

嗯..根据这个php bug report,你甚至可以得到假。

<?php 
    $pass = isset($_GET['pass']) ? $_GET['pass'] : '';
    // Query /?pass[]= will authorize user
    //strcmp and strcasecmp both are prone to this hack
    if ( strcasecmp( $pass, '123456' ) == 0 ){
      echo 'You successfully logged in.';
    }
 ?>

它会给你一个警告,但仍会绕过比较 您应该像@postfuturist建议的那样===

答案 4 :(得分:32)

永远记住,在比较字符串时,您应该使用===运算符(严格比较)和 ==运算符(松散比较)。

答案 5 :(得分:20)

使用==可能会有危险。

注意,如果两者不同,它会将变量转换为另一种数据类型。

示例:

  • echo (1 == '1') ? 'true' : 'false';
  • echo (1 == true) ? 'true' : 'false';

正如您所看到的,这两个来自不同的类型,但结果是true,这可能不是您的代码所期望的。

但建议使用===,因为测试表明它比strcmp()及其不区分大小写的替代strcasecmp()快一点。

快速谷歌搜索大喊这个速度比较:http://snipplr.com/view/758/

答案 6 :(得分:19)

  

总结所有答案:

  • ==是一个糟糕的主意,用于字符串比较。
    在许多情况下,它会给你“惊人”的结果。不要相信它。

  • ===很好,会给你最好的表现。

  • 如果您需要确定哪个字符串“更大”,则应使用
  • strcmp(),通常用于排序操作。

答案 7 :(得分:10)

strcmp()===都区分大小写,但===更快

示例代码:http://snipplr.com/view/758/

答案 8 :(得分:6)

strcmp将根据其运行的环境(Linux / Windows)返回不同的值!

原因是它有一个错误,因为错误报告说https://bugs.php.net/bug.php?id=53999

请小心处理!!谢谢。

答案 9 :(得分:4)

答案 10 :(得分:3)

此功能还可以帮助排序。要更清楚地排序。如果string1在string2之前排序,则strcmp()返回小于0,如果string2在string1之前排序,则strcmp()返回大于0;如果string2相同,则返回0。例如

$first_string = "aabo";
$second_string = "aaao";
echo $n = strcmp($first_string,$second_string);

该函数将返回大于零,因为aaao在aabo之前排序。

答案 11 :(得分:0)

PHP使用字符的 ASCII 值进行比较,而不是使用字母排序。小写字母的 ASCII 值比大写字母高。最好使用身份运算符 === 进行这种比较。 strcmp()是用于执行二进制安全字符串比较的函数。它以两个字符串作为参数,如果str1小于str2,则返回<0;否则,返回0。如果str1大于str2,则> 0;如果相等,则> 0。还有一个名为 strcasecmp()不区分大小写版本,该版本首先将字符串转换为小写字母,然后进行比较。

答案 12 :(得分:0)

在比较其中一个输入是用户控制的密码或密码散列时,

if ($password === $password2) { ... }并不安全。
在这种情况下,它会创建一个时间预言机,允许攻击者从执行时间差中得出实际的密码哈希。
改为使用if (hash_equals($password, $password2)) { ... },因为hash_equals执行“定时攻击安全字符串比较”。