最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

errors - Why $wpdb->show_errors() and print_error() is showing an output even if the query output is correct?

programmeradmin2浏览0评论

In order of figuring out the following issue, see i ran into an rather odd behaviour. Even that my used query was correct and showing the right output.

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

Never the less as long as i have show_errors and print_error active i get an WP database error output alongside:

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

But why? I would have expected that an output is shown only if something goes wrong like an error or warning but this way something is shown all the time.

In order of figuring out the following issue, see https://wordpress.stackexchange/questions/178995/sanitize-a-working-query-string-by-using-wpdb-prepare-fails-with-mysql-db-er i ran into an rather odd behaviour. Even that my used query was correct and showing the right output.

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

Never the less as long as i have show_errors and print_error active i get an WP database error output alongside:

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

But why? I would have expected that an output is shown only if something goes wrong like an error or warning but this way something is shown all the time.

Share Improve this question edited Apr 13, 2017 at 12:37 CommunityBot 1 asked Feb 23, 2015 at 10:18 rkollerrkoller 6343 gold badges14 silver badges26 bronze badges
Add a comment  | 

1 Answer 1

Reset to default 34

The output that you posted above is expected behaviour for $wpdb->print_error() if the following is true -

  • You are running a single site, not multisite
  • $wpdb->suppress_errors is set to false
  • $wpdb->show_errors is set to false

From the looks of your code, you meet all those conditions.

Note also that, unless you have turned them off previously, $wpdb->show_errors is set to true by default, so you don't need to call $wpdb->show_errors().

To output something only when there is a DB error you can do one of these two things -

1 - Output the error and add the error to the log

As well as outputting on the screen, the $wpdb->print_error() method will log your error. If this is desirable behaviour (recommended), you can do this -

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

2 - Output the error but do not log it

If you are not interested in logging the error, you can add your own my_print_error() funciton and use that instead of $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;

}

Last Edit: Syntax Mistake

发布评论

评论列表(0)

  1. 暂无评论