Afișarea erorilor cu actualizarea $wpdb

5 mai 2011, 04:42:02
Vizualizări: 53.6K
Voturi: 27

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?

0
Toate răspunsurile la întrebare 5
2
28

Afișează erorile:

  • $wpdb->show_errors = true afișează erorile automat, dacă WP_DEBUG este setat la true.
  • $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șec
  • 0 === $result: Succes, dar nicio actualizare
  • 0 < $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 cu array_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!

12 aug. 2011 21:22:47
Comentarii

acesta este un răspuns extraordinar! Citind acest lucru, m-am întors la WordPress Codex și am citit mai multe despre $wpdb în general. Mulțumesc din nou pentru răspunsul detaliat.

clockwiseq clockwiseq
7 iun. 2015 19:33:18

Mai mult decât extraordinar în explicație...

Vishal Kumar Sahu Vishal Kumar Sahu
2 apr. 2017 22:39:53
2
26

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.

5 mai 2011 08:02:53
Comentarii

Wow, căutam asta

K. Kilian Lindberg K. Kilian Lindberg
19 mar. 2014 15:36:41

în cazul meu doar afișează SHOW FULL COLUMNS FROM ``

Adi Prasetyo Adi Prasetyo
26 feb. 2019 07:50:58
0

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.

5 mai 2011 05:28:08
0
$wpdb->show_errors();
$wpdb->print_error();
2 mar. 2012 18:04:03
0

Încearcă asta înainte de interogarea ta:

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

sau poate asta după interogare:

if ($wpdb->last_error) {
  die('error=' . var_dump($wpdb->last_query) . ',' . var_dump($wpdb->error));
}
16 apr. 2012 22:21:45