Warum zeigt $ wpdb-> show_errors () und print_error () eine Ausgabe an, selbst wenn die Abfrage korrekt ist?

Um das folgende Problem herauszufinden, siehe https://wordpress.stackexchange.com/questions/178995/sanitize-a-working-query-string-by-using-wpdb-prepare-fails-with-mysql-db- Ich hatte ein ziemlich merkwürdiges Verhalten. Auch dass meine verwendete Abfrage korrekt war und die richtige Ausgabe zeigte.

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

show_errors solange ich show_errors und print_error aktiv habe, show_errors ich eine WP-databaseerrorsausgabe neben:

 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 

Aber warum? Ich hätte erwartet, dass eine Ausgabe nur angezeigt wird, wenn etwas wie ein Fehler oder eine Warnung schief geht, aber auf diese Weise wird ständig etwas angezeigt.

Solutions Collecting From Web of "Warum zeigt $ wpdb-> show_errors () und print_error () eine Ausgabe an, selbst wenn die Abfrage korrekt ist?"

Die oben angegebene Ausgabe ist das erwartete Verhalten für $wpdb->print_error() wenn Folgendes zutrifft:

  • Sie führen eine einzelne Site aus, nicht mehrere Sites
  • $wpdb->suppress_errors wird auf false gesetzt
  • $wpdb->show_errors ist auf false gesetzt

Nach dem Aussehen Ihres Codes erfüllen Sie alle diese Bedingungen.

Beachten Sie außerdem, dass $wpdb->show_errors standardmäßig auf true $wpdb->show_errors ist, sofern Sie sie nicht zuvor $wpdb->show_errors , sodass Sie $wpdb->show_errors() nicht aufrufen $wpdb->show_errors() .

Um etwas nur auszugeben, wenn ein DB-Fehler vorliegt, können Sie eines dieser beiden Dinge tun –

1 – Geben Sie den Fehler aus und fügen Sie den Fehler dem Protokoll hinzu

Neben der Ausgabe auf dem Bildschirm wird die $wpdb->print_error() -Methode Ihren Fehler protokollieren. Wenn dies wünschenswert ist (empfohlen), können Sie dies tun –

 if($wpdb->last_error !== '') : $wpdb->print_error() endif; 

2 – Geben Sie den Fehler aus, protokollieren Sie ihn jedoch nicht

Wenn Sie nicht daran interessiert sind, den Fehler zu protokollieren, können Sie Ihre eigene function my_print_error() hinzufügen und diese anstelle von $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 "

WordPress database error: [$str]
$query

"; endif; }