当GET请求发送到localhost和remotehost时,解析的json编码数据是不同的


json encoded data is parsed different when GET request is made to localhost and when to remotehost

我编写了一个web应用程序并将其上传到远程服务器。我使用了PHP5, MySQL和AngularJS。

与本地和远程安装的区别如下:

----------------------------------------------
|        | local host   | remote host        |
----------------------------------------------
| OS     | Fedora 22    | Ubuntu 14.04.2 LTS |
----------------------------------------------
| PHP    | 5.6.10       | 5.5.9              |
----------------------------------------------
| Apache | 2.4.12       | 2.4.7              |
----------------------------------------------
| MySQL  | 5.6.25       | 5.5.43             |
----------------------------------------------

可能我的问题与版本差异有关,也可能不是,但在这两种情况下,我都想了解导致这种差异的原因。

问题描述:当请求一些资源时,它将返回一个json编码的对象列表(来自对MySQL服务器的查询)在本地服务器上,它将被解析,看起来像这样

[{id : 1, name: "some name 1"}, {id: 2, "some name 2"}]

但是当向远程服务器发出请求时,相同的数据将被解析为:

[{id : "1", name: "some name 1"}, {id: "2", "some name 2"}]

请注意,数字被解释为字符串,在这两种情况下Content-Type都等于application/json。

如果需要其他信息,我很乐意提供。

如果你使用PDO准备的语句,它可能是php已经编译不同的mysql库:mysqlng在本地主机和libmysqlclient在远程。查看PHP文档页面,了解选择MySQL库的区别。

当PHP编码JSON时,它只检查变量类型,而不检查变量内容。因此这段代码:

$array = array('id' => '1'); // notice '1' has string type
echo json_encode($array);
// {"id": "1"}

产生不同的输出
$array = array('id' => 1); // notice '1' has int type
echo json_encode($array);
// {"id": 1}

关键是libmysqlclient总是返回字符串类型的列值,而mysqllng可能使用PHP的int类型的MySQL int列。这就是为什么在本地有一个ID为int类型的对象数组,而在远程有一个ID为string类型的对象数组。

要查看您的PHP实例使用的库,请参阅这个stackoverflow问题。