今天在用javascript处理服务器返回的数据时,发现一个奇怪现象,js代码如下:
if(item.fid){ console.log(1); }else{ console.log(2); }
控制台里一直都打印出1的数据,我再看看接口返回的数据:
明明有许多fid=0的情况,但if(item.fid)的条件一直都未真。细看才发现,接口返回的int类型都带上了双引号,都变成了字符串,我再看看数据库:
字段类型明明是int整型,为什么返回的是string字符串呢?服务器环境是centos+php7.0+mysql8.0,接下来网上找问题所在。
1、检查php在使用PDO 查询时是否开启了“将数值转换为字符串”。
在php使用PDO链接数据库时,可以设置结果将数值转换为字符串
<?php $pdo = new PDO($dsn, $user, $pass, $param); // 在创建连接后。增加 $pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);//提取的时候将数值转换为字符串
Larave里就可以在config/database.php里进行设置
'mysql' => [ 'driver' => 'mysql', 'host' => '127.0.0.1', ... 'options' => [ PDO::ATTR_STRINGIFY_FETCHES => false, ] ],
设置后,发现返回的int数据依然是string。其实Laravel里已经默认将这项设置为false了,在vendor/laravel/framework/Illuminate/Database/Connectors/Connector.php里:
所以在自行设置根本没效果。
2、检查php使用的mysql驱动是否为mysqlnd驱动。
百度许久很多解决方法都是第一种,后来在google里看到一篇文章才知道过中的原理
php是如何与mysql交互的。PHP通过某种api(其实就是扩展),基于某种驱动或lib库与mysql server连接通信。
api有三种:mysql,mysqli和pdo。
其中mysql扩展已经不被建议使用,它将在5.5被废弃,而在php7中被去除。
驱动有两种:libmysqlclient(MySQL client server library )和mysqlnd(MySQL native driver )。
在5.3之前,默认使用的都是libmysql,从5.3开始mysqlnd已经内置于php源代码中,并且官方强烈建议使用这个驱动,只要在编译的时候加上就行了,比如:./configure --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-mysql=mysqlnd。
而从5.4开始,三种api的驱动默认都将为mysqlnd,所以编译的时候不需要指定驱动了,比如:./configure --with-mysqli --with-pdo-mysql --with-mysql。
如果使用的是旧的libmysql,那没办法,得不到mysql数据的类型,都会被转换为string
更多对mysqlnd的介绍,参考官方手册http://php.net/manual/zh/book.mysqlnd.php
输出phpinfo(),看到mysql pdo的驱动是并不是mysqlnd,而且也找不到mysqlnd的项目
使用命令查看是否有mysqlnd驱动
php -i | grep mysqlnd
发现没有任何输出,然后试着安装mysqlnd驱动
yum install -y php70w-mysqlnd
发现报错,大概意思就是已经存在了mysql驱动,无法再进行安装
把原来的mysql驱动卸载掉
yum remove php-mysql
再次安装mysqlnd驱动
yum install -y php70w-mysqlnd
成功了:
查看使用php -i | grep mysqlnd查看,发现已经有信息,说明安装成功
然后查看phpinfo(),看到pdo_mysql的驱动已经为mysqlnd
并且有mysqlnd项
再次请求接口查看数据,发现已经正常了
参考:
http://t.zoukankan.com/liguangsunls-p-7363063.html
https://blog.csdn.net/woshihaiyong168/article/details/78926742
https://www.likecs.com/show-307982541.html#sc=400