使用==与strcmp进行string比较
似乎PHP的==
运算符是区分大小写的? 那么有什么理由使用strcmp()
? 做这样的事是否安全?
if ( $password == $password2 ) { ... }
使用它的原因是因为strcmp
如果str1小于str2则返回<0; 如果str1大于str2则为0;如果相等则为0。
==
只返回true
或false
,它不会告诉你哪个是“更大”的string。
你不应该使用==
来进行string比较。 ===
是的。
$something = 0; echo ('password123' == $something) ? 'true' : 'false';
只要运行上面的代码,你会看到为什么。
$something = 0; echo ('password123' === $something) ? 'true' : 'false';
现在,这个好一点。
不要在PHP中使用==。 它不会做你期望的。 即使您将string与string进行比较,PHP也会隐式地将它们转换为浮点数,并在出现数字时进行数字比较。
例如'1e3'=='1000'返回true。
好吧..根据这个PHP错误报告 ,你甚至可以得到0wned。
<?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.'; } ?>
它给你一个警告,但仍然绕过比较。
你应该这样做===
@postfuturistbuild议。
一定要记住,比较string时,应该使用===
运算符(严格比较)而不是 ==
运算符(宽松比较)。
使用==
可能是危险的。
请注意,如果两者不同,它会将该variables转换为另一种数据types。
例子:
-
echo (1 == '1') ? 'true' : 'false';
-
echo (1 == true) ? 'true' : 'false';
正如你所看到的,这两个来自不同的types,但结果是true
,这可能不是你的代码所期望的。
但是,使用===
,build议testing显示它比strcmp()
及其不区分大小写的替代方法strcasecmp()
快一点。
快速谷歌search这个速度比较: http : //snipplr.com/view/758/
strcmp()和“===”都区分大小写,但“===”要快得多
示例代码: http : //snipplr.com/view/758/
strcmp会根据它运行的环境(Linux / Windows)返回不同的值!
原因是它有一个错误报告说错误https://bugs.php.net/bug.php?id=53999
请小心处理!!谢谢。
总结所有答案:
-
==
是string比较的一个坏主意 。
在许多情况下,它会给你“惊人的”结果。 不要相信它。 -
===
很好,会给你最好的performance。 -
如果您需要确定哪个string是“更大”,通常用于sorting操作,则应使用
strcmp()
。
此function可以帮助sorting。 要更清楚地分类。 如果string1在string2之前sorting,则strcmp()返回小于0;如果string2在string1之前sorting,strcmp()返回小于0;如果它们相同,则返回0。 例如
$first_string = "aabo"; $second_string = "aaao"; echo $n = strcmp($first_string,$second_string);
该函数将返回大于零,因为aaao正在sorting之前aabo。
如果您希望按照字典顺序排列/比较string,可以使用strcmp()
。 如果你只是想检查平等,那么==
就好了。
使用strcmp进行string比较
echo strcmp("my name","my name");