问题描述

我正在使用 $wpdb->update 更新我的数据库中的自定义表。当我 var_dump 的结果返回:

int(0)

所以我试过 $wpdb->print_error()看看有什么问题。但是,它什么都不显示。我也试过 $wpdb->show_errors(),但再次显示。

wpdb docs 没有详细介绍如何使用这些功能,所以我不确定是否正确使用它们。但是为什么更新表的结果将返回 0,并且不显示任何错误?

最佳解决方案

我建议您在查询后立即运行以下代码以查看发生的情况:

exit( var_dump( $wpdb->last_query ) );

这应该打印最后一个查询数据库。在这种情况下,我通常会通过 phpMyAdmin 手动运行这样一个查询,看看它是否运行没有错误,并且看是否影响数据库。另外,通过查看实际运行的查询,您可能会在代码中产生的查询中发现问题。例如,查询可能不会返回任何 MySQL 错误,但它可能会运行与您期望的不同的查询。有了这个调试代码,你至少可以看到它是什么,并继续在美妙的调试轨迹!此外,您可能希望探索 $wpdb 的更多”Class Variables”(Codex Ref),因为它们可能有助于进一步解决您的问题。

次佳解决方案

显示错误:

  • 如果 WP_DEBUG 设置为 true$wpdb->show_errors = 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-related 数据暴露给访问者!

如果你不能这样做:总是把你的代码封装在条件语句中,以防止公共面向调试输出!

// 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 .= "nnLast 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 对象也可能会暴露您的数据库用户名和密码!

第三种解决方案

零响应意味着零行受影响,这与错误不同。

很难说,没有查看你的查询为什么没有更新行。您可以尝试一个调试工具,将 wp-config.php 文件中的 「SAVEQUERIES」 设置为 true 。

然后运行查询后,尝试 var_dump $wpdb->queries

第四种方案

$wpdb->show_errors();
$wpdb->print_error();

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。