CodeIgniter Active Record 中的 SQL 注释?
Posted
技术标签:
【中文标题】CodeIgniter Active Record 中的 SQL 注释?【英文标题】:SQL Comment in CodeIgniter Active Record? 【发布时间】:2012-11-01 12:00:12 【问题描述】:我正在将一个项目移动到 CodeIgniter 并希望利用 Active Record。但是,我还没有找到将 SQL 注释附加到查询的方法。在现有代码中,查询看起来像这样:
UPDATE table
SET column = 'value'
WHERE ID = passed value;
-- Transacted by ' .$_SESSION['Name']
我搜索了 Google 和 SO,但没有找到如何添加最后一条“交易者”评论的答案,而无需直接编码整个内容并使用 $this->db->query('.....')
【问题讨论】:
Active Record 究竟有哪些优势?为什么不使用 db->query() 编写清晰的 SQL 查询代码? SQL 是关系数据库引擎之上的抽象层。 Active Record 是那个抽象层之上的一个抽象层?然后你可以添加你需要的所有评论,真正的数据库专家可以真正阅读你的查询并帮助你。当您可以在 php 中注释 Active Record 构造本身时,为什么还要将 cmets 插入 Active Record 查询?数据库会对这些 cmets 做些什么吗? @PatrickSavalle,这些 cmets 是为 DBA 准备的,他们设置了审计以获取这些。我不知道为什么 cmets 而不是插入到表格中,但我的不是原因,我的原因是 do and die()。 :) 至于为什么要使用 Active Record,它确实减少了实现所需的代码。此外,我被告知要做 AR(见上面的双关语)。 【参考方案1】:我认为这在 ActiveRecord 中是不可能的,因为 AR 的功能有点受限。一种可行的选择是为您的“where”子句使用自定义字符串,并将您的交易注释粘贴在自定义“where”字符串的末尾。我自己没有测试过。
即使您必须手动进行查询,CI 也提供了一些不错的转义函数($this->db->escape
用于数字,$this->db->escape_str
用于 'where' 字符串,$this->db->escape_like_str
用于 'where like' 字符串)应该让您自己创建查询安全 - 我知道在大多数更复杂的 CI 应用程序中,由于 AR 的限制,我需要为大约 1/5 的查询编写自定义查询。
【讨论】:
【参考方案2】:感谢 Darrrrrren 让我走上正轨。
我在控制器中定义了一个变量,如下所示:
$this->sqlStamp = ' /* Executed by ' .strtoupper( $this->router->class .'->' .$this->router->method) .' for ' .strtoupper( $this->session->userdata('displayName') ) .'*/ ';
对于更新和删除,我能够添加
->where('1=1'.$this->sqlStamp, NULL, false)
。
我无法为 Inserts 找到解决方案,因为它们没有 where 语句,并且尝试将 cmets 注入其他地方似乎不起作用。我最终在插入之前运行了这个,以便为 DBA 提供一些需要寻找的东西:
$this->db->get_where('Same_TableName','0=1'.$this->sqlStamp);
【讨论】:
以上是关于CodeIgniter Active Record 中的 SQL 注释?的主要内容,如果未能解决你的问题,请参考以下文章
使用 CodeIgniter Active Record 语句
CodeIgniter Active Record 与常规查询
CodeIgniter Active Record 中的 SQL 注释?