【发布时间】: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 中使用相同的数据源吗?您是否手动验证过该值确实不在数组中?