web-dev-qa-db-fra.com

Pourquoi $ wpdb-> show_errors () et print_error () affichent une sortie même si la sortie de la requête est correcte?

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.

5
rpk

La sortie que vous avez publiée ci-dessus correspond au comportement attendu de $wpdb->print_error() si les conditions suivantes sont vraies -

  • Vous utilisez un seul site, pas plusieurs sites
  • $wpdb->suppress_errors est défini sur false
  • $wpdb->show_errors est défini sur false

D'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 -

1 - Affiche l'erreur et l'ajoute au journal

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;

2 - Afficher l'erreur mais ne pas la consigner

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;

}
15
David Gard