【问题标题】:Comparision problems with PHP when comparing strings with large numbers比较字符串与大数字时的比较问题
【发布时间】:2014-12-04 08:01:59
【问题描述】:

我遇到了 PHP 问题。我已经构建了一个连接到 Oracle 数据库、获取一些数据并有时进行一些比较的应用程序。

问题在于 Oracle 数据使用非常大的整数 ID(21 个字符长)。我尝试将此 ID 用作字符串,但是当我尝试比较此字符串时,我会得到不同的结果,这取决于我是在生产服务器(Ubuntu 12.04 和 PHP 5.3.10)还是在开发机器(Ubuntu 14.04 和PHP 5.5.9)。

这是无法正常工作的功能之一:

public function isSomeUser($userId) {
    $blacklist = array(
        '102300000000000000693',
        '102300000000000001194',
        '102300000000000001593',
        '102300000000000001994',
        '102300000000000001996',
        '102300000000000002395',
        '102300000000000001998',
        '102300000000000002496',
        '102300000000000002097',
        '102300000000000002490',
        '102300000000000002493',
    );

    return (in_array($userId, $blacklist));
}

在开发机器上,如果我调用isSomeUser('102300000000000009999'),返回值为false(数组中不存在该元素),但在生产机器上,返回值始终为true。我可以修复这个行为,在 in_array 调用中添加一个值为 TRUE 的最后一个参数。

问题出在 Joomla 3.3.6 上。我已经构建了一些使用此 ID 构建选择字段(组合框)的模块。在开发机器中,此选择字段已正确构建,但在生产服务器上,selected="selected" 参数被添加到所有选项中。

我知道我可以破解核心 Joomla 文件来纠正这种行为(也许,在创建选择字段时,应该将其更改为 === 运算符,而不是使用 == 运算符),但如果我更改此文件Joomla 更新将是一个问题...

那么,我该怎么办?如果我更新到 PHP 5.4,这个“问题”会得到纠正吗?我应该修改核心 Joomla 文件吗?还有什么想法吗?

【问题讨论】:

  • 您的生产操作系统是 32 位的,php 整数是平台相关的。唯一可靠的选择是升级到 64 位操作系统。
  • 无论它是否能解决您的问题,您都应该在生产服务器上升级 PHP。 5.3 不受支持,据我(粗略)统计,仅在 5.3.10 和 5.3.29 版本之间就有 22 个 CVE 修复。
  • @georg:不,开发机(虚拟机)是32位的,生产服务器是64位的……
  • @timclutton:我会询问系统管理员是否可以升级 PHP。但是有什么办法可以解决我的问题吗?
  • 我根本无法重现这一点,所以我认为这一定是从 Oracle 返回的数据不同。您在 dev 和 prod 中使用相同的数据源吗?您是否手动验证过该值确实不在数组中?

标签: php joomla php-5.3


【解决方案1】:

使用这些输入进行测试($blacklist 中不存在的值)...

isSomeUser('100500000000000000683'); // should be false.
isSomeUser(100500000000000000683); // should be false.

...似乎在旧版本的 PHP(或 64 位版本)中显示了一个错误。

结果:

a = 赢 5.5.19 32bit b = 赢 5.4.24 32bit c = 林 5.2.5 64 位 d = 林 5.3.29 64 位 e = lin 5.5.9 32bit(OP开发盒) f = lin 5.3.10 64bit(OP制作盒) 预期 |一个 |乙 | c | d |电子| F ----------|---|---|---|---|---|--- f | f | f |吨 |吨 | f |吨 f |吨 |吨 |吨 |吨 |吨 |吨

由于PHP_INT_MAX,即使在 64 位安装上,它也小于输入值,它被转换为float,并且每个版本的第二个测试都失败了。这是可以理解的不稳定行为。

但是c, d, and f 在第一次测试中的结果显然有问题,其中返回了true 而不是预期的false 对于松散类型的字符串比较。

失败的版本都是和 64位。作为I mentioned,无论如何您都应该将生产服务器至少升级到最新的5.4。如果问题仍然存在,那么我会说这是 64 位版本的 PHP 中的错误,应该是 reported 这样。

【讨论】:

  • @mHouses 对此有何反馈?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-30
  • 2013-05-06
  • 2011-08-02
  • 2019-05-04
  • 2017-09-18
  • 1970-01-01
相关资源
最近更新 更多