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.