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

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


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

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;

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

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

4
Schwerwiegender Fehler: Aufruf der undefinierten Methode CI_DB_mysql_driver :: get_compiled_select ()
itskawsar


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

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

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


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.


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


Dies ist nicht der CodeIgniter-Weg.
Mickmackusa

-1

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


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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.