我有检查用户cookie的代码:
echo 'prev: ' . $prevCookie;
echo 'curr: ' . $currentCookie;
if ((string) $prevCookie == (string)$currentCookie) {
echo 'same cookies';
} else {
echo 'different cookies';
}
Run Code Online (Sandbox Code Playgroud)
在大约0.1%的案例中我得到了以下内容:
// prev: xxx
// curr: xxx
// different cookies
Run Code Online (Sandbox Code Playgroud)
怎么会发生这种事情?
PS.字符串被修剪,没有额外的空间.
UPDATE
我可以为你提供存储在db中的实际值,但它们是相同的:(直接),(有机),YandexCPC等.如果我能以某种方式重现它将会非常容易.
我的猜测是你的字符串有一些不可见的字符。
考虑以下:
$a = "abc";
$b = "abc\0";
echo (int)( $a == $b );
Run Code Online (Sandbox Code Playgroud)
这会回响0。
但是,如果你回显$a和$b,你会看到 "abc"。
另一种可能性可能fopen()是您正在不使用该选项来读取/写入文件b。
Windows 具有将\r和转换\n为\r\n.
当你读回来时,它带有 Windows 的行结尾。
当您进行比较时,值是不同的,因为(在内存/cookie中)与(从文件中读取)\r不同。\r\n
当您将其输出到浏览器时,它显示为abc。浏览器忽略输出中的空格(可通过 CSS 更改)。
另一件事可能是隐式数字转换。
考虑以下代码:
echo '1000000000000000000000000000000000000000000000000' == '1.0E+48';
Run Code Online (Sandbox Code Playgroud)
这会回响1。在这里检查:http://sandbox.onlinephpfunctions.com/code/1debf1a505793e3d0fde3b174c26e1f1454ea1e2
使用===可以解决这个问题。
类似的事情可能正在发生。但这显示了相反的情况(比较两个不相等的不同字符串,返回true)。
来源和环境本身未知。
这些值是如何获得的也是未知的。
还有太多的未知数……
| 归档时间: |
|
| 查看次数: |
1640 次 |
| 最近记录: |