131

I have a sql statement in my model,

I then say

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

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

My query always fails, how do I get php to print the exact sql statement being sent to my database? And display that on my php view, page

0

17 Answers 17

242

You can use this:

$this->db->last_query();

"Returns the last query that was run (the query string, not the result)."

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

Sign up to request clarification or add additional context in comments.

Comments

167

To display the query string:

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

To display the query result:

print_r($query);

The Profiler Class will display benchmark results, queries you have run, and $_POST data at the bottom of your pages. To enable the profiler place the following line anywhere within your Controller methods:

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

Profiling user guide: https://www.codeigniter.com/user_guide/general/profiling.html

6 Comments

when i do print_r($query); nothing prints out at all
Use the CI built in profiler, more info here
all i want to do is print out the sql statement as passed to the database, sory but the profiler isn't helping much neither
Visit the user guide link I posted, if it is not working, tell us what happens instead.
well i figured my problem, oracle isn't accepting my date format, ive tried every format i think, it will only accept SYSDATE
|
42

You can display the ActiveRecord generated SQL:

Before the query runs:

$this->db->_compile_select(); 

And after it has run:

$this->db->last_query(); 

3 Comments

when i use $this->db->_compile_select(); i get Fatal error: Call to protected method CI_DB_active_record::_compile_select() from
The profiler thing is no good for me, does not show the query I want, its over complicated to just get the SQL... This works for me:- echo $this->EE->db->_compile_select();
In CI3, Use $this->db->get_compiled_select() instead.
17

if you need a quick test on your query, this works great for me

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

Comments

15

There is a new public method get_compiled_select that can print the query before running it. _compile_select is now protected therefore can not be used.

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

1 Comment

Fatal error: Call to undefined method CI_DB_mysql_driver::get_compiled_select()
14

After trying without success to use _compiled_select() or get_compiled_select() I just printed the db object, and you can see the query there in the queries property.

Try it yourself:

var_dump( $this->db );

If you know you have only one query, you can print it directly:

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

Comments

9

You can simply use this at the end..

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

Comments

5

In CodeIgniter4, you do this:

$db = \Config\Database::connect();  
// your queries here
$query = $db->getLastQuery();
$sql = $query->getQuery();
echo $sql;

Comments

2

Neither last_query() or get_compiled_select() works for me, so a slight change of pedro's code works for me just fine. Do not include ->get() in your build, this must be before the ->get()

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

Comments

2

Add this line right after the query you want to print.

Example:

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

//Add this line.

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

exit();

or

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

Comments

1

I try to @Chumillas's answer and @chhameed's answer, but it not work,because the sql is wrong.So I found new approach,like this:

  • Insert echo $sql; flush(); exit; into before return $sql; _compile_select function of DB_active_rec.php

Comments

1

use get_compiled_select() to retrieve query instead of replace it

1 Comment

I'd suggest to show how to use the function you propose in this particular case, not just mention it. Best regards
1

In codeigniter 4 I use below code to echo the query. This comes handy especially to see incorrect database queries

use CodeIgniter\Events\Events; 

// listen to the event before $builder->get() or $model->find()

Events::on('DBQuery', function($query){
    log_message('info', $query);
});

This event is triggered whenever a new query has been run, whether successful or not.

Refer official doc on DBQuery Event here.

1 Comment

should be declared before running CodeIgniter\Model query
0

I read all answers here, but cannot get

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

to work, It gave me error like,

Call to protected method CI_DB_active_record::_compile_select() from context 'Welcome'in controllers on line xx

So i removed protected from the below line from file \system\database\DB_active_rec.php and it worked

protected function _compile_select($select_override = FALSE)

Comments

0

I'm using xdebug for watch this values in VSCode with the respective extension and CI v2.x. I add the expresion $this->db->last_query() in the watch section, and I add xdebugSettings node like these lines for get non truncate value in the launch.json.

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

And run my debuger with the breakpoint and finally just select my expresion and do click right > copy value.

Comments

0

$query->getCompiledSelect() worked for me.

You can check system\Database\BaseBuilder.php and see which function returns sql query as string. Found this in there and it worked for me.

 /**
     * Get SELECT query string
     *
     * Compiles a SELECT query string and returns the sql.
     *
     * @param boolean $reset TRUE: resets QB values; FALSE: leave QB values alone
     *
     * @return string
     */
    public function getCompiledSelect(bool $reset = true): string
    {
        $select = $this->compileSelect();
    
        if ($reset === true)
        {
            $this->resetSelect();
        }
    
        return $this->compileFinalQuery($select);
    }

and in system\Database\Query.php there is getQuery(). Either of this might be useful.

/**
     * Returns the final, processed query string after binding, etal
     * has been performed.
     *
     * @return string
     */
    public function getQuery(): string
    {
        if (empty($this->finalQueryString))
        {
            $this->finalQueryString = $this->originalQueryString;
        }

        $this->compileBinds();

        return $this->finalQueryString;
    }

Comments

-2

I had exactly the same problem and found the solution eventually. My query runs like:

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

In order to display the sql command, all I had to do was to create a variable ($resultstring) with the exact same content as my query and then echo it, like this:<?php echo $resultstring = 'SELECT * FROM clients WHERE ' . $sql_where . ' AND ' . $sql_where2 . ' ORDER BY acconame ASC '; ?>

It works!

1 Comment

This is not the CodeIgniter way.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.