PHP变量看起来相同,但不相等(我很困惑)


PHP variables look the same but are not equal (I'm confused)

好吧,所以我剃光头,但如果我有头发,我就不需要剃刀了,因为我今晚会把头发都剃光的。凌晨3点已经过去了,00:30看似简单的解决方案却变得遥不可及

请参阅下面的代码摘录。。

$psusername = substr($list[$count],16);
if ($psusername == $psu_value){
$answer = "YES";
}
else {
$answer = "NO";
}

$psusername保存值"normann",该值取自基于文本的文件(URL.db)中的URL

$psu_value还保存从用户计算机上设置的cookie(或浏览器地址栏中的参数URL)中检索的值"normann"。

然而,我相信你可以猜到我的问题,变量$answer包含上面测试中的"NO"。

我所知道的所有PHP都是从谷歌搜索和你们这里学到的,所以我不是专家,这也许是显而易见的。

也许这是一个小学生的错误,但我不明白自己做错了什么。我的假设是数据类型不同。最终,我想比较这两个变量,当它们包含相同的信息时(即normann=normann),得到一个TRUE的结果。

因此,如果你们这些非常聪明的人能够指出为什么两个变量会呼应看似相同但实际上不同的信息,这对我来说将是一堂非常有用的课,让我的用户非常高兴。

当你这样做时,它们会回声相同吗:

echo gettype($psusername) . ''n' . gettype($psu_value);

因为我看不到数组$list(和索引$count)中存储了什么数据,所以我不能建议一个完整的yuor问题解决方案。但我可以建议您在if语句之前插入此代码:

var_dump($psusername);
var_dump($psu_value);

看看为什么这两个变量不相同。var_dump函数将输出存储在变量中的内容和类型(字符串、整数、数组ec..),因此您将了解if语句返回false 的原因

因为字符串中似乎有不可打印的字符,所以可以在比较之前将它们去掉。这将删除字符集中不可打印的内容:

$psusername = preg_replace("/[[:^print:]]/", "", $psusername);

0D 0A是一个新行。第一个是回车(CR)字符,第二个是新行的(NL)字符。它们也被称为'r'n

您可以使用trim()将其修剪掉。

$psusername = trim($psusername);

或者,如果它只出现在字符串的末尾,那么rtrim()就会完成任务:

$psusername = rtrim($psusername);

如果您使用file()从文件中获取值,那么您可以将FILE_IGNORE_NEW_LINES作为第二个参数传递,这将删除新行:

$contents = file('url.db', FILE_IGNORE_NEW_LINES);

我只想感谢所有回应的人。在查看了我的日志文件HEX格式的输出后,我意识到是回车值导致变量不匹配,我提到的一个能够用以下代码解决(trim)。。

$psusername = preg_replace("/[^[:alnum:]]/u", '', $psusername);

我还知道,创建配置文件和用户名的系统允许大小写值匹配,所以我采取了将该功能构建到代码中的预防措施,以增加完整性的衡量标准。

我很高兴地说,代码现在运行得很完美。

再次感谢您的回复和建议。

相关文章: