Affichage des erreurs avec la mise à jour de $ wpdb

21

J'utilise $wpdb->updatepour mettre à jour une table personnalisée que j'ai dans ma base de données. Quand je var_dumple résultat il revient:

int(0)

J'ai donc essayé $wpdb->print_error()de voir ce qui ne va pas. Cependant, cela ne montre rien. J'ai également essayé $wpdb->show_errors(), mais encore une fois, cela n'a rien montré.

Les documents wpdb n'entrent pas dans les détails sur la façon d'utiliser ces fonctions, donc je ne sais pas si je les utilise correctement. Mais pourquoi le résultat de la mise à jour d'une table retournerait-il 0 et ne montrerait aucune erreur?

Jarred
la source

Réponses:

21

Je recommanderais d'exécuter le code suivant juste après votre requête pour voir ce qui se passe:

exit( var_dump( $wpdb->last_query ) );

Cela devrait imprimer la dernière requête qui a atteint votre base de données. Dans de tels cas, j'exécute généralement manuellement une telle requête via phpMyAdmin pour voir si elle s'exécute sans erreur et pour voir si elle affecte même la base de données. En outre, en voyant la requête qui a été réellement exécutée, vous pouvez rencontrer des problèmes dans la requête qui résulte de votre code. Par exemple, la requête peut ne renvoyer aucune erreur MySQL, mais elle peut exécuter une requête différente de celle que vous attendez. Avec ce code de débogage, vous pourrez au moins voir ce que c'est et continuer sur la merveilleuse piste de débogage! En outre, vous souhaiterez peut-être explorer davantage les "Variables de classe" ( référence Codex ) $wpdbcar elles peuvent aider à résoudre davantage votre problème.

tollmanz
la source
1
Wow cherchais ça
K. Kilian Lindberg
il montre juste SHOW FULL COLUMNS FROM `` dans mon cas
Adi Prasetyo
22

Afficher les erreurs:

  • $wpdb->show_errors = trueaffiche automatiquement les erreurs, si WP_DEBUGest défini sur true.
  • $wpdb->suppress_errors = false arrête de supprimer les erreurs.

  • Les multisites nécessitent un traitement spécial

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

Gestion des sorties

La $wpdb->update()méthode a trois sorties différentes. Pour vérifier contre, vous devez enregistrer le résultat ia var: $result = $wpdb->update( /* ... */ );.

Le gérer ces scénarios:

  • false === $result: Échouer
  • 0 === $result: Succès, mais pas de mise à jour
  • 0 < $result: Succès

Sortie de classe

  • $wpdb->last_error vous montrera la dernière erreur, si vous en avez une.
  • $wpdb->last_queryvous aidera à afficher la dernière requête (là où l'erreur s'est produite). C'est fondamentalement la même chose que array_pop( $wpbd->queries );.

Remarque importante (sécurité)

Veuillez NE PAS ajouter ces codes sur le site en direct. Surtout pas si des plugins de mise en cache sont impliqués. Cela peut exposer des données importantes liées aux bases de données aux visiteurs !

Si vous ne pouvez pas faire autrement: enveloppez toujours votre code dans des instructions conditionnelles pour empêcher la sortie de débogage publique!

// 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'exposition de l' $wpdbobjet peut également révéler le nom d'utilisateur et le mot de passe de votre base de données!

kaiser
la source
1
c'est une réponse géniale! La lecture de cela m'a fait revenir au Codex WordPress et en savoir plus sur $ wpdb en général. Merci encore pour la réponse détaillée.
clockwiseq
Plus que génial dans l'explication ...
Vishal Kumar Sahu
4

Une réponse nulle signifie zéro ligne affectée, ce qui est différent d'une erreur.

Il est difficile de dire sans regarder votre requête pourquoi aucune ligne n'est mise à jour. Un outil de débogage que vous pouvez essayer consiste à définir " SAVEQUERIES" sur true dans votre fichier wp-config.php.

Puis , après l' exécution de votre requête, essayez var_dumping $wpdb->queries.

pommes dorées
la source
3
$wpdb->show_errors();
$wpdb->print_error();
Emil
la source
2

Essayez ceci avant votre requête:

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

ou peut-être ceci après votre requête:

if ($wpdb->last_error) {
  die('error=' . var_dump($wpdb->last_query) . ',' . var_dump($wpdb->error));
}
Volomike
la source