Mostrare gli errori con $wpdb update

5 mag 2011, 04:42:02
Visualizzazioni: 53.6K
Voti: 27

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?

0
Tutte le risposte alla domanda 5
2
28

Mostra errori:

  • $wpdb->show_errors = true mostra automaticamente gli errori, se WP_DEBUG è impostato su true.
  • $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: Fallimento
  • 0 === $result: Successo, ma nessun aggiornamento
  • 0 < $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 di array_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!

12 ago 2011 21:22:47
Commenti

questa è una risposta fantastica! Leggere questo mi ha fatto tornare al Codex di WordPress e leggere di più su $wpdb in generale. Grazie ancora per la risposta così approfondita.

clockwiseq clockwiseq
7 giu 2015 19:33:18

Più che fantastico nella spiegazione...

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

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.

5 mag 2011 08:02:53
Commenti

Wow, stavo cercando proprio questo

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

nel mio caso mostra solo SHOW FULL COLUMNS FROM ``

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

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.

5 mag 2011 05:28:08
0
$wpdb->show_errors(); // Mostra gli errori del database
$wpdb->print_error();   // Stampa l'ultimo errore del database
2 mar 2012 18:04:03
0

Prova questo prima della tua query:

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

o forse questo dopo la tua query:

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