問題描述

我正在使用 $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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。