データベースにあるカスタムテーブルを更新するために$wpdb->update
を使用しています。結果をvar_dump
にすると、次のように返されます。
int(0)
そこで私は何が悪いのかを見るために$wpdb->print_error()
を試みました。しかし、何も表示されません。私は$wpdb->show_errors()
も試しましたが、やはり何も表示されませんでした。
wpdbのドキュメント これらの関数の使い方についてはあまり詳しく説明していないので、正しく使っているかどうかはわかりません。しかし、テーブルを更新した結果が0を返し、エラーが表示されないのはなぜでしょうか。
何が起こっているのかを確認するために、クエリの直後に次のコードを実行することをお勧めします。
exit( var_dump( $wpdb->last_query ) );
データベースにヒットした最後のクエリが表示されます。このような場合、私は通常phpMyAdminを通して手動でそのようなクエリを実行して、それがエラーなしで実行されるかどうか、そしてそれがデータベースにさえ影響するかどうかを確かめます。また、実際に実行されたクエリを見ると、コードから発生するクエリに問題がある可能性があります。たとえば、このクエリはMySQLエラーを返さない場合がありますが、予想とは異なるクエリを実行する可能性があります。このデバッグコードを使えば、少なくともそれが何であるかを見て、すばらしいデバッグの道を続けることができるでしょう。さらに、$wpdb
の "クラス変数"( Codex Ref )をさらに調べると、問題の解決に役立つことがあります。
$wpdb->show_errors = true
がtrue
に設定されている場合、WP_DEBUG
は自動的にエラーを表示します。$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()
メソッドには3つの異なる出力があります。それを確認するには、結果をvar:$result = $wpdb->update( /* ... */ );
に保存する必要があります。
これらのシナリオを処理します。
false === $result
:失敗0 === $result
:成功したが更新はしていない0 < $result
:成功$wpdb->last_error
によって最後のエラーが表示されます。$wpdb->last_query
は最後のクエリ(エラーが発生した場所)を表示するのに役立ちます。基本的にはarray_pop( $wpbd->queries );
と同じです。ライブサイトでこのコードを追加するNOTを実行してください。特にキャッシングプラグインが関係していないのであれば。これは訪問者に重要な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
オブジェクトを公開すると、データベースのユーザー名とパスワードも公開される可能性があります。
ゼロ応答とは、ゼロ行が影響を受けることを意味します。これはエラーとは異なります。
クエリを見ないで行が更新されない理由を言うのは難しいです。あなたが試すことができる一つのデバッグツールはあなたのwp-config.phpファイルで "SAVEQUERIES
"をtrueに設定することです。
クエリが実行されたら、var_dump
ing $wpdb->queries
を試します。
$wpdb->show_errors();
$wpdb->print_error();
あなたの質問の前にこれを試してください:
$wpdb->show_errors = TRUE;
$wpdb->suppress_errors = FALSE;
またはおそらくあなたのクエリの後にこれ:
if ($wpdb->last_error) {
die('error=' . var_dump($wpdb->last_query) . ',' . var_dump($wpdb->error));
}