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.