PHP代码换服务器后返回值类型变化

laydown__ 2018-08-23 11:56:22
用PHP写的一个小程序服务端,放Linux服务器上,服务器环境如下:
PHP Version 7.0.19
Apache 2.0
mysql 5.0.12
这个环境下PHP返回的接口json数据中,价格和数量都是数字类型的,可以直接用来计算,
后来换了把代码一个服务器,也是Linux服务器,服务器环境如下:
PHP Version 7.0.30
Apache 2.0
MariaDB-5.5.56
在这个环境下,同样的代码,接口返回的数据,价格和数量等都变成了字符串,直接用来计算就会出错,在计算之前就必须要强转一下才行,请问这种问题是怎么造成的?有没有什么好的解决方案?

还请各位大神指导一下~~
...全文
590 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
下雨的声音丶 2018-10-16
  • 打赏
  • 举报
回复
引用 14 楼 ldf947714443 的回复:
[quote=引用 13 楼 qq_23033339 的回复:] 这个你应该看一下 是查询数据库的 时候 变成字符串 了还是 其他时候 有过一个方法吧字符串变成数字 json_encode($arr,JSON_NUMERIC_CHECK); JSON_NUMERIC_CHECK (integer) 将所有数字字符串编码成数字(numbers)。 自 PHP 5.3.3 起生效。
( json_encode($arr,JSON_NUMERIC_CHECK); )目前我是这么处理的,但还是很想知道到底什么原因导致了更换服务器之后 返回的数据类型发生了变化.[/quote]你数据库不是改变了吗? 你看看是不是数据库查询出来的值变了
laydown__ 2018-10-16
  • 打赏
  • 举报
回复
引用 13 楼 qq_23033339 的回复:
这个你应该看一下 是查询数据库的 时候 变成字符串 了还是 其他时候 有过一个方法吧字符串变成数字 json_encode($arr,JSON_NUMERIC_CHECK); JSON_NUMERIC_CHECK (integer) 将所有数字字符串编码成数字(numbers)。 自 PHP 5.3.3 起生效。
( json_encode($arr,JSON_NUMERIC_CHECK); )目前我是这么处理的,但还是很想知道到底什么原因导致了更换服务器之后 返回的数据类型发生了变化.
下雨的声音丶 2018-10-16
  • 打赏
  • 举报
回复
这个你应该看一下 是查询数据库的 时候 变成字符串 了还是 其他时候 有过一个方法吧字符串变成数字 json_encode($arr,JSON_NUMERIC_CHECK); JSON_NUMERIC_CHECK (integer) 将所有数字字符串编码成数字(numbers)。 自 PHP 5.3.3 起生效。
laydown__ 2018-10-16
  • 打赏
  • 举报
回复
引用 11 楼 weixin_43311677 的回复:
这是PDO的问题可以在php手册找到答案 http://php.net/manual/zh/pdo.setattribute.php 解决方法也很简单
<?php
$pdo = new PDO($dsn, $user_name, $password, $param);
$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
具体到你使用的框架,可以想办法重载数据库连接部分的代码 可以参考如下博文 https://my.oschina.net/inuxor/blog/1541942
首先,谢谢您的回复,您的回复确实让我学到了新的东西, 不过 我这边遇到的问题是: 同样的代码,在不同服务器出现的这样的问题(代码完全一致。只是从测试服务器转到了测试服务器,唯一修改过的信息只有数据库的链接信息,修改的信息暴扣,链接地址-host,数据库名-database,用户名-username,数据库密码-password,以及端口号 -port)。 所以我觉得问题应该不在代码上,我觉得很大可能是出在服务器的环境配置或者软件版本上。 但还是谢谢你的回复
果果^O^粑粑 2018-09-30
  • 打赏
  • 举报
回复
这是PDO的问题可以在php手册找到答案
http://php.net/manual/zh/pdo.setattribute.php

解决方法也很简单
<?php
$pdo = new PDO($dsn, $user_name, $password, $param);
$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

具体到你使用的框架,可以想办法重载数据库连接部分的代码

可以参考如下博文
https://my.oschina.net/inuxor/blog/1541942
laydown__ 2018-09-29
  • 打赏
  • 举报
回复
引用 9 楼 onepersons 的回复:
php数组里边存的是整数还是字符串?

数组里面的数据是直接从数据库查询出来的,有整数,小数和字符串。
举个例子:
在测试服使用json返回:

线上正式服使用json返回:

看上去没多大区别,但是数字外面多了双引号,类型就变了,而且是所有的接口都是这样,一直不知道是什么原因引起的


onepersons 2018-09-24
  • 打赏
  • 举报
回复
php数组里边存的是整数还是字符串?
laydown__ 2018-09-19
  • 打赏
  • 举报
回复
引用 7 楼 leagos 的回复:
不是因为小数点问题吗? 正数也会当成字符串?
是的 不论小数还是整数都会被当成字符串
leagos 2018-09-18
  • 打赏
  • 举报
回复
不是因为小数点问题吗? 正数也会当成字符串?
laydown__ 2018-09-17
  • 打赏
  • 举报
回复
我之前碰到的也是全部都是字符串,但是现在换了公司 测试服务器返回的 数字类型的 就是数字 字符串就是字符串 ;
然后放到正式服务器 ,所有字符(不论是字符类型还是数字类型)都变成了字符串,所以觉得蛮奇怪,不知道是什么原因引发的问题
百一不只 2018-09-13
  • 打赏
  • 举报
回复
Json处理字符串应该会把数字型转换成字符型吧,难道我记错了?
xuzuning 2018-08-23
  • 打赏
  • 举报
回复
那就是你自己的事情了,与 php
书写健壮的程序,是你首要的事情
laydown__ 2018-08-23
  • 打赏
  • 举报
回复
引用 2 楼 xuzuning 的回复:
不要小看了 弱类型,弱类型 并非无类型,而是根据上下文自动做类型转换


不是PHP计算,是PHP返回Json字符串,然后小程序计算,换了服务器之后,返回的数据转换出来的类型就不一样了
xuzuning 2018-08-23
  • 打赏
  • 举报
回复
不要小看了 弱类型,弱类型 并非无类型,而是根据上下文自动做类型转换
xuzuning 2018-08-23
  • 打赏
  • 举报
回复
php 是弱类型的,并不需要强制转换

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧