为什么即使查询输出是正确的,$wpdb->show_error()和print_error()也会显示输出?

时间:2015-02-23 作者:rkoller

要解决以下问题,请参阅https://wordpress.stackexchange.com/questions/178995/sanitize-a-working-query-string-by-using-wpdb-prepare-fails-with-mysql-db-er 我遇到了一个相当奇怪的行为。即使我使用的查询是正确的,并且显示了正确的输出。

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_errorsprint_error active i获得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
但为什么呢?我本以为只有出现错误或警告之类的错误时才会显示输出,但这种方式会一直显示某些内容。

1 个回复
最合适的回答,由SO网友:David Gard 整理而成

您在上面发布的输出是预期的行为$wpdb->print_error() 如果以下为真-

您运行的是单个站点,而不是多站点$wpdb->suppress_errors 设置为false$wpdb->show_errors 如果设置为false,则从代码外观来看,您满足所有这些条件。

还要注意的是,除非之前已将其关闭,$wpdb->show_errors 设置为true 默认情况下,您无需致电$wpdb->show_errors().

要仅在出现DB错误时输出某些内容,可以执行以下两种操作之一-

1-输出错误并将错误添加到日志中,以及在屏幕上输出$wpdb->print_error() 方法将记录您的错误。如果这是可取的行为(推荐),您可以这样做-

if($wpdb->last_error !== \'\') :
    $wpdb->print_error();
endif;
如果您不想记录错误,可以添加自己的错误my_print_error() 函数,并使用该函数代替$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;

}
上次编辑:语法错误

结束

相关推荐

WPDB secure custom form

我正在创建一个自定义表单来更新辅助MYSQL数据库中的行,这与wordpress的表单不同。此表单是公共的,每个用户都可以访问它。因此,我创建了一个插件,并使用wpdb连接数据库。如何以安全的方式执行此操作?我使用的是sanitize\\u text\\u field(),然后是wpdb->update()。这是安全的还是应该使用esc\\u sql()?如果我不能使用wpdb->update(),因为我需要一些!=where子句中的字段,可以使用sanitize\\u text\\u fie