【笔记】PHP 查询数据库时,查询结果中类型为 int 整型的数据变成了 string 字符型的解决过程

php tytrock ⋅ 于 2022-11-11 14:52:12 ⋅ 2811 阅读

今天在用javascript处理服务器返回的数据时,发现一个奇怪现象,js代码如下:

if(item.fid){
    console.log(1);
}else{
    console.log(2);
}

控制台里一直都打印出1的数据,我再看看接口返回的数据:

image.png

明明有许多fid=0的情况,但if(item.fid)的条件一直都未真。细看才发现,接口返回的int类型都带上了双引号,都变成了字符串,我再看看数据库:

image.png

字段类型明明是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里:

image.png

所以在自行设置根本没效果。


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的项目

image.png

使用命令查看是否有mysqlnd驱动

php -i | grep mysqlnd

发现没有任何输出,然后试着安装mysqlnd驱动

yum install -y php70w-mysqlnd

发现报错,大概意思就是已经存在了mysql驱动,无法再进行安装

image.png


把原来的mysql驱动卸载掉

yum remove php-mysql

再次安装mysqlnd驱动

yum install -y php70w-mysqlnd

成功了:

image.png

查看使用php -i | grep mysqlnd查看,发现已经有信息,说明安装成功

image.png

然后查看phpinfo(),看到pdo_mysql的驱动已经为mysqlnd

image.png

并且有mysqlnd项

image.png


再次请求接口查看数据,发现已经正常了

image.png


参考:

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



本帖已被设为精华帖!
回复数量: 0
    暂无评论~~
    • 请注意单词拼写,以及中英文排版,参考此页
    • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
    • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
    • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
    • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
    Ctrl+Enter