比较字符串与大数字时PHP的比较问题

时间:2014-12-04 08:01:59

标签: php joomla php-5.3

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

问题是Oracle数据使用的是非常大的整数ID(长度为21个字符)。我尝试将此ID用作字符串,但是当我尝试比较这些字符串时,我会得到不同的结果,这取决于我是否在生产服务器(使用PHP 5.3.10的Ubuntu 12.04)或开发机器(Ubuntu)上工作14.04 with 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(元素不存在于数组中),但在生产机器上,返回价值永远是真的。我可以修复此行为,将最后一个参数添加到in_array调用中,其值为TRUE。

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

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

那么,我该怎么办?如果我更新到PHP 5.4,那么这个"问题"要纠正?我应该修改核心Joomla文件吗?还有其他想法吗?

1 个答案:

答案 0 :(得分:1)

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

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

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

结果:

a = win 5.5.19 32bit
b = win 5.4.24 32bit
c = lin 5.2.5 64bit
d = lin 5.3.29 64bit
e = lin 5.5.9 32bit  (OP development box)
f = lin 5.3.10 64bit (OP production box)

 expected | a | b | c | d | e | f
----------|---|---|---|---|---|---
 f        | f | f | t | t | f | t
 f        | t | t | t | t | t | t

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

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

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