PHP的===操作符似乎是区分大小写的。那么,是否有理由使用strcmp()呢?

做下面这样的事情安全吗?

if ($password === $password2) { ... }

如果希望按字典顺序排列/比较字符串,可以使用strcmp()。如果你只是想检查是否相等,那么==就可以了。


使用它的原因是strcmp

如果str1小于str2则返回< 0;>如果str1大于str2则为0,如果相等则为0。

===只返回true或false,它不会告诉你哪个字符串更大。


使用==可能很危险。

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

例子:

Echo (1 == '1') ?'true': 'false'; Echo (1 == true) ?'true': 'false';

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

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

在谷歌上快速搜索一下,可以找到这个速度对比:http://snipplr.com/view/758/


永远不要使用==进行字符串比较。===是可以的。

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

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

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

现在好一点了。


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

原因是它有一个错误,正如错误报告所说- bug #53999strcmp()并不总是返回-1、0或1


不要在PHP中使用==。它不会如你所愿。即使是字符串与字符串进行比较,PHP也会隐式地将它们转换为浮点数,并在它们显示为数值时进行数值比较。

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


嗯…根据这份PHP bug报告,你甚至会被骗。

<?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建议的那样做。


始终记住,在比较字符串时,应该使用===操作符(严格比较)而不是==操作符(松散比较)。


此外,该函数可以帮助排序。为了更清楚地理解排序。如果string1在string2之前排序,Strcmp()返回小于0;如果string2在string1之前排序,则返回大于0;如果两者相同,则返回0。例如

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

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


Strcmp()和===都是区分大小写的,但是===更快。

示例代码:Speed Test: strcmp vs ===


总结所有答案:

==对于字符串比较来说是一个坏主意。 在许多情况下,它会给你“令人惊讶”的结果。不要相信它。 ===很好,会给你最好的表现。 如果需要确定哪个字符串“更大”,则应该使用Strcmp(),通常用于排序操作。


在PHP中,不使用字母排序,而是使用字符的ASCII值进行比较。

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


If ($password === $password2){…}在比较其中一个输入是用户控制的密码或密码散列时,这样做并不安全。 在这种情况下,它会创建一个计时oracle,允许攻击者从执行时间差中获得实际的密码散列。 使用if (hash_equals($password, $password2)){…因为hash_equals执行“定时攻击安全字符串比较”。