5

我正在使用 codeigniter 并且大多数时候对我的查询使用活动记录(它会自动转义它们),但是由于变量,这个查询似乎并不完全适合它。所以我需要弄清楚如何手动转义查询。

Codeigniter 文档建议以这种方式转义查询:

$sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")";

我的原始查询

$sql = "SELECT * FROM (`user_language`) WHERE `user_id` = '{$id}'";

我的转义查询

$sql = "SELECT * FROM (`user_language`) WHERE `user_id` = '{$id}' VALUES(".$this->db->escape($user_language).")";

但是我无法正确使用语法。错误消息是:

  • PHP 错误信息:未定义变量:user_language
  • SQL 错误:语法错误...在第 1 行的 'VALUES(NULL)' 附近
4

2 回答 2

12
$sql = "SELECT * FROM `user_language` WHERE `user_id` = " . $this->db->escape($id);

如果您想选择 $id 给出的用户语言,它应该以这种方式工作。

处理数字的另一种选择是:

$sql = "SELECT * FROM `user_language` WHERE `user_id` = " . (int)$id;

codeigniter 也支持准备好的语句作为“查询绑定”:

使用绑定的第二个好处是值会自动转义,从而产生更安全的查询。您不必记住手动转义数据;引擎会自动为您完成。

于 2012-05-03T16:19:22.287 回答
4

我很困惑为什么你说你不能在 CI 中使用Active Record 类,这是一个简单的 SQL 调用(下面的示例使用方法链接):

$this->db->select('*')->from('user_language')->where('user_id', $id);
$query = $this->db->get();

然后您$id会正确逃脱,并减轻任何注入。就我个人而言,我尽可能使用AR,它允许我编写快速高效的代码,而不必担心 SQL 调用(自定义查询)带来的坏事。

于 2012-05-03T17:01:19.497 回答