【问题标题】:Codeigniter 3 use of db->like for multiple columns results in an SQL related errorCodeigniter 3 对多列使用 db->like 会导致 SQL 相关错误
【发布时间】:2018-09-16 09:40:25
【问题描述】:

我正在使用 Codeigniter 3.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 '!'

Posts 模型中的search() 方法如下所示:

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

相关的表格字段是:

我的错误在哪里?

【问题讨论】:

  • $this->db->like('*', $expression); * 是什么?
  • @sagi 它是所有列
  • 这在 SQL 中是不可能的。 * 用于选择列表

标签: mysql codeigniter sql-like query-builder


【解决方案1】:

在新的 CodeIgniter 版本 (3.1.9) 中,修复了不需要的拼写错误...在 #973 行的 system/database/DB_query_builder.php 内我相信:

这个: 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);

然后是您的其余代码。试一试。

【讨论】:

    【解决方案2】:

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

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

    我需要从帖子表中的所有列中查找

    然后你可以使用类似的东西(注意性能不佳,因为CONCATLIKE '%exp' 使它成为非SARGable。

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

    为避免CONCAT 的潜在问题,您应该添加分隔符:

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

    【讨论】:

    • 我需要从帖子表中的所有列中查找
    • @sagi 然后他需要添加不可能存在于任何列中的分隔符。我会更新我的答案。
    • 另外,我想要一个 Codeigniter 特定的解决方案。
    • @RazvanZamfir 抱歉,我不懂 PHP。我确信可以将表达式 CONCAT(col1,'^',col2,'^',col3, ...) 转换为您的 ORM。作为最后的手段,您始终可以执行本机查询。
    猜你喜欢
    • 2016-03-30
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 2018-04-07
    • 2013-11-29
    • 1970-01-01
    相关资源
    最近更新 更多