在 codeigniter Active Record 中执行和不执行之前的回显查询

Posted

技术标签:

【中文标题】在 codeigniter Active Record 中执行和不执行之前的回显查询【英文标题】:Echo query before execution and without execution in codeigniter Active Record 【发布时间】:2012-02-19 01:47:41 【问题描述】:

我正在寻找一种方法来查看生成的查询字符串,但执行它。

请注意,之前没有执行过查询。 (我不要$this->db->last_query();

我希望有一个名称像 $this->db->echo_query_string($table_name = ''); 的方法可以使用 完全像 $this->db->get($table_name = ''); 但唯一的区别是 get() 执行代码, 但echo_query_string() 只是回显查询字符串不执行

【问题讨论】:

一种简单但可能不太有效的方法是稍微修改查询以进行错误查询,以便系统显示错误以及简单的预期错误并且不会执行. 【参考方案1】:

您可以通过这两个函数中的任何一个查看编译后的查询

/* SELECT */ $this->db->_compile_select();
/* INSERT */ $this->db->_insert();
/* UPDATE */ $this->db->_update();

【讨论】:

谢谢。这仅适用于选择查询吗?没有什么可以代替get()吗?我希望它能够有一个可选的 $database_name 像get() 插入其 $this->_insert() 以更新其 $this->_update() 但这两个需要很少的参数 在最新的 CodeIgniter 版本中,$this->db->_compile_select() 是受保护的,不能被调用。您需要使用$this->db->get_compiled_select()(可能是也可能不是最新的稳定版本,它在他们的开发版本中)。 您还需要改用get_compiled_insertget_compiled_update @smhnaji:我认为_compile_select 在 2.0.3 中仍然有效,但这不是最稳定的。最稳定的版本是 2.1.0,它删除了_compile_select。他们添加了get_compiled_select,但这不是稳定版本,它只是在development version。【参考方案2】:

您无需更改 codeigniter 中的任何文件,因为它已经提供了执行此操作的方法。

使用

echo $this->db->last_query();

会产生

select * from some_table...

就是这样。

【讨论】:

为什么-ve 投票?答案对我来说似乎很完美。最有可能的反对票不是为了气馁,所以缺少的是评论。 -ve 投票是因为提问者不想运行实际查询。只想要查询的样子。 last_query() 获取发送到数据库的最后一个查询。 否决票是因为问题明确表示没有 last_query(),最重要的是 - “答案”以“tsc,tsc”开头。态度傲慢,回答错误。真的很难不投反对票。 $this->db->last_query() 很高兴看到执行后的查询。 OP 希望在执行之前和不执行它时查看已编译的查询。 操作要求显示 SQL 字符串,而不对数据库运行 sql。您只能在运行 get() 后使用 $this->db->last_query(),它将针对数据库运行查询。【参考方案3】:

我在 DB_active_rec.php 中添加了这个小方法

function return_query()

    return $this->_compile_select();

用法

$this->db->select('id,user_name')->from('user')->where('id',1);

$string =   $this->db->return_query();
echo $string;

结果

SELECT `id`, `user_name` FROM (`user`) WHERE `id` = 1

这样你就一定会用到

$this->db->from()

代替

$this->db->get()

哪个运行查询

【讨论】:

【参考方案4】:

从 Codeigniter 的第 3 版开始,请参阅 this url 和 this。

echo $this->db->update_string();echo $this->db->get_compiled_update(); echo $this->db->insert_string();$this->db->get_compiled_insert(); echo $this->db->get_compiled_delete(); echo $this->db->get_compiled_select();

【讨论】:

【参考方案5】:

您可以使用一些公共方法来获取 SQL 查询

获取 SELECT 查询

$sql = $this->db->get_compiled_select();

获取 INSERT 查询

$sql = $this->db->get_compiled_insert();

获取更新查询

$sql = $this->db->get_compiled_update();

获取 DELETE 查询

$sql = $this->db->get_compiled_delete();

【讨论】:

【参考方案6】:

从 CI 3.1.11 下面的代码将帮助你

$this->db->get_compiled_select()

更多详情请访问https://codeigniter.com/userguide3/database/query_builder.html#selecting-data

【讨论】:

以上是关于在 codeigniter Active Record 中执行和不执行之前的回显查询的主要内容,如果未能解决你的问题,请参考以下文章

CodeIgniter Active Record 与常规查询

CodeIgniter Active Record 中的 SQL 注释?

Where 子句 CodeIgniter 中的 Active Record 问题

CodeIgniter/PHP Active Record 不会增加整数

Codeigniter Active Record使用多个主键选择多行

foreach 给了我四次相同的行(PHP、Active Record、CodeIgniter)