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