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

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


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(); 

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;

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];

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();

4
Erro fatal: chamada ao método indefinido CI_DB_mysql_driver :: get_compiled_select ()
itskawsar


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();

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

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 ();


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.


-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!


Esta não é a maneira do CodeIgniter.
mickmackusa

-1

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


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)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.