Perché $wpdb->show_errors() e print_error() mostrano un output anche se il risultato della query è corretto?

23 feb 2015, 12:18:45
Visualizzazioni: 111K
Voti: 15

Nel tentativo di risolvere il seguente problema, vedi https://wordpress.stackexchange.com/questions/178995/sanitize-a-working-query-string-by-using-wpdb-prepare-fails-with-mysql-db-er mi sono imbattuto in un comportamento piuttosto strano. Anche se la query utilizzata era corretta e mostrava l'output giusto.

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

Tuttavia, finché ho attivi show_errors e print_error ottengo un output di errore del database WP insieme a:

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

Ma perché? Mi sarei aspettato che un output venisse mostrato solo se qualcosa va storto come un errore o un avviso, ma in questo modo viene mostrato qualcosa tutto il tempo.

0
Tutte le risposte alla domanda 1
2
34

L'output che hai pubblicato sopra è il comportamento previsto per $wpdb->print_error() se sono vere le seguenti condizioni -

  • Stai eseguendo un sito singolo, non un multisite
  • $wpdb->suppress_errors è impostato su false
  • $wpdb->show_errors è impostato su false

A giudicare dal tuo codice, soddisfi tutte queste condizioni.

Tieni presente inoltre che, a meno che tu non li abbia disattivati in precedenza, $wpdb->show_errors è impostato su true di default, quindi non è necessario chiamare $wpdb->show_errors().

Per visualizzare qualcosa solo quando c'è un errore del database puoi fare una di queste due cose -

1 - Visualizza l'errore e aggiungilo al log

Oltre a visualizzarlo sullo schermo, il metodo $wpdb->print_error() registrerà il tuo errore nel log. Se questo comportamento è desiderabile (consigliato), puoi fare così -

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

2 - Visualizza l'errore ma non registrarlo nel log

Se non sei interessato a registrare l'errore nel log, puoi creare la tua funzione my_print_error() e usarla al posto di $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>Errore del database WordPress:</strong> [$str]<br />
        <code>$query</code></p>
        </div>";

    endif;

}

Ultima modifica: Errore di sintassi

23 feb 2015 13:51:29
Commenti

Mi restituisce vuoto in $str e $query

User User
15 lug 2018 13:36:09

Il messaggio di errore è in $wpdb->last_error, non in $wpdb->last_result.

Martin_W Martin_W
12 dic 2018 05:04:09