Affichage des erreurs avec la mise à jour de $ wpdb

17

J'utilise $wpdb->update pour mettre à jour une table personnalisée présente dans ma base de données. Quand je var_dump le résultat, il retourne:

int(0)

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

Les documents wpdb ne donnent pas beaucoup de détails sur la façon d'utiliser ces fonctions, je ne suis donc pas sûr si je les utilise correctement. Mais pourquoi le résultat de la mise à jour d’une table renvoie-t-il 0 et ne montre-t-il aucune erreur?

    
posée Jarred 05.05.2011 - 03:42

5 réponses

16

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

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

Ceci devrait imprimer la dernière requête qui a touché votre base de données. Dans de tels cas, je vais généralement exécuter manuellement une telle requête via phpMyAdmin pour voir si elle s'exécute sans erreurs et si elle affecte même la base de données. En outre, en consultant la requête qui a été réellement exécutée, vous pouvez rencontrer des problèmes dans la requête résultant de votre code. Par exemple, la requête peut ne renvoyer aucune erreur MySQL, mais une requête différente de celle attendue peut être exécutée. Avec ce code de débogage, vous pourrez au moins voir ce que c'est et continuer sur le merveilleux sentier de débogage! En outre, vous voudrez peut-être explorer davantage les "variables de classe" ( sur la référence du Codex ) pour $wpdb car peut vous aider à résoudre votre problème.

    
réponse donnée tollmanz 05.05.2011 - 07:02
19

Afficher les erreurs:

  • $wpdb->show_errors = true affiche les erreurs automatiquement, si WP_DEBUG est défini sur true .
  • $wpdb->suppress_errors = false arrête la suppression des erreurs.

  • Un traitement spécial est nécessaire pour les multisites

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

Traitement de la sortie

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

Le gestionnaire de ces scénarios:

  • false === $result : Fail
  • 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_query vous aidera à afficher la dernière requête (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 actif. Surtout pas si des plugins de mise en cache sont impliqués. Cela peut exposer aux visiteurs des données importantes relatives à la base de données !

Si vous ne pouvez pas faire autrement: encapsulez toujours votre code dans des instructions conditionnelles pour empêcher les sorties de débogage destinées au public!

// 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'objet $wpdb peut également exposer le nom d'utilisateur et le mot de passe de votre base de données!

    
réponse donnée kaiser 12.08.2011 - 20:22
4

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

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

Ensuite, une fois votre requête exécutée, essayez var_dump ing $wpdb->queries .

    
réponse donnée goldenapples 05.05.2011 - 04:28
3
$wpdb->show_errors();
$wpdb->print_error();
    
réponse donnée Emil 02.03.2012 - 17:04
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));
}
    
réponse donnée Volomike 16.04.2012 - 21:21

Lire d'autres questions sur les étiquettes