codeigniter3对多列使用db->like会导致与sql相关的错误

pgx2nnw8  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(491)

我正在codeigniter3.1.8中开发一个基本的博客应用程序。
搜索帖子功能给我带来了意想不到的麻烦:

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '* LIKE '%expression%' ESCAPE '!'' at line 3

SELECT * FROM `posts` WHERE * LIKE '%expression%' ESCAPE '!'

这个 search() posts模型中的方法如下所示:

public function search($expression) {
    $this->db->like('*', $expression);
    $query = $this->db->get('posts');
    return $query->result();
}

相关表字段包括:

我的错在哪里?

8fsztsew

8fsztsew1#

在新的codeigniter版本(3.1.9)中,有一个不需要的打字错误的修复程序。。。内部 system/database/DB_query_builder.php 在第973行,我相信:
这是: case 'before': $v = "%'{$v}'"; // <- Check here break; 已更改为: case 'before': $v = "'%{$v}'"; // <- The fix break; 试着做这个改变,看看这是否能解决你的问题。
编辑
看到你的代码后,请不要使用 * 作为字段名,您必须指定用于搜索的字段。。。例如,如果要搜索标题、描述和内容,可以按以下步骤进行:

$query = $this->db->like('title', $expression)
              ->or_like('description', $expression)
              ->or_like('content', $expression);

然后你剩下的代码。试试看。

vsaztqbk

vsaztqbk2#

您需要使用列/表达式而不是 * :

SELECT * FROM `posts` WHERE * LIKE '%expression%' ESCAPE '!'
=>
SELECT * FROM `posts` WHERE column_name LIKE '%expression%' ESCAPE '!';

我需要查看posts表中所有列的lct
然后您可以使用类似(注意性能差,因为 CONCAT 以及 LIKE '%exp' 让它变得毫无争议。

SELECT * FROM `posts` 
WHERE CONCAT(col1,col2, col3, ...)  LIKE '%expression%' ESCAPE '!'

避免潜在的问题 CONCAT 应添加分隔符:

SELECT * FROM `posts` 
WHERE CONCAT(col1,'^',col2,'^',col3, ...)  LIKE '%expression%' ESCAPE '!'

相关问题