Pour connaître le problème suivant, voir https://wordpress.stackexchange.com/questions/178995/sanitize-a-working-query-string-by-using-wpdb-prepare-fails-with-mysql- db-er i a rencontré un comportement plutôt étrange. Même si ma requête utilisée était correcte et affichait le bon résultat.
global $wpdb;
$wpdb->show_errors();
$pageposts = $wpdb->get_results(
$wpdb->prepare(
"
SELECT skposts.*
FROM $wpdb->posts skposts,
$wpdb->postmeta skpostmeta1,
$wpdb->postmeta skpostmeta2
WHERE skposts.ID = skpostmeta1.post_id
AND skposts.ID = skpostmeta2.post_id
AND skpostmeta1.meta_key = %s
AND skpostmeta2.meta_key = %s
AND skposts.post_type = %s
AND skposts.post_status = %s
ORDER BY skpostmeta1.meta_value ASC,
skpostmeta2.meta_value ASC
",
'class_day',
'class_start',
'courses',
'publish'
)
, OBJECT
);
$wpdb->print_error();
Jamais le moins tant que j'ai show_errors
et print_error
actif, j'obtiens une sortie d'erreur de base de données WP:
WordPress database error: []
SELECT skposts.* FROM hmjtZ_posts skposts, hmjtZ_postmeta skpostmeta1, hmjtZ_postmeta skpostmeta2 WHERE skposts.ID = skpostmeta1.post_id AND skposts.ID = skpostmeta2.post_id AND skpostmeta1.meta_key = 'class_day' AND skpostmeta2.meta_key = 'class_start' AND skposts.post_type = 'courses' AND skposts.post_status = 'publish' ORDER BY skpostmeta1.meta_value ASC, skpostmeta2.meta_value ASC
Mais pourquoi? Je me serais attendu à ce qu'une sortie ne soit affichée que si quelque chose ne va pas, comme une erreur ou un avertissement, mais de cette façon, quelque chose est affiché tout le temps.
La sortie que vous avez publiée ci-dessus correspond au comportement attendu de $wpdb->print_error()
si les conditions suivantes sont vraies -
$wpdb->suppress_errors
est défini sur false$wpdb->show_errors
est défini sur falseD'après l'apparence de votre code, vous remplissez toutes ces conditions.
Notez également que, sauf si vous les avez précédemment désactivés, $wpdb->show_errors
est défini par défaut sur true
, vous n'avez donc pas besoin d'appeler $wpdb->show_errors()
.
Pour sortir quelque chose seulement quand il y a une erreur de base de données, vous pouvez faire l'une de ces deux choses -
En plus d'afficher à l'écran, la méthode $wpdb->print_error()
enregistrera votre erreur. Si cela est souhaitable (recommandé), vous pouvez le faire -
if($wpdb->last_error !== '') :
$wpdb->print_error()
endif;
Si vous ne souhaitez pas enregistrer l'erreur, vous pouvez ajouter votre propre fonction my_print_error()
et l'utiliser à la place de $wpdb->print_error()
-
function my_print_error(){
global $wpdb;
if($wpdb->last_error !== '') :
$str = htmlspecialchars( $wpdb->last_result, ENT_QUOTES );
$query = htmlspecialchars( $wpdb->last_query, ENT_QUOTES );
print "<div id='error'>
<p class='wpdberror'><strong>WordPress database error:</strong> [$str]<br />
<code>$query</code></p>
</div>";
endif;
}