Come stampare l'istruzione SQL nel modello codeigniter


107

Ho un'istruzione sql nel mio modello,

Allora dico

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

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

La mia query fallisce sempre, come faccio a far stampare a php l'esatta istruzione sql inviata al mio database? E mostralo nella mia vista php, page

Risposte:


124

Per visualizzare la stringa di query:

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

Per visualizzare il risultato della query:

print_r($query);

La classe Profiler mostrerà i risultati dei benchmark, le query che hai eseguito e i dati $ _POST nella parte inferiore delle tue pagine. Per abilitare il profiler, posizionare la seguente riga ovunque all'interno dei metodi del controller:

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

Guida dell'utente alla profilazione: https://www.codeigniter.com/user_guide/general/profiling.html


7
quando eseguo print_r ($ query); non viene stampato nulla
Technupe

1
Usa il profiler integrato CI, maggiori informazioni qui
Novo

2
tutto quello che voglio fare è stampare l'istruzione sql come passata al database, sory ma il profiler non aiuta molto nemmeno
Technupe

Visita il link alla guida utente che ho pubblicato, se non funziona, dicci cosa succede invece.
Novo

beh, ho capito il mio problema, Oracle non accetta il mio formato di data, ho provato tutti i formati che penso, accetterà solo SYSDATE
Technupe


41

È possibile visualizzare l'SQL generato da ActiveRecord:

Prima che la query venga eseguita:

$this->db->_compile_select(); 

E dopo che è stato eseguito:

$this->db->last_query(); 

4
quando uso $ this-> db -> _ compile_select (); ottengo un errore irreversibile: chiamata al metodo protetto CI_DB_active_record :: _ compile_select () da
Angelin Nadar

La cosa del profiler non va bene per me, non mostra la query che voglio, è troppo complicato ottenere solo l'SQL ... Questo funziona per me: - echo $ this-> EE-> db -> _ compile_select ();
Laurence Cope

3
In CI3, usa $this->db->get_compiled_select()invece.
Nick Tsai

17

se hai bisogno di un rapido test sulla tua query, per me funziona benissimo

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

14

Dopo aver tentato senza successo di utilizzare _compiled_select()o get_compiled_select()ho appena stampato l' dboggetto e puoi vedere la query nella queriesproprietà.

Provate voi stessi:

var_dump( $this->db );

Se sai di avere una sola query, puoi stamparla direttamente:

echo $this->db->queries[0];

9

C'è un nuovo metodo pubblico get_compiled_selectche può stampare la query prima di eseguirla. _compile_selectè ora protetto quindi non può essere utilizzato.

echo $this->db->get_compiled_select(); // before $this->db->get();

4
Errore irreversibile: chiamata al metodo non definito CI_DB_mysql_driver :: get_compiled_select ()
itskawsar


2

Nessuno dei due last_query()o get_compiled_select()funziona per me, quindi una leggera modifica del codice di pedro funziona bene per me. Non includere ->get()nella build, deve essere prima di -> get ()

 echo $this->EE->db->_compile_select();

1

Provo a rispondere a @ Chumillas e @ chhameed, ma non funziona, perché sql è sbagliato, quindi ho trovato un nuovo approccio, come questo:

  • Inserisci echo $sql; flush(); exit;nella return $sql; _compile_selectfunzione prima diDB_active_rec.php

0

Aggiungi questa riga subito dopo la query che desideri stampare.

Esempio:

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

// Aggiungi questa riga.

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

Uscita();

o

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


0

Sto usando xdebug per guardare questi valori in VSCode con la rispettiva estensione e CI v2.x. Aggiungo l'espressione $this->db->last_query()nella sezione watch e aggiungo un xdebugSettingsnodo come queste righe per ottenere un valore non troncato nel launch.json.

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

Ed esegui il mio debuger con il punto di interruzione e infine seleziona la mia espressione e fai clic a destra> copia valore.


-1

Ho avuto esattamente lo stesso problema e alla fine ho trovato la soluzione. La mia query viene eseguita come:

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

Per visualizzare il comando sql, tutto quello che dovevo fare era creare una variabile ($ resultstring) con lo stesso identico contenuto della mia query e poi echo, in questo modo:<?php echo $resultstring = 'SELECT * FROM clients WHERE ' . $sql_where . ' AND ' . $sql_where2 . ' ORDER BY acconame ASC '; ?>

Funziona!


Questo non è il modo CodeIgniter.
mickmackusa

-1

utilizzare get_compiled_select()per recuperare la query invece di sostituirla


Suggerirei di mostrare come utilizzare la funzione che proponi in questo caso particolare, non solo di menzionarla. Cordiali saluti
YakovL

-2

Ho letto tutte le risposte qui, ma non riesco a ottenere

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

per funzionare, mi ha dato un errore del tipo,

Chiamata al metodo protetto CI_DB_active_record :: _ compile_select () dal contesto 'Benvenuto' nei controller sulla riga xx

Quindi ho rimosso protecteddalla riga sottostante dal file \system\database\DB_active_rec.phpe ha funzionato

protected function _compile_select($select_override = FALSE)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.