【问题标题】:SQL query escaping + codeigniterSQL查询转义+codeigniter
【发布时间】:2012-05-03 16:02:26
【问题描述】:

我正在使用 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)”附近

【问题讨论】:

  • 您要在查询中插入或选择某些内容吗?
  • 选择。 INSERT 来自 Codeigniter 文档。
  • 更新了我的答案,希望它对你有用:]
  • 代码,请向我们提供 Codeigniter 文档的链接。我找到了this,但在那里看不到你的代码。
  • @JerminBazazian 这就是链接,它位于名为 Escaping Queries 的部分(第 2 到最后部分)下。

标签: php mysql sql codeigniter codeigniter-2


【解决方案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 也支持预处理语句作为“查询绑定”:

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

【讨论】:

  • 谢谢你;有用!我接受并赞成你的回答。附带问题:有什么方法可以确认查询已转义?我还有一些其他查询要转义,我想在之后检查它们。
  • 好吧,我正在使用准备好的语句并且多年来没有转义。我不知道 codeigniter 是否支持它们:php.net/manual/en/pdo.prepared-statements.php
  • 好的,谢谢。我认为 Codeigniter 使用了一种叫做 Active Record 的东西,它会自动转义查询。但是有些查询并不完全适合它的语法,所以这就是我需要帮助的原因。再次感谢。
  • codeigniter 似乎将准备好的语句称为“查询绑定”。它在他们的文档中。
  • 好的,谢谢。你看我缺乏知识。我也没有使用绑定,主要是因为变量。再次感谢您的帮助。
【解决方案2】:

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

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

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

【讨论】:

  • 好的,这是赞成的。不是我不能,而是我没有听说过方法链。我不知道如何在 where 子句中指示变量。非常感谢。
  • @chowwy,全部在User Guide,非常详尽,有很好的例子
  • 是的,我用它作为参考。再次感谢。
猜你喜欢
  • 2012-06-13
  • 2016-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多