PHP字符串'=='在相同的字符串上返回false

5 php cookies

我有检查用户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等.如果我能以某种方式重现它将会非常容易.

Ism*_*uel 4

我的猜测是你的字符串有一些不可见的字符。

考虑以下:

$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)。


来源和环境本身未知。

这些值是如何获得的也是未知的。

还有太多的未知数……