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.