PHP的===操作符似乎是区分大小写的。那么,是否有理由使用strcmp()呢?
做下面这样的事情安全吗?
if ($password === $password2) { ... }
PHP的===操作符似乎是区分大小写的。那么,是否有理由使用strcmp()呢?
做下面这样的事情安全吗?
if ($password === $password2) { ... }
当前回答
始终记住,在比较字符串时,应该使用===操作符(严格比较)而不是==操作符(松散比较)。
其他回答
使用==可能很危险。
注意,如果这两种数据类型不同,它会将变量强制转换为另一种数据类型。
例子:
Echo (1 == '1') ?'true': 'false'; Echo (1 == true) ?'true': 'false';
正如您所看到的,这两个是来自不同类型的,但结果为真,这可能不是您的代码所期望的。
但是,建议使用===,因为测试表明它比strcmp()及其不区分大小写的替代方案strcasecmp()快一些。
在谷歌上快速搜索一下,可以找到这个速度对比:http://snipplr.com/view/758/
嗯…根据这份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建议的那样做。
Strcmp()和===都是区分大小写的,但是===更快。
示例代码:Speed Test: strcmp vs ===
如果希望按字典顺序排列/比较字符串,可以使用strcmp()。如果你只是想检查是否相等,那么==就可以了。
使用它的原因是strcmp
如果str1小于str2则返回< 0;>如果str1大于str2则为0,如果相等则为0。
===只返回true或false,它不会告诉你哪个字符串更大。