PHP string '==' returns false on same strings
PHP string '==' returns false on same strings
我有检查用户 cookie 的代码:
echo 'prev: ' . $prevCookie;
echo 'curr: ' . $currentCookie;
if ((string) $prevCookie == (string)$currentCookie) {
echo 'same cookies';
} else {
echo 'different cookies';
}
在大约 0.1% 的案例中,我得到了关注:
// prev: xxx
// curr: xxx
// different cookies
怎么会发生这种事?
PS。字符串被修剪,没有多余的空格。
更新
我可以为您提供存储在数据库中的实际值,但它们是相同的:
(direct), (organic), YandexCPC 等。如果我能以某种方式复制它,那将是非常容易的。
使用 strcmp (case sensitive) or strcasecmp(不区分大小写)。
对于字符串比较,在大多数语言中,使用直接比较字符串并不是一个好的解决方案。
echo 'prev: ' . $prevCookie;
echo 'curr: ' . $currentCookie;
if (strcmp($prevCookie,$currentCookie) === 0) {
echo 'same cookies';
} else {
echo 'different cookies';
}
我猜你的字符串有一些不可见的字符。
考虑以下几点:
$a = "abc";
$b = "abc[=10=]";
echo (int)( $a == $b );
这将回显 0
。
但是,如果您回显 $a
和 $b
,您将 看到 "abc"
。
另一种可能性可能是您reading/writting一个使用fopen()
但没有b
选项的文件。
Windows有一个功能,将\r
和\n
转换成\r\n
。
当您回读时,它带有 Windows' 行结尾。
比较时,值不同,因为 \r
(在 memory/cookie 中)与 \r\n
(从文件中读取)不同。
当您将它输出到浏览器时,它显示为abc
。浏览器忽略输出中的空格(可通过 CSS 更改)。
另一个可能是隐式数字转换。
考虑以下代码:
echo '1000000000000000000000000000000000000000000000000' == '1.0E+48';
这将回显 1
。在这里查看:http://sandbox.onlinephpfunctions.com/code/1debf1a505793e3d0fde3b174c26e1f1454ea1e2
使用 ===
解决这个问题。
可能会发生类似的事情。但这显示了相反的情况(比较 returns true
的 2 个不相等的不同字符串)。
来源和环境本身未知。
如何获得这些值也是未知的。
未知数太多...
有时在调试 ide 时会显示相同的值,但是例如,如果您正在比较一个全局值 inside 函数并且您没有声明结果将不相同 example
不工作
function compare($p){
return $p == $z;
}
会工作
function compare($p){
global $z;
return $p == $z;
}
我有检查用户 cookie 的代码:
echo 'prev: ' . $prevCookie;
echo 'curr: ' . $currentCookie;
if ((string) $prevCookie == (string)$currentCookie) {
echo 'same cookies';
} else {
echo 'different cookies';
}
在大约 0.1% 的案例中,我得到了关注:
// prev: xxx
// curr: xxx
// different cookies
怎么会发生这种事?
PS。字符串被修剪,没有多余的空格。
更新
我可以为您提供存储在数据库中的实际值,但它们是相同的: (direct), (organic), YandexCPC 等。如果我能以某种方式复制它,那将是非常容易的。
使用 strcmp (case sensitive) or strcasecmp(不区分大小写)。
对于字符串比较,在大多数语言中,使用直接比较字符串并不是一个好的解决方案。
echo 'prev: ' . $prevCookie;
echo 'curr: ' . $currentCookie;
if (strcmp($prevCookie,$currentCookie) === 0) {
echo 'same cookies';
} else {
echo 'different cookies';
}
我猜你的字符串有一些不可见的字符。
考虑以下几点:
$a = "abc";
$b = "abc[=10=]";
echo (int)( $a == $b );
这将回显 0
。
但是,如果您回显 $a
和 $b
,您将 看到 "abc"
。
另一种可能性可能是您reading/writting一个使用fopen()
但没有b
选项的文件。
Windows有一个功能,将\r
和\n
转换成\r\n
。
当您回读时,它带有 Windows' 行结尾。
比较时,值不同,因为 \r
(在 memory/cookie 中)与 \r\n
(从文件中读取)不同。
当您将它输出到浏览器时,它显示为abc
。浏览器忽略输出中的空格(可通过 CSS 更改)。
另一个可能是隐式数字转换。
考虑以下代码:
echo '1000000000000000000000000000000000000000000000000' == '1.0E+48';
这将回显 1
。在这里查看:http://sandbox.onlinephpfunctions.com/code/1debf1a505793e3d0fde3b174c26e1f1454ea1e2
使用 ===
解决这个问题。
可能会发生类似的事情。但这显示了相反的情况(比较 returns true
的 2 个不相等的不同字符串)。
来源和环境本身未知。
如何获得这些值也是未知的。
未知数太多...
有时在调试 ide 时会显示相同的值,但是例如,如果您正在比较一个全局值 inside 函数并且您没有声明结果将不相同 example
不工作
function compare($p){
return $p == $z;
}
会工作
function compare($p){
global $z;
return $p == $z;
}