WordPress SQL Queries debuggen

Es gibt verschiedene Wege, Probleme mit SQL-Statements innerhalb von WordPress zu untersuchen / debuggen. Die relevantesten Methoden habe ich nachfolgend aufgezeigt.

Debugging aktivieren

Im ersten Schritt muss der Debug Mode aktiviert werden. Dies kann über die nachfolgenden Einträge in der wp-config.php durchgeführt werden:

define( 'WP_DEBUG', true ); // Debugging aktivieren
define( 'WP_DEBUG_LOG', true ); // Debug-Informationen nach /wp-content/debug.log schreiben
define( 'WP_DEBUG_DISPLAY', false ); // Debug-Informationen nicht anzeigen

ACHTUNG: WP_DEBUG_DISPLAY sollte unter keinen Umständen auf produktiv genutzten Websites aktiviert werden. Debug-Informationen können schützenswerte Daten enthalten. Die Ausgabe dieser Informationen stellt ein enormes Sicherheitsrisiko dar! Auch das debug.log muss entsprechend geschützt werden, da es öffentlich einsehbar ist!

Query-Debugging

$wpdb bietet zwei Methoden, das Query-Debugging zu aktivieren und zu deaktivieren:

global $wpdb;
$wpdb->show_errors(); // Gibt Fehlermeldungen aus
// oder
$wpdb->hide_errors(); // Versteckt Fehlermeldungen

$wpdb->insert(...);

ACHTUNG: $wpdb->show_errors() gibt Fehlermeldungen auch dann aus, wenn WP_DEBUG auf false gesetzt ist! Aus diesem Grund sollte immer folgendes Statement genutzt werden:

global $wpdb;

if ( defined( 'WP_DEBUG' ) && true === WP_DEBUG ) {
    $wpdb->show_errors();
}

Um einen Fehler auszugeben kann folgender Befehl genutzt werden:

$wpdb->print_error();

Dieser Befehl prüft, ob beim Ausführen des letzten SQL-Statements ein Fehler aufgetreten ist und zeigt diesen an.

Es ist auch wichtig zu wissen, dass $wpdb->insert() false zurückgibt, wenn ein Fehler aufgetreten ist:

global $wpdb;
if ( !$wpdb->insert() ) {
    echo "Ein Fehler ist aufgetreten";
}

Alle Queries

Um alle SQL Queries angezeigt zu bekommen, die WordPress ausgeführt hat, muss SAVEQUERIES aktiviert werden:

define( 'SAVEQUERIES', true );

Nun werden alle Queries in das Array $wpdb->queries geschrieben. Der nachfolgende Code gibt diese aus:

if ( current_user_can( 'administrator' ) ) {
    global $wpdb;
    echo "";
    print_r( $wpdb->queries );
    echo "";
}

In diesem Artikel ist beschrieben, wie die Queries geloggt werden können.

Häufiges Problem

Was, wenn keine Fehlermeldung auftaucht, aber trotzdem kein Eintrag in die Datenbank geschrieben wird? Ein gängiges Problem ist, dass die Daten, die in die Datenbank geschrieben werden sollen, ein oder mehrere ungültige Zeichen enthalten. Angenommen es gibt ein Feld in der Datenbank vom Typ varchar(50) und ein String mit 60 Zeichen soll eingefügt werden, dann scheitert dies ohne Fehlermeldung! Aus diesem Grund sollte vor Ausführung von Insert-Statements immer geprüft werden, ob die Daten den Anforderungen entsprechen.

Multisite

Abschließend noch eine Information zu WordPress Multisites. Um Queries Debugger zu können muss die Konstante DIEONDBERROR in der wp-config.phpauftrue` gesetzt werden:

define( 'DIEONDBERROR', true );

Schreibe einen Kommentar