在 Codeigniter 中转义 SQL 查询

Posted

技术标签:

【中文标题】在 Codeigniter 中转义 SQL 查询【英文标题】:Escaping SQL queries in Codeigniter 【发布时间】:2012-06-13 16:11:36 【问题描述】:

我正在使用 CodeIgniter 将一些数据插入到 mysql 表中。因为我正在使用INSERT IGNORE INTO 并且不想编辑活动记录类来启用此功能,所以我手动生成 SQL 查询。

$this->db->query("INSERT IGNORE INTO my_table(lat, lng, date, type)
                        VALUES ('" . $data['lat'] . "', '" . $data['lng'] . "', '" . $data['date'] . "', '" . $data['type'] . "')");

问题:$data['type'] 中的字符串包含单引号时查询失败。如何使这些需要转义的字符自动转义,例如在使用活动记录时?

【问题讨论】:

那么在 SELECT 查询中呢?我怎样才能逃脱它们? 【参考方案1】:

使用$this->db->e​​scape();它会自动转义字符串

此函数确定数据类型,使其只能转义 字符串数据。它还会自动在数据周围添加单引号 所以你不必:

$this->db->query("INSERT IGNORE INTO my_table(lat, lng, date, type)
VALUES ('" . $this->db->escape($data['lat']) . "', '" . $this->db->escape($data['lng']) . "', '" . $this->db->escape($data['date']$this->db->escape . "', '" . $this->db->escape($data['type']) . "')");

这里是参考Click Here

【讨论】:

在页面的最后,关于参数绑定的部分是一个非常更好的选择;) 更新链接:codeigniter.com/userguide2/database/queries.html $this->db->e​​scape() 添加单引号,所以我们不必这样做,但在您的查询中您已经添加了它们。(我不知道它是否是版本差异或者什么,我使用的是 3.1。*)今天早些时候我正在写一个查询,然后我遇到了一个问题,我犯了这个错误。【参考方案2】:

另一种方法是使用自动转义所有值的查询绑定:

$sql = "INSERT IGNORE INTO my_table(lat, lng, date, type) VALUES (?,?,?,?);"; 
$this->db->query($sql, array($data['lat'], $data['lng'], $data['date'], $data['type']));

【讨论】:

你可以让这更简单:$this->db->query($sql, $data);这对我有用! (我猜你不应该在数据数组中有任何其他键才能工作) 或将其重写为 Active Record 模式:$this->db->inset('some_table', $data); 更直接且非常容易。只需确保没有自动增量主键字段使用if (!isset($data['id'])) throw new InvalidArgumentException('data[id] is not allowed for insert'); 进入insert() 方法@

以上是关于在 Codeigniter 中转义 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 4 中转义原始 SQL 查询

NamedParameterJdbcTemplate Oracle SQL,如何在命名查询中转义单引号?

使用 CONTAINSTABLE 在 SQL Server 全文搜索查询中转义 & 号

在rails中转义SQL LIKE的查询

在 SQL 字符串中转义 & 字符

T-SQL - 如何在LIKE子句中转义斜杠/方括号