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;
}