wake-up-neo.com

Zeige Fehler mit $ wpdb update

Ich verwende $wpdb->update, um eine benutzerdefinierte Tabelle in meiner Datenbank zu aktualisieren. Wenn ich das Ergebnis var_dump zurückgebe:

int(0)

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

In den wpdb docs 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?

19
Jarred

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 Abfrage ausführen als erwartet. 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 weitere "Klassenvariablen" ( Codex Ref ) für $wpdb untersuchen, da diese zur weiteren Behebung Ihres Problems beitragen können.

19
tollmanz

Fehler anzeigen:

  • $wpdb->show_errors = true zeigt Fehler automatisch an, wenn WP_DEBUG auf true gesetzt ist.
  • $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 Methode $wpdb->update() hat drei verschiedene Ausgaben. Um dies zu überprüfen, müssen Sie das Ergebnis unter var: $result = $wpdb->update( /* ... */ ); speichern.

Die behandeln diese Szenarien:

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

Klassenausgabe

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

Wichtiger (Sicherheits-) Hinweis

BitteNICHTfüge diese Codes auf der Live-Seite hinzu. Vor allem nicht, wenn es sich um Caching-Plugins handelt. Dies kann wichtige DB-bezogene Daten für Besucher offen legen !

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 $wpdb-Objekts werden möglicherweise auch der Benutzername und das Kennwort Ihrer Datenbank angezeigt!

20
kaiser

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 das Setzen von "SAVEQUERIES" auf "true" in Ihrer wp-config.php-Datei.

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

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

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));
}
2
Volomike