Afișarea erorilor cu actualizarea $wpdb
Folosesc $wpdb->update
pentru a actualiza un tabel personalizat din baza mea de date. Când fac var_dump
la rezultat, acesta returnează:
int(0)
Așa că am încercat $wpdb->print_error()
pentru a vedea care este problema. Cu toate acestea, nu afișează nimic. Am încercat și $wpdb->show_errors()
, dar din nou nu a arătat nimic.
Documentația wpdb nu oferă multe detalii despre cum să folosești aceste funcții, așa că nu sunt sigur dacă le folosesc corect. Dar de ce ar returna rezultatul actualizării unui tabel valoarea 0 și nu ar afișa nicio eroare?
Afișează erorile:
$wpdb->show_errors = true
afișează erorile automat, dacăWP_DEBUG
este setat latrue
.$wpdb->suppress_errors = false
oprește suprimitarea erorilor.Rețeaua de site-uri (Multisite) necesită tratament special
// Afișează erorile în Rețeaua de site-uri: global $wpdb, $blog_id; // Nu există is_multisite(), așa că trebuie să verificăm ID-ul // Aceasta înseamnă că implicit nu putem depana blogul cu ID-ul 1 ca blog MU // Verificăm dacă suntem pe Blogul cu ID#1 și dacă nu, verificăm definițiile și adăugăm gestionarea erorilor if ( 1 !== $blog_id ) ! defined( 'DIEONDBERROR' ) AND define( 'DIEONDBERROR', true );
Gestionarea rezultatelor
Metoda $wpdb->update()
are trei rezultate diferite. Pentru a le verifica, trebuie să salvați rezultatul într-o variabilă: $result = $wpdb->update( /* ... */ );
.
Gestionați aceste scenarii:
false === $result
: Eșec0 === $result
: Succes, dar nicio actualizare0 < $result
: Succes
Ieșirea clasei
$wpdb->last_error
vă va afișa ultima eroare, dacă există.$wpdb->last_query
vă va ajuta să afișați ultima interogare (unde a apărut eroarea). Este practic același lucru cuarray_pop( $wpbd->queries );
.
Notă importantă (securitate)
Vă rugăm să NU adăugați aceste coduri pe un site activ. Mai ales dacă sunt implicate pluginuri de caching. Acest lucru poate expune date importante despre baza de date vizitatorilor!
Dacă nu puteți face altfel: încadrați întotdeauna codul în instrucțiuni condiționale pentru a preveni afișarea informațiilor de depanare public!
// Exemplu
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 .= 'Ultima Eroare: ';
$output .= var_export( $wpdb->last_error, true );
$output .= "\n\nUltima Interogare: ";
$output .= var_export( $wpdb->last_query, true );
if ( false === $result )
{
$result = new WP_Error( 'query_failed', 'Nicio actualizare.', $data );
}
elseif ( 0 === $result )
{
$result = new WP_Error( 'update_failed', 'Zero rânduri actualizate.', $data );
}
elseif ( 0 < $result )
{
$result = 'Succes';
}
$output .= '</pre>';
// Opriti executia doar dacă avem o eroare
is_wp_error( $result )
AND exit( $output.$result->get_error_message() );
}
}
Expunerea obiectului $wpdb
poate expune și numele de utilizator și parola bazei de date!

Vă recomand să rulați următorul cod imediat după interogarea dumneavoastră pentru a vedea ce se întâmplă:
exit( var_dump( $wpdb->last_query ) );
Acest cod ar trebui să afișeze ultima interogare care a fost executată în baza de date. În astfel de cazuri, de obicei rulez manual o astfel de interogare prin phpMyAdmin pentru a verifica dacă rulează fără erori și pentru a vedea dacă afectează efectiv baza de date. În plus, vizualizând interogarea care a fost efectiv executată, puteți identifica probleme în interogare care rezultă din codul dumneavoastră. De exemplu, interogarea poate să nu returneze nicio eroare MySQL, dar poate executa o interogare diferită de ceea ce vă așteptați. Cu acest cod de depanare, veți putea cel puțin să vedeți care este interogarea și să continuați pe minunata pistă de depanare! Mai mult, ați putea explora și alte "Variabile de Clasă" (Referință Codex) pentru $wpdb
, deoarece acestea v-ar putea ajuta în continuare la depanarea problemei.

Un răspuns zero înseamnă că zero rânduri au fost afectate, ceea ce este diferit de o eroare.
Este dificil de spus fără a vedea interogarea ta de ce nu sunt actualizate rânduri. Un instrument de depanare pe care îl poți încerca este setarea "SAVEQUERIES
" la true în fișierul wp-config.php.
Apoi, după ce interogarea rulează, încearcă să folosești var_dump
pe $wpdb->queries
.
