QQ咨询 官方微信

添加微信好友

官方小程序

百度小程序

微信小程序

头条小程序

关于我们

Thinkphp

ThinkPHP5.1 多字段模糊搜索like查询踩坑指南

 shitouadmin  2026-09-14 09:41:59
踩坑代码,看看你能不能看出问题:
  1. $where = []; 
  2.  
  3. // 1. 使用了关联键名赋值 
  4. if (!empty($param['bid'])) { 
  5.     $where['bid'] = intval($param['bid']);  
  6.  
  7. // 2. 压入闭包处理 OR 查询 
  8. if (!empty($param['keyword'])) { 
  9.     $keyword = trim($param['keyword']); 
  10.     $where[] = function($query) use ($keyword) { 
  11.         $query->where('name''like''%' . $keyword . '%'
  12.               ->whereOr('description''like''%' . $keyword . '%'); 
  13.     }; 
  14.  
  15. $list  = $this->typeModel->lists($where, $page, $limit); 

这么写如果只查询bid或者只输入关键词是正常的,没有任何报错,但是如果两个同时出现就会出现报错
  1. SQLSTATE[42S02]: Base table or view not found: 1146 Table 'ts_' doesn't exist 
他竟然会报表不存在的错误,这就很奇怪了,因为你就是去问AI,他大概也是推荐你这么写的。

原因是,如果两个同时出现 上面的where就会变成:
  1.     'bid' => 1, 
  2.     0     => Closure 
ThinkPHP 5.1 在解析条件数组时,如果遇到非纯索引数组,底层遍历逻辑会把索引 0 误识别为一个名为 '0' 的数据库字段,在生成 COUNT() 语句时拼出如 WHERE 0 IN (?,?) 类的畸形 SQL,引发 1064 Syntax error。所以正确写法是:
  1. $where = []; 
  2.  
  3. // 1. 数组项必须采用官方规范的三元组格式 ['字段', '表达式', '值'] 
  4. if (!empty($param['bid'])) { 
  5.     $where[] = ['bid''=', intval($param['bid'])]; 
  6.  
  7. // 2. 闭包作为数组元素压入,TP 内部会自动转换成带有括号 () 的子条件 
  8. if (!empty($param['keyword'])) { 
  9.     $keyword = trim($param['keyword']); 
  10.     $where[] = function ($query) use ($keyword) { 
  11.         $query->where('name''like''%' . $keyword . '%'
  12.               ->whereOr('description''like''%' . $keyword . '%'); 
  13.     }; 
也就是其他参数传参的时候 必须写成数组形式:
  1. $where[] = ['bid''=', intval($param['bid'])];  
$where['field'] = val 和 $where[] = [...]这两种写法是不一样的,

¥ 打赏
×
如果您觉得文章帮助了您就打赏一下吧
非常感谢你的打赏,我们将继续分享更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏

本文《ThinkPHP5.1 多字段模糊搜索like查询踩坑指南》发布于石头博客文章,作者:shitouadmin,如若转载,请注明出处:https://www.pweb123.com/kuangjia/thinkphp/1240.html,否则禁止转载,谢谢配合!

文章点评

我来说两句 已有0条评论
点击图片更换

添加微信好友

添加微信好友

微信小程序

百度小程序