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

时间:2015-05-19 17:53:54

标签: php cookies

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

3 个答案:

答案 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]]