web-dev-qa-db-fra.com

Afficher les erreurs avec la mise à jour $ wpdb

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, il n'a rien montré.

Les wpdb docs n'entrent pas dans les détails sur la façon d'utiliser ces fonctions, je ne suis donc pas sûr de les utiliser correctement. Mais pourquoi le résultat de la mise à jour d'une table renvoie 0 et ne montre aucune erreur?

19
Jarred

Je recommanderais de lancer 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 touché votre base de données. Dans de tels cas, je vais généralement lancer 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é 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 la merveilleuse piste de débogage! En outre, vous voudrez peut-être explorer davantage les "variables de classe" ( Référence du Codex ) pour $wpdb car elles pourraient vous aider à résoudre votre problème.

19
tollmanz

Afficher les erreurs:

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

  • Les multisites ont besoin d'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 );
    

Traitement de sortie

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

Le gérer ces scénarios:

  • false === $result: échec
  • 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 );.

Note importante (de sécurité)

S'il vous plaît faitesPASajouter ces codes sur le site en direct. 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 la sortie de débogage du 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() );
    }
}

Exposer l'objet $wpdb peut également exposer votre nom d'utilisateur et votre mot de passe de base de données!

20
kaiser

Une réponse zéro signifie zéro ligne affectée, ce qui diffère 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 est de définir "SAVEQUERIES" sur true dans votre fichier wp-config.php.

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

4
goldenapples
$wpdb->show_errors();
$wpdb->print_error();
3
Emil

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));
}
2
Volomike