如何在Codeigniter模型中打印SQL语句


107

我的模型中有一条sql语句,

然后我说

$query = $this->db->query($sql, array(fields, fields1);

if ($query) {
    return true:
} else {
    echo "failed";
    return false;
}

我的查询始终失败,如何获取php以打印发送到数据库的确切sql语句?并将其显示在我的php视图的页面上

Answers:


124

要显示查询字符串:

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

要显示查询结果:

print_r($query);

Profiler类将在页面底部显示基准测试结果,已运行的查询以及$ _POST数据。要启用探查器,请将以下行放在Controller方法中的任何位置:

$this->output->enable_profiler(TRUE);

分析用户指南:https : //www.codeigniter.com/user_guide/general/profiling.html


7
当我做print_r($ query); 什么都没打印出来
Technupe 2011年

1
使用内置的分析器的CI,更多信息在这里

2
我要做的只是打印出传递给数据库的sql语句,很
抱歉

访问我发布的用户指南链接,如果它不起作用,请告诉我们会发生什么。

好,我想出了我的问题,oracle不接受我的日期格式,我尝试了我认为的每种格式,它将仅接受SYSDATE
Technupe 2011年

228

您可以使用此:

$this->db->last_query();

“返回上次运行的查询(查询字符串,而不是结果)。”

Reff:https ://www.codeigniter.com/userguide3/database/helpers.html


41

您可以显示ActiveRecord生成的SQL:

在查询运行之前:

$this->db->_compile_select(); 

并运行后:

$this->db->last_query(); 

4
当我使用$ this-> db-> _ compile_select(); 我收到致命错误:从
Angelin Nadar

探查器对我没有好处,不显示我想要的查询,仅获取SQL太复杂了……这对我有用:-echo $ this-> EE-> db-> _ compile_select();
劳伦斯·科普

3
在CI3中,$this->db->get_compiled_select()改用。
蔡仔

17

如果您需要对查询进行快速测试,这对我来说非常有用

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

14

在尝试使用失败_compiled_select()get_compiled_select()只是打印db对象之后,您可以在其中看到查询queries属性中。

自己尝试:

var_dump( $this->db );

如果您知道只有一个查询,则可以直接打印它:

echo $this->db->queries[0];

9

有一个新的公共方法get_compiled_select可以在运行查询之前打印查询。_compile_select现在受保护,因此无法使用。

echo $this->db->get_compiled_select(); // before $this->db->get();

4
致命错误:调用未定义的方法CI_DB_mysql_driver :: get_compiled_select()
itskawsar


2

无论是对我last_query()还是get_compiled_select()对我都不起作用,因此对pedro的代码稍作更改对我来说也很好。不要包含->get()在您的构建中,这必须在-> get()之前

 echo $this->EE->db->_compile_select();

1

我尝试使用@Chumillas的答案和@chhameed的答案,但由于sql错误,因此无法正常工作。因此,我找到了新的方法,如下所示:

  • 插入echo $sql; flush(); exit;之前的return $sql; _compile_select功能DB_active_rec.php

0

在要打印的查询之后立即添加此行。

例:

$ query = $ this-> db-> query('SELECT * FROM table WHERE condition');

//添加此行。

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

出口();

要么

回声$ this-> db-> last_query();


0

我正在使用xdebug观看带有相应扩展名和CI v2.x的VSCode中的该值。我$this->db->last_query()在watch部分中添加了expresion ,并xdebugSettings在launch.json中添加了像这样的行来获取非截断值。

{
  "name": "Launch currently open script",
  "type": "php",
  "request": "launch",
  "program": "${file}",
  "cwd": "${fileDirname}",
  "port": 9000,
  "xdebugSettings": {
    "max_data": -1,
    "max_children": -1
  }
},

并使用断点运行调试器,最后只需选择我的表达式,然后单击右键>复制值即可。


-1

我遇到了完全相同的问题,并最终找到了解决方案。我的查询运行如下:

$result = mysqli_query($link,'SELECT * FROM clients WHERE ' . $sql_where . ' AND ' . $sql_where2 . ' ORDER BY acconame ASC ');

为了显示sql命令,我要做的就是创建一个变量($ resultstring),其内容与查询的内容完全相同,然后回显它,如下所示:<?php echo $resultstring = 'SELECT * FROM clients WHERE ' . $sql_where . ' AND ' . $sql_where2 . ' ORDER BY acconame ASC '; ?>

有用!


这不是CodeIgniter的方式。
mickmackusa

-1

用于get_compiled_select()检索查询而不是替换查询


我建议展示如何在这种特殊情况下使用您建议的功能,而不仅仅是提及它。最好的问候
YakovL

-2

我在这里阅读了所有答案,但无法获得

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

工作,它给了我类似的错误,

在第XX行的控制器中,从上下文“ Welcome”中调用受保护的方法CI_DB_active_record :: _ compile_select()

所以我protected从文件的下面一行中删除了\system\database\DB_active_rec.php

protected function _compile_select($select_override = FALSE)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.