Mostrare gli errori con $wpdb update
Sto utilizzando $wpdb->update
per aggiornare una tabella personalizzata nel mio database. Quando eseguo il var_dump
del risultato, restituisce:
int(0)
Quindi ho provato $wpdb->print_error()
per vedere qual è il problema. Tuttavia, non mostra nulla. Ho provato anche $wpdb->show_errors()
, ma di nuovo non ha mostrato nulla.
La documentazione di wpdb non approfondisce molto come utilizzare queste funzioni, quindi non sono sicuro di utilizzarle correttamente. Ma perché il risultato dell'aggiornamento di una tabella dovrebbe restituire 0 e non mostrare alcun errore?
Mostra errori:
$wpdb->show_errors = true
mostra automaticamente gli errori, seWP_DEBUG
è impostato sutrue
.$wpdb->suppress_errors = false
interrompe la soppressione degli errori.Multisite necessita di un trattamento speciale
// Mostra errori in Multisite: global $wpdb, $blog_id; // Non esiste is_multisite(), quindi dobbiamo verificare l'ID // Questo significa che non possiamo eseguire il debug del blog con ID 1 come MU-blog di default // Verifica se siamo sul Blog ID#1 e se no, controlla le definizioni e aggiungi la gestione degli errori if ( 1 !== $blog_id ) ! defined( 'DIEONDBERROR' ) AND define( 'DIEONDBERROR', true );
Gestione dell'output
Il metodo $wpdb->update()
ha tre diversi output. Per verificarli, devi salvare il risultato in una variabile: $result = $wpdb->update( /* ... */ );
.
Gestisci quindi questi scenari:
false === $result
: Fallimento0 === $result
: Successo, ma nessun aggiornamento0 < $result
: Successo
Output della classe
$wpdb->last_error
mostrerà l'ultimo errore, se presente.$wpdb->last_query
ti assisterà mostrando l'ultima query (dove si è verificato l'errore). È sostanzialmente lo stesso diarray_pop( $wpbd->queries );
.
Nota importante (sicurezza)
Per favore NON aggiungere questi codici su un sito live. Specialmente se sono coinvolti plugin di caching. Questo potrebbe esporre dati importanti relativi al database ai visitatori!
Se non puoi fare altrimenti: avvolgi sempre il tuo codice in istruzioni condizionali per prevenire output di debug visibili pubblicamente!
// Esempio
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 .= 'Ultimo Errore: ';
$output .= var_export( $wpdb->last_error, true );
$output .= "\n\nUltima Query: ";
$output .= var_export( $wpdb->last_query, true );
if ( false === $result )
{
$result = new WP_Error( 'query_failed', 'Nessun aggiornamento.', $data );
}
elseif ( 0 === $result )
{
$result = new WP_Error( 'update_failed', 'Aggiornate zero righe.', $data );
}
elseif ( 0 < $result )
{
$result = 'Successo';
}
$output .= '</pre>';
// Interrompe solo se c'è un errore
is_wp_error( $result )
AND exit( $output.$result->get_error_message() );
}
}
Esporre l'oggetto $wpdb
potrebbe anche esporre il tuo username e password del database!

Consiglio di eseguire il seguente codice subito dopo la tua query per vedere cosa sta succedendo:
exit( var_dump( $wpdb->last_query ) );
Questo dovrebbe stampare l'ultima query che ha colpito il tuo database. In casi come questi, solitamente eseguo manualmente una tale query attraverso phpMyAdmin per verificare se viene eseguita senza errori e per vedere se effettivamente influisce sul database. Inoltre, visualizzando la query che è stata realmente eseguita, potresti trovare problemi nella query che derivano dal tuo codice. Ad esempio, la query potrebbe non restituire alcun errore MySQL, ma potrebbe eseguire una query diversa da quella che ti aspettavi. Con questo codice di debug, almeno sarai in grado di vedere cosa sta succedendo e continuare sul meraviglioso percorso di debug! Inoltre, potresti voler esplorare ulteriormente le "Variabili di Classe" (Riferimento Codex) per $wpdb
in quanto potrebbero aiutare a risolvere ulteriormente il tuo problema.

Una risposta zero significa che nessuna riga è stata interessata, il che è diverso da un errore.
È difficile dire senza vedere la tua query perché nessuna riga viene aggiornata. Uno strumento di debug che puoi provare è impostare "SAVEQUERIES
" su true nel tuo file wp-config.php.
Quindi, dopo che la tua query è stata eseguita, prova a fare var_dump
di $wpdb->queries
.
