So drucken Sie eine SQL-Anweisung im Codeigniter-Modell

107

Ich habe eine SQL-Anweisung in meinem Modell.

Ich sage dann

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

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

Meine Abfrage schlägt immer fehl. Wie kann ich PHP dazu bringen, die genaue SQL-Anweisung zu drucken, die an meine Datenbank gesendet wird? Und zeigen Sie das auf meiner PHP-Ansicht, Seite

Technupe
quelle

Antworten:

124

So zeigen Sie die Abfragezeichenfolge an:

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

So zeigen Sie das Abfrageergebnis an:

print_r($query);

Die Profiler-Klasse zeigt Benchmark-Ergebnisse, von Ihnen ausgeführte Abfragen und $ _POST-Daten am unteren Rand Ihrer Seiten an. Um den Profiler zu aktivieren, platzieren Sie die folgende Zeile an einer beliebigen Stelle in Ihren Controller-Methoden:

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

Profiling-Benutzerhandbuch: https://www.codeigniter.com/user_guide/general/profiling.html

Novo
quelle
7
wenn ich print_r mache ($ query); Es wird überhaupt nichts gedruckt
Technupe
1
Verwenden Sie das CI in Profiler gebaut, weitere Infos hier
Novo
2
Alles, was ich tun möchte, ist die SQL-Anweisung auszudrucken, wie sie an die Datenbank übergeben wurde, sory, aber der Profiler hilft auch nicht viel
Technupe
Besuchen Sie den von mir geposteten Link zum Benutzerhandbuch. Wenn dies nicht funktioniert, teilen Sie uns stattdessen mit, was passiert.
Novo
Nun, ich dachte, mein Problem, Orakel akzeptiert mein Datumsformat nicht. Ich habe jedes Format ausprobiert, von dem ich denke, dass es nur SYSDATE
Technupe
41

Sie können das von ActiveRecord generierte SQL anzeigen:

Bevor die Abfrage ausgeführt wird:

$this->db->_compile_select(); 

Und nachdem es gelaufen ist:

$this->db->last_query(); 
pedro
quelle
4
wenn ich $ this-> db -> _ compile_select () benutze; Ich erhalte einen schwerwiegenden Fehler: Aufruf der geschützten Methode CI_DB_active_record :: _ compile_select () von
Angelin Nadar
Das Profiler-Ding ist nicht gut für mich, zeigt nicht die gewünschte Abfrage an, es ist zu kompliziert, nur die SQL zu erhalten ... Dies funktioniert für mich: - echo $ this-> EE-> db -> _ compile_select ();
Laurence Cope
3
Verwenden Sie in CI3 $this->db->get_compiled_select()stattdessen Verwenden .
Nick Tsai
17

Wenn Sie einen kurzen Test für Ihre Anfrage benötigen, funktioniert dies hervorragend für mich

echo $this->db->last_query(); die;
Programmierer
quelle
14

Nachdem ohne Erfolg versucht , zu verwenden , _compiled_select()oder get_compiled_select()ich gedruckt nur das dbObjekt, und Sie können die Abfrage dort in der siehe queriesEigenschaft.

Versuch es selber:

var_dump( $this->db );

Wenn Sie wissen, dass Sie nur eine Abfrage haben, können Sie diese direkt ausdrucken:

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

Es gibt eine neue öffentliche Methode get_compiled_select, mit der die Abfrage gedruckt werden kann, bevor sie ausgeführt wird. _compile_selectist jetzt geschützt und kann daher nicht verwendet werden.

echo $this->db->get_compiled_select(); // before $this->db->get();
Naveed
quelle
4
Schwerwiegender Fehler: Aufruf der undefinierten Methode CI_DB_mysql_driver :: get_compiled_select ()
itskawsar
9

Sie können dies einfach am Ende verwenden ..

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

Weder noch last_query()oder get_compiled_select()funktioniert für mich, daher funktioniert eine geringfügige Änderung des Pedro-Codes für mich einwandfrei. Nicht ->get()in Ihren Build aufnehmen, dies muss vor dem -> get () sein

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

Ich versuche, die Antwort von @ Chumillas und die Antwort von @ chhameed zu beantworten, aber es funktioniert nicht, weil die SQL falsch ist. Also habe ich einen neuen Ansatz gefunden, wie folgt :

  • Einfügen echo $sql; flush(); exit;in vor return $sql; _compile_selectFunktion vonDB_active_rec.php
Chanble
quelle
0

Fügen Sie diese Zeile direkt nach der Abfrage hinzu, die Sie drucken möchten.

Beispiel:

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

// Diese Zeile hinzufügen.

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

Ausfahrt();

oder

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

Larp
quelle
0

Ich verwende xdebug, um diese Werte in VSCode mit der entsprechenden Erweiterung und CI v2.x zu überwachen. Ich füge den Ausdruck $this->db->last_query()im Überwachungsabschnitt hinzu und füge einen xdebugSettingsKnoten wie diesen hinzu, um einen nicht abgeschnittenen Wert in der Datei launch.json zu erhalten.

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

Führen Sie meinen Debuger mit dem Haltepunkt aus und wählen Sie schließlich einfach meinen Ausdruck aus und klicken Sie auf rechts> Wert kopieren.

uescamilla
quelle
-1

Ich hatte genau das gleiche Problem und fand schließlich die Lösung. Meine Abfrage lautet wie folgt:

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

Um den Befehl sql anzuzeigen, musste ich lediglich eine Variable ($ resultstring) mit genau demselben Inhalt wie meine Abfrage erstellen und diese dann wie folgt wiedergeben:<?php echo $resultstring = 'SELECT * FROM clients WHERE ' . $sql_where . ' AND ' . $sql_where2 . ' ORDER BY acconame ASC '; ?>

Es klappt!

Mark Janssen
quelle
Dies ist nicht der CodeIgniter-Weg.
Mickmackusa
-1

Verwenden Sie get_compiled_select()diese Option, um die Abfrage abzurufen, anstatt sie zu ersetzen

user2049634
quelle
Ich würde vorschlagen, zu zeigen, wie die von Ihnen vorgeschlagene Funktion in diesem speziellen Fall verwendet wird, und sie nicht nur zu erwähnen.
Viele
-2

Ich habe hier alle Antworten gelesen, kann sie aber nicht bekommen

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

zu arbeiten, gab es mir Fehler wie,

Aufruf der geschützten Methode CI_DB_active_record :: _ compile_select () aus dem Kontext 'Welcome' in Controllern in Zeile xx

Also habe ich protectedaus der folgenden Zeile aus der Datei entfernt \system\database\DB_active_rec.phpund es hat funktioniert

protected function _compile_select($select_override = FALSE)
viral
quelle