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?
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.
$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 );
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
: Fehler0 === $result
: Erfolgreich, aber kein Update0 < $result
: Erfolg$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 );
.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!
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_dump
ing $wpdb->queries
.
$wpdb->show_errors();
$wpdb->print_error();
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));
}