SQL 查询转义 + 代码点火器


SQL query escaping + codeigniter

我正在使用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 行的"值(空)"附近
$sql = "SELECT * FROM `user_language` WHERE `user_id` = " . $this->db->escape($id);

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

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

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

Codeigniter 还支持预准备语句作为"查询绑定":

使用绑定的第二个好处是值是 自动转义,生成更安全的查询。你不必 请记住手动转义数据;引擎会自动执行此操作 你。

我很困惑为什么你说你不能将活动记录类与 CI 一起使用,这是一个简单的 SQL 调用(下面的示例使用方法链接):

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

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