28 Stimmen

Wie kann ich den Inhalt einer vorbereiteten Erklärung einsehen?

Ich arbeite daran zu lernen, vorbereitete Anweisungen mit mysqli in PHP zu verwenden, und normalerweise, wenn ich ein Problem mit einer Abfrage habe, echo ich es einfach auf dem Bildschirm, um zu sehen, wie es als erster Schritt aussieht.

Wie kann ich das mit einer vorbereiteten Erklärung tun?

Ich würde gerne die SQL-Anweisung sehen, nachdem die Variablen ersetzt wurden.

25voto

Pascal MARTIN Punkte 384469

Verwendung vorbereiteter Erklärungen:

  • Wenn Sie die Anweisung vorbereiten, wird sie an den MySQL-Server gesendet
  • Wenn Sie die Variablen binden und die Anweisung ausführen, werden nur die Variablen an den MySQL-Server gesendet
  • Und die Anweisung + gebundene Variablen werden auf dem MySQL-Server ausgeführt, ohne dass die "Vorbereitung" bei jeder Ausführung der Anweisung erneut durchgeführt wird. (deshalb können vorbereitete Anweisungen die Leistung verbessern, wenn dieselbe Anweisung mehrmals ausgeführt wird)

Es gibt keine "Erstellung" einer SQL-Abfrage auf der PHP-Seite, so dass es keine Möglichkeit gibt, diese Abfrage tatsächlich zu erhalten.

Das heißt, wenn Sie eine SQL-Abfrage sehen wollen, müssen Sie SQL-Abfragen und keine vorbereiteten Anweisungen verwenden.

13voto

VolkerK Punkte 93746

Für vorbereitete Anweisungen, die mit den C-API-Funktionen mysql_stmt_prepare() und mysql_stmt_execute() ausgeführt werden, schreibt der Server Prepare- und Execute-Zeilen in das allgemeine Abfrageprotokoll, so dass Sie feststellen können, wann Anweisungen vorbereitet und ausgeführt wurden.
[...] schreibt der Server die folgenden Zeilen in das allgemeine Abfrageprotokoll:
Vorbereiten [1] SELECT ?
Ausführen [1] SELECT 3

Zu Debugging-Zwecken wird also die allgemeines Protokoll und behalten Sie diese Datei im Auge.

Bearbeiten: oh, die Frage hat ein [mysqli] Tag... völlig übersehen, dass.
Wenn die Anweisung überhaupt nicht ausgeführt wird, haben Sie dann (doppelt und dreifach) geprüft, ob auf dem Weg dorthin ein Fehler aufgetreten ist?

echo "<pre>Debug: start</pre>\n";

$mysqli = new mysqli('localhost', 'localonly', 'localonly', 'test');
if ($mysqli->connect_error) {
  die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
}

$result = $mysqli->query('CREATE TEMPORARY TABLE foo (id int auto_increment, x int, primary key(id))');
if ( false=== $result) { 
 die('error : '. $mysqli->error);
}

$stmt = $mysqli->prepare('INSERT INTO foo (x) VALUES (?)');
if ( false===$stmt ) {
  die ('prepare() failed: ' . $mysqli->error);
}

$result = $stmt->bind_param('i', $x);
if ( false===$result ) {
  die('bind_param() failed');
}

$x = 1;
$result = $stmt->execute();
if ( false===$result ) {
  die('execute() failed: '.$stmt->error);
}

echo "<pre>Debug: end</pre>\n";

6voto

NetVicious Punkte 3521

Ich tue dies normalerweise, wenn ich eine vorbereitete SQL mit Parametern debuggen muss.

Beispiel für Vorbereitung und Ausführung:

$sql = "SELECT VAL1, VAL2 FROM TABLE(?, '?', '?', '?', '?', ?, '?', '?', '?')";
$prep = ibase_prepare( $sql ) or die("Error");
$query = ibase_execute($prep, $param1, $param2, .....) or $err = true;
                              ^^^^^^^^^^^^^^^^^^^^^^^

Der einfachste Weg, die resultierende SQL des Satzes it's zu debuggen:

printf( str_replace('?', '%s', $sql), $param1, $param2, ....);
                                      ^^^^^^^^^^^^^^^^^^^^^^

Sie müssen nur ein printf ausführen, das die ? auf die vorbereitete SQL-Zeichenkette um eine %s . printf wird alles als eine Zeichenkette interpretiert, wobei jeder Parameter an jede ersetzte Stelle gesetzt wird %s .

1voto

Noah Heck Punkte 496

Ich habe vor kurzem dieses Projekt aktualisiert, um Composer-Integration, Unit-Tests und eine bessere Handhabung der Annahme von Argumenten durch Verweis (dies erfordert die Aktualisierung auf php 5.6) enthalten.


Ich habe eine Reihe von Klassen erstellt, die die Standard mysqli y mysqli_stmt Klassen, die es Ihnen ermöglichen, eine Wiedergabe des potenziellen Abfrage-Strings zu sehen, der Ihnen das bieten sollte, wonach Sie suchen:

https://github.com/noahheck/E_mysqli

Dies ist ein (fast) sofortiger Ersatz für Ihre normale mysqli Objekt, das eine benutzerdefinierte mysqli_stmt Objekt, wenn Sie prepare() die Abfragezeichenfolge. Nach der Bindung Ihrer Parameter, E_mysqli ermöglicht es Ihnen, die resultierende Abfragezeichenfolge als neue Eigenschaft der stmt Objekt:

$mysqli = new E_mysqli($dbHost, $dbUser, $dbPass, $dbName);

$query = "INSERT INTO registration SET name = ?, email = ?";

$stmt = $mysqli->prepare($query);

$stmt->bind_param("ss", $_POST['name'], $_POST['email']);

$stmt->execute();

echo $stmt->fullQuery;

zur Folge haben würde:

INSERT INTO registration SET name = 'John Doe', email = 'john.doe@example.com'

Es gibt einige Einschränkungen bei der Verwendung dieser Erweiterung (die in der README des Github-Projekts erläutert werden), aber für die Fehlersuche in problematischen Bereichen Ihrer Anwendung oder für den Übergang von einem prozeduralen zu einem objektorientierten Stil sollte dies für die meisten Benutzer eine gewisse Hilfe darstellen.

Wie ich im Github-Projekt dargelegt habe, habe ich keine praktischen Erfahrungen mit dem mysqli Erweiterung, und dieses Projekt wurde auf Wunsch von Benutzern des Schwesterprojekts erstellt, so dass jedes Feedback von Entwicklern, die dieses Projekt in der Produktion verwenden, sehr willkommen wäre.

Haftungsausschluss - Wie ich bereits sagte, habe ich diese Erweiterung vorgenommen.

0voto

chelmertz Punkte 19842

Da ich mit Pascal MARTIN (+1) übereinstimme, schlage ich eine andere Technik zur Fehlersuche vor: var_dump() oder protokollieren Sie jede Variable, die Sie in die Anweisung einfügen. Auf diese Weise sollten Sie in der Lage sein, herauszufinden, ob es sich um falsche Daten oder logisch falsches SQL handelt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X