$wpdb->update
更新数据库中的自定义表。当我var_dump
结果返回时:int(0)
所以我尝试了
$wpdb->print_error()
看看出了什么问题。但是,它什么也没显示。我也尝试过$wpdb->show_errors()
,但再次没有显示。 wpdb文档没有详细介绍如何使用这些功能,因此我不确定是否正确使用了它们。但是,为什么更新表的结果返回0,而不显示任何错误?
#1 楼
我建议您在查询后立即运行以下代码,以查看发生的情况:exit( var_dump( $wpdb->last_query ) );
这应打印出命中数据库的最后一个查询。在这种情况下,我通常会通过phpMyAdmin手动运行这样的查询,以查看它是否运行无错误,并查看它是否甚至影响数据库。此外,通过查看实际运行的查询,您可能会在查询中发现由代码导致的问题。例如,查询可能不会返回任何MySQL错误,但它可能会运行与您期望的查询不同的查询。使用此调试代码,您至少可以看到它是什么,并继续进行精彩的调试!此外,您可能希望探索
$wpdb
的更多“类变量”(Codex参考),因为它们可能有助于进一步解决问题。#2 楼
显示错误:如果将$wpdb->show_errors = true
设置为WP_DEBUG
,则true
自动显示错误。$wpdb->suppress_errors = false
停止抑制错误。多站点需要特殊处理
// Show errors in Multisite:
global $wpdb, $blog_id;
// There's no is_multisite(), so we need to check the ID
// This means, that we can't debug the blog with the ID 1 as MU-blog by default
// Check if we are on Blog ID#1 and if not, check the defines and add error handling
if ( 1 !== $blog_id )
! defined( 'DIEONDBERROR' ) AND define( 'DIEONDBERROR', true );
输出处理
$wpdb->update()
方法具有三个不同的输出。要对其进行检查,必须将结果保存在var:$result = $wpdb->update( /* ... */ );
中。处理以下情况:
false === $result
:失败0 === $result
:成功,但没有更新0 < $result
:成功类输出
$wpdb->last_error
如果有一个错误,它将显示最后一个错误。$wpdb->last_query
将帮助您显示最后一个查询(发生错误的位置)。它与array_pop( $wpbd->queries );
基本相同。重要(安全性)注意
请不要在现场站点上添加此代码。如果涉及缓存插件,则尤其如此。这可能会将重要的与DB相关的数据暴露给访问者!
如果不能这样做:请始终将代码包装在条件语句中,以防止公开的调试输出!
// Example
function debug_query( $result, $data )
{
global $current_user;
get_currentuserinfo();
if ( current_user_can( 'manage_options' ) )
{
global $wpdb, $blog_id;
1 !== $blog_id
AND ! defined( 'DIEONDBERROR' )
AND define( 'DIEONDBERROR', true );
$wpdb->show_errors = true;
$wpdb->suppress_errors = false;
$output = '<pre style="white-space:pre-line;">';
$output .= 'Last Error: ';
$output .= var_export( $wpdb->last_error, true );
$output .= "\n\nLast Query: ";
$output .= var_export( $wpdb->last_query, true );
if ( false === $result )
{
$result = new WP_Error( 'query_failed', 'No update.', $data );
}
elseif ( 0 === $result )
{
$result = new WP_Error( 'update_failed', 'Updated zero rows.', $data );
}
elseif ( 0 < $result )
{
$result = 'Success';
}
$output .= '</pre>';
// Only abort, if we got an error
is_wp_error( $result )
AND exit( $output.$result->get_error_message() );
}
}
公开
$wpdb
对象也可能会公开您的数据库用户名和密码!评论
这是一个了不起的答案!阅读此内容后,我回到了WordPress Codex,并大致了解了有关$ wpdb的更多信息。再次感谢您的深入回答。
–clockwiseq
2015年6月7日在16:33
超过真棒的解释...
– Vishal Kumar Sahu
17年4月2日在19:39
#3 楼
零响应表示受影响的行数为零,这与错误不同。不看查询就很难说为什么没有行被更新。您可以尝试的一种调试工具是在wp-config.php文件中将“
SAVEQUERIES
”设置为true。然后在查询运行后,尝试
var_dump
和$wpdb->queries
。#4 楼
$wpdb->show_errors();
$wpdb->print_error();
#5 楼
在查询之前尝试以下操作:$wpdb->show_errors = TRUE;
$wpdb->suppress_errors = FALSE;
,或者在查询之后尝试以下操作:
if ($wpdb->last_error) {
die('error=' . var_dump($wpdb->last_query) . ',' . var_dump($wpdb->error));
}
评论
哇一直在寻找这个
– K. Kilian Lindberg
2014年3月19日13:36
在我的情况下,它只是显示``显示完整的列
– Adi Prasetyo
19-2-26在5:50