Mostra errori con l'aggiornamento $ wpdb


21

Sto usando $wpdb->updateper aggiornare una tabella personalizzata che ho nel mio database. Quando var_dumprestituisco il risultato:

int(0)

Quindi ho provato $wpdb->print_error()a vedere cosa c'è che non va. Tuttavia, non mostra nulla. Ho anche provato $wpdb->show_errors(), ma ancora una volta non ha mostrato nulla.

I documenti di wpdb non descrivono in dettaglio come utilizzare queste funzioni, quindi non sono sicuro se le sto usando correttamente. Ma perché il risultato dell'aggiornamento di una tabella restituisce 0 e non mostra errori?

Risposte:


21

Consiglio di eseguire il seguente codice subito dopo la 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, di solito eseguirò manualmente una query del genere tramite phpMyAdmin per vedere se funziona senza errori e per vedere se influenza anche il database. Inoltre, visualizzando la query effettivamente eseguita, è possibile che si verifichino problemi nella query risultanti dal codice. Ad esempio, la query potrebbe non restituire errori MySQL, ma potrebbe eseguire una query diversa da quella che ci si aspetta. Con questo codice di debug, sarai almeno in grado di vedere di cosa si tratta e continuare sulla meravigliosa traccia di debug! Inoltre, potresti voler esplorare più delle "Variabili di classe" ( Codex Ref ) $wpdbperché potrebbero aiutare a risolvere ulteriormente il tuo problema.


1
Wow, stavo cercando questo
K. Kilian Lindberg,

mostra solo SHOW FULL COLUMNS FROM `` nel mio caso
Adi Prasetyo,

22

Mostra errori:

  • $wpdb->show_errors = truemostra gli errori automaticamente, se WP_DEBUGimpostato su true.
  • $wpdb->suppress_errors = false smette di eliminare gli errori.

  • Il multisito ha bisogno di un trattamento speciale

    // 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 );

Gestione dell'output

Il $wpdb->update()metodo ha tre diversi output. Per controllare contro di esso, è necessario salvare il risultato ia var: $result = $wpdb->update( /* ... */ );.

Gestire quegli scenari:

  • false === $result: Fallire
  • 0 === $result: Successo, ma nessun aggiornamento
  • 0 < $result: Successo

Uscita di classe

  • $wpdb->last_error ti mostrerà l'ultimo errore, se ne hai uno.
  • $wpdb->last_queryti aiuterà a mostrare l'ultima query (dove si è verificato l'errore). È praticamente lo stesso di array_pop( $wpbd->queries );.

Nota importante (di sicurezza)

Si prega di NON aggiungere questo codice sul sito live. Soprattutto se sono coinvolti plugin di cache. Ciò può esporre ai visitatori importanti dati relativi al DB !

Se non è possibile fare diversamente: avvolgere sempre il codice in istruzioni condizionali per impedire l'output di debug del pubblico!

// 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() );
    }
}

L'esposizione $wpdbdell'oggetto potrebbe anche esporre il nome utente e la password del database!


1
questa è una risposta fantastica! La lettura di questo mi ha fatto tornare al Codice WordPress e leggere di più su $ wpdb in generale. Grazie ancora per la risposta approfondita.
senso orario,

Più che eccezionale nella spiegazione ...
Vishal Kumar Sahu,

4

Una risposta zero indica zero righe interessate, che è diverso da un errore.

È difficile da dire senza guardare la tua domanda perché nessuna riga viene aggiornata. Uno strumento di debug che puoi provare è impostare " SAVEQUERIES" su true nel tuo file wp-config.php.

Poi, dopo le corse di query, provare var_dumping $wpdb->queries.


3
$wpdb->show_errors();
$wpdb->print_error();

2

Prova questo prima della tua richiesta:

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

o forse questo dopo la tua richiesta:

if ($wpdb->last_error) {
  die('error=' . var_dump($wpdb->last_query) . ',' . var_dump($wpdb->error));
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.