Como imprimir a instrução SQL no modelo codeigniter

107

Eu tenho uma instrução sql em meu modelo,

Então eu digo

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

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

Minha consulta sempre falha, como faço para que o php imprima a instrução sql exata que está sendo enviada ao meu banco de dados? E exibir isso na minha visualização de php, página

Technupe
fonte

Respostas:

124

Para exibir a string de consulta:

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

Para exibir o resultado da consulta:

print_r($query);

A classe Profiler exibirá resultados de benchmark, consultas que você executou e dados $ _POST na parte inferior de suas páginas. Para habilitar o criador de perfil, coloque a seguinte linha em qualquer lugar nos métodos do seu controlador:

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

Guia do usuário de criação de perfil: https://www.codeigniter.com/user_guide/general/profiling.html

Novo
fonte
7
quando eu faço print_r ($ query); nada é impresso
Technupe
1
Use o CI embutido em perfil, mais informações aqui
Novo
2
tudo que eu quero fazer é imprimir a instrução sql conforme passada para o banco de dados, sory, mas o criador de perfil também não está ajudando muito
Technupe
Visite o link do guia do usuário que postei, se não estiver funcionando, diga-nos o que acontece.
Novo
bem, percebi meu problema, oracle não está aceitando meu formato de data, ive tentei todos os formatos eu acho, só vai aceitar SYSDATE
Technupe
41

Você pode exibir o SQL gerado pelo ActiveRecord:

Antes da execução da consulta:

$this->db->_compile_select(); 

E depois de executado:

$this->db->last_query(); 
Pedro
fonte
4
quando eu uso $ this-> db -> _ compile_select (); eu obtenho um erro fatal: chamada para o método protegido CI_DB_active_record :: _ compile_select () de
Angelin Nadar
O perfil do profiler não é bom para mim, não mostra a consulta que eu quero, é muito complicado apenas obter o SQL ... Isso funciona para mim: - echo $ this-> EE-> db -> _ compile_select ();
Laurence Cope
3
Em CI3, use em $this->db->get_compiled_select()vez disso.
Nick Tsai
17

se você precisar de um teste rápido em sua consulta, isso funciona muito bem para mim

echo $this->db->last_query(); die;
Programador
fonte
14

Depois de tentar sem sucesso usar _compiled_select()ou get_compiled_select()acabei de imprimir o dbobjeto, e você pode ver a consulta aí na queriespropriedade.

Tente você mesmo:

var_dump( $this->db );

Se você sabe que tem apenas uma consulta, pode imprimi-la diretamente:

echo $this->db->queries[0];
Christian Dechery
fonte
9

Existe um novo método público get_compiled_selectque pode imprimir a consulta antes de executá-la. _compile_selectagora está protegido, portanto, não pode ser usado.

echo $this->db->get_compiled_select(); // before $this->db->get();
Naveed
fonte
4
Erro fatal: chamada ao método indefinido CI_DB_mysql_driver :: get_compiled_select ()
itskawsar
9

Você pode simplesmente usar isso no final.

echo $this->db->last_query();
Muhammad Sadiq
fonte
2

Nem last_query()ou get_compiled_select()funciona para mim, então uma ligeira mudança no código de Pedro funciona perfeitamente para mim. Não inclua ->get()em sua construção, isso deve ser antes de -> get ()

 echo $this->EE->db->_compile_select();
Laurence Cope
fonte
1

Tento a resposta de @chumillas e a resposta de @chhameed, mas não funciona, porque o sql está errado. Então encontrei uma nova abordagem, como esta:

  • Inserir echo $sql; flush(); exit;antes da return $sql; _compile_selectfunção deDB_active_rec.php
Chanble
fonte
0

Adicione esta linha logo após a consulta que deseja imprimir.

Exemplo:

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

// Adicione esta linha.

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

Saída();

ou

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

larp
fonte
0

Estou usando xdebug para observar esses valores em VSCode com a respectiva extensão e CI v2.x. Eu adiciono a expressão $this->db->last_query()na seção de observação e adiciono um xdebugSettingsnó como essas linhas para obter o valor não truncado no launch.json.

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

E execute meu depurador com o ponto de interrupção e, finalmente, selecione minha expressão e clique com o botão direito> copiar valor.

uescamilla
fonte
-1

Eu tive exatamente o mesmo problema e eventualmente encontrei a solução. Minha consulta funciona assim:

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

Para exibir o comando sql, tudo o que tive que fazer foi criar uma variável ($ resultstring) com exatamente o mesmo conteúdo da minha consulta e, em seguida, ecoá-la, assim:<?php echo $resultstring = 'SELECT * FROM clients WHERE ' . $sql_where . ' AND ' . $sql_where2 . ' ORDER BY acconame ASC '; ?>

Funciona!

Mark Janssen
fonte
Esta não é a maneira do CodeIgniter.
mickmackusa
-1

use get_compiled_select()para recuperar a consulta em vez de substituí-la

user2049634
fonte
Sugiro mostrar como usar a função que você propõe neste caso particular, não apenas mencioná-la. Atenciosamente
YakovL
-2

Eu li todas as respostas aqui, mas não consigo

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

para trabalhar, me deu um erro como,

Chamada para o método protegido CI_DB_active_record :: _ compile_select () do contexto 'Welcome'in controladores na linha xx

Então, eu removi protectedda linha abaixo do arquivo \system\database\DB_active_rec.phpe funcionou

protected function _compile_select($select_override = FALSE)
viral
fonte