Thinkphp5 mysql 返回string类型_解决mysql返回的字段数值类型全变成string型的问题

本文介绍了如何在ThinkPHP5中处理从MySQL获取的int、decimal、double类型数据,避免默认的字符串化问题,通过调整PDO属性PDO::ATTR_STRINGIFY_FETCHES来确保数据一致性。适合前后端开发者处理强类型语言兼容问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Thinkphp5 mysql 返回string类型_解决mysql返回的字段 比如:int,decimal,double等类型,全变成string型的问题

//兼容老的API  /thinkphp/library/think/db/Connection.php 第120行打开了这个转字符串参数:
PDO::ATTR_STRINGIFY_FETCHES => true,
 

通常在输出 API 接口时也得非常注意一下字段类型的问题,但有些弱类型语言没有严格的类型显示,经常会出现 mysql int 类型字段,通过 PDO 查询出来后 是一个 string 类型。

弱类型语言(php)对于字段类型的要求不是很严格,int 10 和 string "10" 用于计算并不会出现很严重的问题,但是对于 强类型语言 (java、c 等) 就会出现问题了。

可以通过 PDO 属性进行修改,使 select 字段类型与mysql 字段类型统一, 如下:

1. PDO::ATTR_STRINGIFY_FETCHES 提取的时候将数值转换为字符串。

2. PDO::ATTR_EMULATE_PREPARES 启用或禁用预处理语句的模拟。

具体使用方法:

$pdo = new PDO($host, $user, $pass, $param);
 
// 先创建连接后,再设置属性 false
 
$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
 
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

### 如何在 ThinkPHP 中正确使用 FIND_IN_SET 函数 #### 使用方法概述 在 ThinkPHP 框架中,可以利用 `where` 方法或者自定义 SQL 来调用 MySQL 的 `FIND_IN_SET()` 函数。以下是几种常见的实现方式。 --- #### 方式一:通过 `whereRaw` 实现 对于较新的版本(如 ThinkPHP 6 或者 ThinkPHP 8),可以直接使用 `whereRaw` 方法来构建复杂的查询条件: ```php $obj->whereRaw('FIND_IN_SET(:param, tags)', ['param' => $site_id]); ``` 上述代码表示,在字段 `tags` 中查找是否存在 `$site_id` 值。如果存在,则满足查询条件[^2]。 --- #### 方式二:通过 `Db::raw` 构建表达式 适用于 ThinkPHP 5 及其衍生版本,可以通过 `\think\Db::raw` 将原生 SQL 表达式嵌入到查询条件中: ```php $where[] = ['EXP', \think\Db::raw("FIND_IN_SET({$site_id}, site_ids)")]; $result = ExamModel::where($where)->select(); ``` 此代码片段的作用是从 `exam` 表中筛选出 `site_ids` 字段包含 `$site_id` 的记录[^1]。 --- #### 方式三:直接拼接字符串作为查询条件 另一种常见的方式是手动构造 `FIND_IN_SET` 查询语句并将其设置为 `_string` 类型的查询条件: ```php $where['_string'] = "FIND_IN_SET('{$attr_id}', object_ids)"; $data = ModelName::where($where)->select(); ``` 这种方式适合于简单的场景,但在复杂条件下可能不够灵活[^3]。 --- #### 完整示例代码 假设有一个模名为 `ExamModel`,并且需要查询 `site_ids` 列表中包含特定值的数据,完整的代码如下所示: ```php use app\common\model\ExamModel; $site_id = 2; $where = [ 'status' => ['=', 2], ]; // 添加 FIND_IN_SET 条件 $where[] = ['EXP', \think\Db::raw("FIND_IN_SET({$site_id}, site_ids)")]; try { $exams = ExamModel::where($where)->select()->toArray(); success('返回成功', $exams); } catch (\Exception $e) { error('查询失败', $e->getMessage()); } ``` 以上代码实现了基于 `FIND_IN_SET` 的多条件联合查询,并将结果转换为数组形式输出。 --- #### 注意事项 1. **性能优化** 虽然 `FIND_IN_SET` 很方便,但由于它无法充分利用索引,因此当数据量较大时可能会导致性能下降。建议尽可能改用标准化的关系表设计替代存储逗号分隔的字符串列表[^4]。 2. **安性** 如果输入参数来源于外部请求,请务必对其进行严格校验和转义处理,防止 SQL 注入攻击。 3. **兼容性** 不同版本的 ThinkPHP 对原始 SQL 支持程度略有差异,请根据具体框架版本调整语法结构。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值