Cómo imprimir una declaración SQL en el modelo codeigniter

107

Tengo una declaración sql en mi modelo,

Entonces digo

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

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

Mi consulta siempre falla, ¿cómo hago para que php imprima la declaración SQL exacta que se envía a mi base de datos? Y mostrar eso en mi vista php, página

Technupe
fuente

Respuestas:

124

Para mostrar la cadena de consulta:

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

Para mostrar el resultado de la consulta:

print_r($query);

La clase Profiler mostrará los resultados de las evaluaciones comparativas, las consultas que ha realizado y los datos de $ _POST en la parte inferior de sus páginas. Para habilitar el generador de perfiles, coloque la siguiente línea en cualquier lugar dentro de los métodos de su controlador:

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

Guía del usuario de creación de perfiles: https://www.codeigniter.com/user_guide/general/profiling.html

Novo
fuente
7
cuando hago print_r ($ consulta); nada se imprime en absoluto
Technupe
1
Use el generador de perfiles integrado de CI, más información aquí
Novo
2
todo lo que quiero hacer es imprimir la declaración SQL tal como se pasó a la base de datos, pero el generador de perfiles tampoco ayuda mucho
Technupe
Visite el enlace de la guía del usuario que publiqué, si no funciona, díganos qué sucede.
Novo
bueno, pensé que mi problema, Oracle no acepta mi formato de fecha, he probado todos los formatos que creo, solo aceptará SYSDATE
Technupe
41

Puede mostrar el SQL generado por ActiveRecord:

Antes de que se ejecute la consulta:

$this->db->_compile_select(); 

Y después de que se haya ejecutado:

$this->db->last_query(); 
pedro
fuente
4
cuando uso $ this-> db -> _ compile_select (); obtengo un error fatal: llamada al método protegido CI_DB_active_record :: _ compile_select () de
Angelin Nadar
Lo del generador de perfiles no es bueno para mí, no muestra la consulta que quiero, es demasiado complicado obtener el SQL ... Esto funciona para mí: - echo $ this-> EE-> db -> _ compile_select ();
Laurence Cope
3
En CI3, use en su $this->db->get_compiled_select()lugar.
Nick Tsai
17

si necesita una prueba rápida en su consulta, esto funciona muy bien para mí

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

Después de intentar sin éxito usar _compiled_select()o get_compiled_select()simplemente imprimí el dbobjeto, y puede ver la consulta allí en la queriespropiedad.

Inténtalo tú mismo:

var_dump( $this->db );

Si sabe que solo tiene una consulta, puede imprimirla directamente:

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

Hay un nuevo método público get_compiled_selectque puede imprimir la consulta antes de ejecutarla. _compile_selectahora está protegido, por lo que no se puede utilizar.

echo $this->db->get_compiled_select(); // before $this->db->get();
Naveed
fuente
4
Error fatal: llamada al método no definido CI_DB_mysql_driver :: get_compiled_select ()
itskawsar
9

Simplemente puede usar esto al final ...

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

Ninguno de los dos last_query()o get_compiled_select()funciona para mí, por lo que un ligero cambio de código de Pedro me funciona muy bien. No lo incluya ->get()en su compilación, esto debe ser antes de -> get ()

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

Intento la respuesta de @ Chumillas y la respuesta de @ chhameed, pero no funciona porque el sql está mal, así que encontré un nuevo enfoque, como este:

  • Insertar echo $sql; flush(); exit;antes de la return $sql; _compile_selectfunción deDB_active_rec.php
Chanble
fuente
0

Agregue esta línea justo después de la consulta que desea imprimir.

Ejemplo:

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

// Agrega esta línea.

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

salida();

o

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

larp
fuente
0

Estoy usando xdebug para ver estos valores en VSCode con la extensión respectiva y CI v2.x. Agrego la expresión $this->db->last_query()en la sección de observación, y agrego un xdebugSettingsnodo como estas líneas para obtener un valor no truncado en launch.json.

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

Y ejecute mi depurador con el punto de interrupción y finalmente seleccione mi expresión y haga clic derecho> copiar valor.

uescamilla
fuente
-1

Tuve exactamente el mismo problema y finalmente encontré la solución. Mi consulta se ejecuta como:

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

Para mostrar el comando sql, todo lo que tenía que hacer era crear una variable ($ resulttring) con el mismo contenido exacto que mi consulta y luego repetirla, así:<?php echo $resultstring = 'SELECT * FROM clients WHERE ' . $sql_where . ' AND ' . $sql_where2 . ' ORDER BY acconame ASC '; ?>

¡Funciona!

Mark Janssen
fuente
Esta no es la forma CodeIgniter.
mickmackusa
-1

usar get_compiled_select()para recuperar la consulta en lugar de reemplazarla

usuario2049634
fuente
Sugeriría mostrar cómo usar la función que propone en este caso particular, no solo mencionarlo. Saludos cordiales
YakovL
-2

Leo todas las respuestas aquí, pero no puedo obtener

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

a trabajar, me dio un error como,

Llamada al método protegido CI_DB_active_record :: _ compile_select () desde el contexto 'Bienvenido' en los controladores en la línea xx

Así que eliminé protectedde la línea de abajo del archivo \system\database\DB_active_rec.phpy funcionó

protected function _compile_select($select_override = FALSE)
viral
fuente