我有检查用户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。字符串被修剪,没有额外的空间。
更新
我可以为您提供存储在db中的实际值,但它们是相同的: (直接),(有机),YandexCPC等。如果我能以某种方式重现它将是非常容易的。
答案 0 :(得分:3)
我的猜测是你的字符串中有一些字符不可见。
请考虑以下事项:
$a = "abc";
$b = "abc\0";
echo (int)( $a == $b );
这将回显0
。
但是,如果您回复$a
和$b
,您将看到 "abc"
。
另一种可能性可能是您使用fopen()
在没有b
选项的情况下阅读/写入文件。
Windows具有将\r
和\n
转换为\r\n
的功能。
当您回读时,它附带Windows'行尾。
比较时,值不同,因为\r
(在内存/ cookie中)与\r\n
相同(从文件中读取)。
当您将其输出到浏览器时,它会显示为abc
。浏览器忽略输出中的空格(可以用CSS更改)。
另一个事物可能是隐式数字转换。
请考虑以下代码:
echo '1000000000000000000000000000000000000000000000000' == '1.0E+48';
这将回显1
。请在此处查看:http://sandbox.onlinephpfunctions.com/code/1debf1a505793e3d0fde3b174c26e1f1454ea1e2
使用===
解决了这个问题。
可能会发生类似的事情。但是这显示了对位(2个不同的字符串,它们相等,不会返回true
)。
源和环境本身是未知的。
如何获得这些值也是未知的。
有太多未知数......
答案 1 :(得分:0)
使用strcmp(区分大小写)或strcasecmp(不区分大小写)。
对于字符串比较,在大多数语言中,使用直接比较字符串不是一个好的解决方案。
echo 'prev: ' . $prevCookie;
echo 'curr: ' . $currentCookie;
if (strcmp($prevCookie,$currentCookie) === 0) {
echo 'same cookies';
} else {
echo 'different cookies';
}
答案 2 :(得分:0)
有时候,当调试时,ide会显示相同的值,但是例如,如果你要比较函数内的全局值而你没有声明结果将不是同一个例子
不能正常工作
function compare($p){
global $z;
return $p == $z;
}
会工作
[[Call]]