【问题标题】:PHP variables look the same but are not equal (I'm confused)PHP变量看起来相同但不相等(我很困惑)
【发布时间】:2016-03-25 02:20:14
【问题描述】:

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

请看下面的代码摘录..

$psusername = substr($list[$count],16);

if ($psusername == $psu_value){
$answer = "YES";
}
else {
$answer = "NO";
}

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

$psu_value 还包含值“normann”,该值是从用户计算机上设置的 cookie(或浏览器地址栏中的参数 - URL)中检索到的。

但是,我相信您可以猜到我的问题,变量 $answer 包含上述测试中的“NO”。

我所知道的所有 PHP 都是从 Google 搜索和你们这里获得的,所以我不是专家,这可能很明显。

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

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

【问题讨论】:

  • 尝试 var_dump 两个变量,看看它们是否真的相同
  • 好的,在 TextPad 十六进制视图中查看了这个,我可以看到我从 URL 中提取的用户名包含两个额外的字符,所以 normann.. (0D 0A)。所以看来我没有正确使用 substring 函数,我需要知道如何从起点提取到最后一个字母数字字符。
  • 啊哈.. 多亏了十六进制视图,我能够更高效地搜索解决方案,并在 SO 上找到它——你们太聪明了。此语句解决了我的问题: $psusername = preg_replace("/[^[:alnum:]]/u", '', $psusername);

标签: php variables compare


【解决方案1】:

当你这样做时,它们是否会重复同样的事情:

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

【讨论】:

    【解决方案2】:

    由于我看不到数组 $list(和索引 $count)中存储了哪些数据,因此我无法为您的问题提出完整的解决方案。 但我可以建议您在 if 语句之前插入此代码:

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

    看看为什么这两个变量不相同。 var_dump 函数会输出存储在变量中的内容和类型(字符串、整数、数组等),所以你会弄清楚为什么 if 语句返回 false 的原因

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          我只想感谢所有回复的人。在查看我的日志文件后,我意识到 HEX 格式的输出是回车值导致变量不匹配,并且我提到的能够使用以下代码解析(修剪)..

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

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-04-05
            • 2016-05-22
            • 2015-08-31
            • 2014-06-16
            相关资源
            最近更新 更多