Affichage des erreurs avec $ wpdb update
5 réponses
- votes
-
- 2011-05-05
Je vous recommande d'exécuter le code suivantjuste après votre requêtepour voir ce qui sepasse:
exit( var_dump( $wpdb->last_query ) );
Cela devraitimprimer la dernière requête qui afrappé votrebase de données.Dans des cas comme ceux-ci,j'exécuteraigénéralementmanuellement unetelle requête viaphpMyAdminpour voir sielle s'exécute sanserreurset pour voir sielle affectemême labase de données.En outre,en voyant la requête qui a été réellementexécutée,vouspouveztrouver desproblèmes dans la requête qui résulte de votre code.Parexemple,la requêtepeutne renvoyer aucuneerreur MySQL,maisellepeutexécuter une requête différente de celle que vous attendez.Avec ce code de débogage,vouspourrez aumoins voir ce que c'estet continuer sur lamerveilleusepiste de débogage!En outre,vous voudrezpeut-êtreexplorer davantage les «Variables de classe» ( Codex Ref )pour
$wpdb
carilspeuvent vous aider à résoudre votreproblème.I would recommend running the following code right after your query to see what's happening:
exit( var_dump( $wpdb->last_query ) );
This should print the last query that hit your database. In cases like these, I usually will manually run such a query through phpMyAdmin to see if it runs without errors and to see if it even affects the database. Additionally, by seeing the query that was actually run, you may find problems in the query that results from your code. For instance, the query may not return any MySQL errors, but it could run a query that is different than you expect it to be. With this debug code, you'll at least be able to see what it is and continue on the wonderful debug trail! Furthermore, you may want to explore more of the "Class Variables" (Codex Ref) for
$wpdb
as they may help further troubleshoot your issue.-
Wow cherchait çaWow been looking for this
- 1
- 2014-03-19
- K. Kilian Lindberg
-
ilmontrejuste `` MONTRER LES COLONNES PLEINES DE '' `` dansmon casit just show `SHOW FULL COLUMNS FROM `` ` in my case
- 0
- 2019-02-26
- Adi Prasetyo
-
- 2011-08-12
Afficher leserreurs:
-
$wpdb->show_errors = true
affiche automatiquement leserreurs,siWP_DEBUG
est défini surtrue
. $wpdb->suppress_errors = false
arrête de supprimer leserreurs.-
Lemultisitenécessite untraitement 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
Laméthode
$wpdb->update()
atrois sorties différentes. Pour le vérifier,vous devezenregistrer le résultat dans une var:$result = $wpdb->update( /* ... */ );
.Lagestion de ces scénarios:
-
false === $result
: Échec -
0 === $result
: succès,maispas demise àjour -
0 < $result
: Succès
Sortie de classe
-
$wpdb->last_error
vousmontrera la dernièreerreur,si vousen avez une. -
$wpdb->last_query
vous aidera à afficher la dernière requête (où l'erreur s'estproduite). C'estfondamentalement lamême chose quearray_pop( $wpbd->queries );
.
Remarqueimportante (de sécurité)
Veuillez PAS ajouter ces codes sur le siteen ligne. Surtoutpas si desplugins demiseen cache sontimpliqués. Celapeut exposer aux visiteurs des donnéesimportantes relatives à labase de données !
Si vousne pouvezpasfaire autrement:enveloppeztoujours votre code dans desinstructions conditionnellespourempêcher la sortie de débogagepublique!
// 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 égalementexposer lenom d'utilisateuret lemot depasse de votrebase de données!Show errors:
$wpdb->show_errors = true
shows errors automatically, ifWP_DEBUG
is set totrue
.$wpdb->suppress_errors = false
stops suppressing errors.Multisite need special treatment
// 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 );
Output handling
The
$wpdb->update()
method has three different outputs. To check against it, you must save the result i a var:$result = $wpdb->update( /* ... */ );
.The handle those scenarios:
false === $result
: Fail0 === $result
: Success, but no update0 < $result
: Success
Class output
$wpdb->last_error
will show you the last error, if you got one.$wpdb->last_query
will assist you with showing the last query (where the error occurred). It is basically the same asarray_pop( $wpbd->queries );
.
Important (security) Note
Please do NOT add this codes on live site. Especially not if caching plugins are involved. This may expose important DB-related data to visitors!
If you can't do otherwise: always wrap your code in conditional statements to prevent public facing debug output!
// 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() ); } }
Exposing the
$wpdb
object might also expose your database username and password!-
c'est une réponsegéniale!La lecture de cecim'afait revenir au Codex WordPresset en savoirplus sur $ wpdben général.Merciencorepour la réponse détaillée.this is an awesome answer! Reading this made me go back to the WordPress Codex and read more about $wpdb in general. Thanks again for the in-depth answer.
- 1
- 2015-06-07
- clockwiseq
-
Plus quegénial dans l'explication ...More than Awesome in explanation...
- 1
- 2017-04-02
- Sahu V Kumar
-
- 2011-05-05
Une réponse zéro signifie zéro ligne affectée,ce quiest différent d'uneerreur.
Ilest difficile de dire sans regarder votre requêtepourquoi aucune lignen'estmise àjour.Un outil de débogage que vouspouvezessayer consiste à définir "
SAVEQUERIES
" surtrue dans votrefichier wp-config.php.Ensuite,après l'exécution de votre requête,essayez
var_dump
ing$wpdb->queries
.A zero response means zero rows affected, which is different from an error.
Its hard to say without looking at your query why no rows are being updated. One debug tool you can try is setting "
SAVEQUERIES
" to true in your wp-config.php file.Then after your query runs, try
var_dump
ing$wpdb->queries
. -
-
- 2012-04-16
Essayez ceci avant votre requête:
$wpdb->show_errors = TRUE; $wpdb->suppress_errors = FALSE;
oupeut-être ceci après votre requête:
if ($wpdb->last_error) { die('error=' . var_dump($wpdb->last_query) . ',' . var_dump($wpdb->error)); }
Try this before your query:
$wpdb->show_errors = TRUE; $wpdb->suppress_errors = FALSE;
or perhaps this after your query:
if ($wpdb->last_error) { die('error=' . var_dump($wpdb->last_query) . ',' . var_dump($wpdb->error)); }
J'utilise
$wpdb->update
pourmettre àjour unetablepersonnalisée quej'ai dansmabase de données.Lorsquejevar_dump
le résultat,il renvoie:J'ai doncessayé
$wpdb->print_error()
pour voir ce quine vapas.Cependant,celane montre rien.J'ai égalementessayé$wpdb->show_errors()
,maisencore unefois,celan'a rienmontré.La documentation wpdb ne donnepasbeaucoup de détails sur l'utilisation de cesfonctions,je ne suis doncpas sûrsije les utilise correctement.Maispourquoi le résultat de lamise àjour d'unetable renvoie 0et nemontre aucuneerreur?