Zeige Fehler mit $ wpdb update

21

Ich verwende $wpdb->update, um eine benutzerdefinierte Tabelle zu aktualisieren, die sich in meiner Datenbank befindet. Wenn ich var_dumpdas Ergebnis erhalte, wird Folgendes zurückgegeben:

int(0)

Also habe ich versucht $wpdb->print_error()zu sehen, was los ist. Es zeigt jedoch nichts. Ich habe es auch versucht $wpdb->show_errors(), aber wieder zeigte es nichts.

In den wpdb-Dokumenten wird die Verwendung dieser Funktionen nicht sehr detailliert beschrieben. Daher bin ich mir nicht sicher, ob ich sie richtig verwende. Aber warum würde das Ergebnis der Aktualisierung einer Tabelle 0 zurückgeben und keine Fehler anzeigen?

Jarred
quelle

Antworten:

21

Ich würde empfehlen, den folgenden Code direkt nach Ihrer Abfrage auszuführen, um zu sehen, was passiert:

exit( var_dump( $wpdb->last_query ) );

Dies sollte die letzte Abfrage ausgeben, die Ihre Datenbank getroffen hat. In solchen Fällen führe ich eine solche Abfrage normalerweise manuell über phpMyAdmin aus, um festzustellen, ob sie fehlerfrei ausgeführt wird und ob sie sich überhaupt auf die Datenbank auswirkt. Wenn Sie die tatsächlich ausgeführte Abfrage anzeigen, können Sie außerdem Probleme in der Abfrage finden, die sich aus Ihrem Code ergibt. Beispielsweise gibt die Abfrage möglicherweise keine MySQL-Fehler zurück, kann jedoch eine andere als die erwartete Abfrage ausführen. Mit diesem Debug-Code können Sie zumindest sehen, was es ist, und den wunderbaren Debug-Trail fortsetzen! Darüber hinaus möchten Sie möglicherweise mehr von den "Klassenvariablen" ( Codex Ref ) untersuchen, $wpdbda diese zur weiteren Behebung Ihres Problems beitragen können.

tollmanz
quelle
1
Wow suchte dies
K. Kilian Lindberg
es zeigt nur SHOW FULL COLUMNS FROM `` in meinem Fall
Adi Prasetyo
22

Fehler anzeigen:

  • $wpdb->show_errors = trueZeigt Fehler automatisch an, wenn auf gesetzt WP_DEBUGist true.
  • $wpdb->suppress_errors = false unterdrückt keine Fehler mehr.

  • Multisite benötigen eine spezielle Behandlung

    // Show errors in Multisite:
    global $wpdb, $blog_id;
    // There's no is_multisite(), so we need to check the ID
    // This means, that we can't debug the blog with the ID 1 as MU-blog by default
    // Check if we are on Blog ID#1 and if not, check the defines and add error handling
    if ( 1 !== $blog_id )
        ! defined( 'DIEONDBERROR' ) AND define( 'DIEONDBERROR', true );

Ausgabehandhabung

Die $wpdb->update()Methode hat drei verschiedene Ausgänge. Um dagegen zu prüfen, müssen Sie das Ergebnis ia var: speichern $result = $wpdb->update( /* ... */ );.

Die behandeln diese Szenarien:

  • false === $result: Scheitern
  • 0 === $result: Erfolg, aber kein Update
  • 0 < $result: Erfolg

Klassenausgabe

  • $wpdb->last_error zeigt Ihnen den letzten Fehler an, falls Sie einen haben.
  • $wpdb->last_queryunterstützt Sie beim Anzeigen der letzten Abfrage (wo der Fehler aufgetreten ist). Es ist im Grunde das gleiche wie array_pop( $wpbd->queries );.

Wichtiger (Sicherheits-) Hinweis

Bitte fügen Sie diese Codes NICHT auf der Live-Site hinzu. Vor allem nicht, wenn Caching-Plugins beteiligt sind. Hierdurch können wichtige DB-bezogene Daten für Besucher sichtbar werden !

Wenn Sie es nicht anders machen können: Binden Sie Ihren Code immer in bedingte Anweisungen ein, um eine öffentlich zugängliche Debug-Ausgabe zu verhindern!

// Example
function debug_query( $result, $data )
{
    global $current_user;
    get_currentuserinfo();

    if ( current_user_can( 'manage_options' ) )
    {
        global $wpdb, $blog_id;
        1 !== $blog_id
            AND ! defined( 'DIEONDBERROR' )
                AND define( 'DIEONDBERROR', true );

        $wpdb->show_errors     = true;
        $wpdb->suppress_errors = false;

        $output = '<pre style="white-space:pre-line;">';
            $output .= 'Last Error: ';
            $output .= var_export( $wpdb->last_error, true );

            $output .= "\n\nLast Query: ";
            $output .= var_export( $wpdb->last_query, true );

            if ( false === $result )
            {
                $result = new WP_Error( 'query_failed', 'No update.', $data );
            }
            elseif ( 0 === $result )
            {
                $result = new WP_Error( 'update_failed', 'Updated zero rows.', $data );
            }
            elseif ( 0 < $result )
            {
                $result = 'Success';
            }
        $output .= '</pre>';

        // Only abort, if we got an error
        is_wp_error( $result ) 
            AND exit( $output.$result->get_error_message() );
    }
}

Durch das Anzeigen des $wpdbObjekts werden möglicherweise auch der Benutzername und das Kennwort Ihrer Datenbank angezeigt!

Kaiser
quelle
1
Das ist eine großartige Antwort! Als ich dies las, ging ich zurück zum WordPress-Codex und las mehr über $ wpdb im Allgemeinen. Nochmals vielen Dank für die ausführliche Antwort.
im Uhrzeigersinn
Mehr als fantastisch in der Erklärung ...
Vishal Kumar Sahu
4

Eine Nullantwort bedeutet, dass keine Zeilen betroffen sind, was sich von einem Fehler unterscheidet.

Es ist schwer zu sagen, ohne auf Ihre Abfrage zu achten, warum keine Zeilen aktualisiert werden. Ein Debug-Tool, das Sie ausprobieren können, ist, " SAVEQUERIES" in Ihrer wp-config.php-Datei auf true zu setzen.

Versuchen var_dumpSie es dann, nachdem Ihre Abfrage ausgeführt wurde $wpdb->queries.

goldenapples
quelle
3
$wpdb->show_errors();
$wpdb->print_error();
Emil
quelle
2

Versuchen Sie dies vor Ihrer Anfrage:

$wpdb->show_errors = TRUE;
$wpdb->suppress_errors = FALSE;

oder vielleicht nach Ihrer Anfrage:

if ($wpdb->last_error) {
  die('error=' . var_dump($wpdb->last_query) . ',' . var_dump($wpdb->error));
}
Volomike
quelle