显示$ wpdb更新的错误


21

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

int(0)

所以我试图$wpdb->print_error()找出问题所在。但是,它什么也没显示。我也尝试过$wpdb->show_errors(),但再次没有显示。

WPDB文档不会进入太多细节上如何使用这些功能,所以我不能确定我是否正确地使用它们。但是,为什么更新表的结果返回0,而不显示任何错误?

Answers:


21

我建议在查询后立即运行以下代码,以查看发生了什么:

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

这应该打印出命中数据库的最后一个查询。在这种情况下,我通常会通过phpMyAdmin手动运行这样的查询,以查看它是否运行无错误,并查看它是否甚至影响数据库。此外,通过查看实际运行的查询,您可能会在查询中发现由代码导致的问题。例如,查询可能不会返回任何MySQL错误,但它可能会运行与您期望的查询不同的查询。使用此调试代码,您至少可以看到它是什么,并继续进行精彩的调试!此外,您可能希望探索更多“类变量”(Codex Ref),$wpdb因为它们可能有助于进一步解决问题。


1
哇,一直在寻找
K. Kilian Lindberg

它只是SHOW FULL COLUMNS FROM `` 在我的情况下显示
Adi Prasetyo

22

显示错误:

  • $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()方法具有三个不同的输出。要对证,你必须将结果保存IA 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对象也可能会暴露您的数据库用户名和密码!


1
这是一个了不起的答案!阅读此内容后,我将返回WordPress Codex,并大致了解有关$ wpdb的更多信息。再次感谢您的深入解答。
clockwiseq

不仅仅是解释方面的超棒……
Vishal Kumar Sahu

4

零响应表示受影响的行数为零,这与错误不同。

不查看您的查询就很难说为什么没有行被更新。您可以尝试的一种调试工具是SAVEQUERIES在wp-config.php文件中将“ ” 设置为true。

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



2

在查询之前尝试以下操作:

$wpdb->show_errors = TRUE;
$wpdb->suppress_errors = FALSE;

或者在查询后出现以下情况:

if ($wpdb->last_error) {
  die('error=' . var_dump($wpdb->last_query) . ',' . var_dump($wpdb->error));
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.