我遇到了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文件吗?还有其他想法吗?
答案 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
进行松散类型字符串比较时,结果显然有问题1} EM>
失败的版本都是< 5.4 和 64位。作为I mentioned,无论如何,您应该将生产服务器升级到至少最新的5.4。如果问题仍然存在,那么我会说这是64位版本的PHP中的一个错误,应该是reported。