De ce $wpdb->show_errors() și print_error() afișează rezultate chiar dacă output-ul interogării este corect?

23 feb. 2015, 12:18:45
Vizualizări: 111K
Voturi: 15

Pentru a investiga următoarea problemă, vezi https://wordpress.stackexchange.com/questions/178995/sanitize-a-working-query-string-by-using-wpdb-prepare-fails-with-mysql-db-er, m-am confruntat cu un comportament destul de ciudat. Chiar dacă interogarea folosită era corectă și afișa rezultatul corect.

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

Cu toate acestea, atât timp cât am show_errors și print_error active, primesc un output de eroare a bazei de date WP alături de:

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

Dar de ce? M-aș fi așteptat ca un output să fie afișat doar dacă ceva merge prost, cum ar fi o eroare sau un avertisment, dar în acest fel ceva este afișat tot timpul.

0
Toate răspunsurile la întrebare 1
2
34

Rezultatul afișat mai sus este comportamentul așteptat pentru $wpdb->print_error() dacă următoarele condiții sunt îndeplinite -

  • Rulezi un site simplu, nu un multisite
  • $wpdb->suppress_errors este setat la false
  • $wpdb->show_errors este setat la false

Din câte se vede în codul tău, îndeplinești toate aceste condiții.

De asemenea, reține că, dacă nu le-ai dezactivat anterior, $wpdb->show_errors este setat implicit la true, așa că nu este necesar să apelezi $wpdb->show_errors().

Pentru a afișa ceva doar atunci când apare o eroare în baza de date, poți face unul dintre următoarele două lucruri -

1 - Afișează eroarea și adaugă eroarea în jurnal

Pe lângă afișarea pe ecran, metoda $wpdb->print_error() va înregistra eroarea în jurnal. Dacă acest comportament este de dorit (recomandat), poți face astfel -

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

2 - Afișează eroarea dar nu o înregistra în jurnal

Dacă nu ești interesat să înregistrezi eroarea în jurnal, poți adăuga propria funcție my_print_error() și să o folosești în loc 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;

}

Ultima editare: Greșeală de sintaxă

23 feb. 2015 13:51:29
Comentarii

Îmi returnează gol în $str și $query

User User
15 iul. 2018 13:36:09

Mesajul de eroare se află în $wpdb->last_error, nu în $wpdb->last_result.

Martin_W Martin_W
12 dec. 2018 05:04:09