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

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


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

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;

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

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

4
Error fatal: llamada al método no definido CI_DB_mysql_driver :: get_compiled_select ()
itskawsar


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

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

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


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.


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


Esta no es la forma CodeIgniter.
mickmackusa

-1

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


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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.