在 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->escape();它会自动转义字符串
此函数确定数据类型,使其只能转义 字符串数据。它还会自动在数据周围添加单引号 所以你不必:
$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->escape() 添加单引号,所以我们不必这样做,但在您的查询中您已经添加了它们。(我不知道它是否是版本差异或者什么,我使用的是 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 查询的主要内容,如果未能解决你的问题,请参考以下文章
NamedParameterJdbcTemplate Oracle SQL,如何在命名查询中转义单引号?