为啥 CodeIgniter 不会在括号中返回 SQL 查询的结果?

Posted

技术标签:

【中文标题】为啥 CodeIgniter 不会在括号中返回 SQL 查询的结果?【英文标题】:Why won't CodeIgniter return the result from a SQL query when parentheses are in it?为什么 CodeIgniter 不会在括号中返回 SQL 查询的结果? 【发布时间】:2011-11-07 08:27:43 【问题描述】:

当我构建的 SQL 查询在其中一个搜索值中包含括号时,我没有得到预期的结果。但是,如果我直接在我的数据库上运行查询,我会返回预期的结果。

此外,如果我的搜索不包含括号,它将正确返回预期结果。

CodeIgniter 模型函数:

function get_submodels($params)

 $sql = "SELECT DISTINCT(`a`.`submodel`), `a`.`model_id` FROM `models` AS `a`"
 . "LEFT JOIN `manufacturers` AS `b` ON `a`.`manufacturer` = `b`.`manufacturer_id`"
 . "WHERE `a`.`year` = ? AND `b`.`manufacturer` = ? AND `a`.`model` = ?"
 . "ORDER BY `a`.`submodel` ASC;";

 $query = $this->db->query($sql, $params);

 return $query->result();

一个有效的查询示例:

"... WHERE `a`.`year` = '2007' AND `b`.`manufacturer` = 'CHEVROLET' AND `a`.`model` = 'MONTE CARLO'"

一个无效查询的例子:

"... WHERE `a`.`year` = '2007' AND `b`.`manufacturer` = 'MERCEDES BENZ' AND `a`.`model` = 'CLK350 (W209)'"

我使用了 $this->db->last_query() 并且查询格式正确。即使复制最后一个没有结果的查询并直接对数据库运行它也会得到预期的结果。

【问题讨论】:

他们可能不是问题,但为什么要使用\n 实际的错误输出是什么? @Pekka 新行不是必需的,而是 phpMyAdmin 如何从查询运行中自动生成 php 字符串。 @J0HN 没有错误,而是当查询在其中一个搜索值中有括号时返回 0 个结果。如果没有括号,查询将返回结果。所以,我很想知道为什么会通过 Codeigniter 发生这种情况。 【参考方案1】:

尽管运行 $this->db->last_query() 并看到查询是正确的,但我决定在页面上启用分析。我的结果表明括号被编码为 html 实体。

因此,查询是这样形成的:

"... WHERE `a`.`year` = '2007' AND `b`.`manufacturer` = 'MERCEDES BENZ' AND `a`.`model` = 'CLK350 (W209)'"

而不是这个:

"... WHERE `a`.`year` = '2007' AND `b`.`manufacturer` = 'MERCEDES BENZ' AND `a`.`model` = 'CLK350 (W209)'"

我通过修改插入查询以对这些列使用 htmlentities 并更新所有现有记录来解决此问题。虽然我知道 Codeigniter 会转义值,但我不知道它也会对它们进行编码。

【讨论】:

+1 以获得良好的信息,并返回发布答案。干杯! 很高兴随时提供信息。我很幸运能在这里找到解决方案,如果我自己想出来的话,我也可以为我遇到的问题提供一些解决方案。

以上是关于为啥 CodeIgniter 不会在括号中返回 SQL 查询的结果?的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows Batch 中,为啥用括号括起来的 for 循环不会扩展它被告知要回显的变量?

FIND_IN_SET在codeigniter中的查询中自动添加IS NULL,还需要在我的查询中添加括号以创建组

为啥 CodeIgniter 将 /index.php/ 添加到所有 URL?

Codeigniter 会话不会取消设置

动态 Active Record 查询中的 Codeigniter 括号

CodeIgniter 从控制器返回数据