要解决以下问题,请参阅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_errors
和
print_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
但为什么呢?我本以为只有出现错误或警告之类的错误时才会显示输出,但这种方式会一直显示某些内容。
最合适的回答,由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;
}
上次编辑:语法错误