$ wpdb更新でエラーを表示


21

$wpdb->updateデータベースにあるカスタムテーブルを更新するために使用しています。私var_dumpが結果を返すとき:

int(0)

だから私$wpdb->print_error()は何が悪いのか見ようとしました。ただし、何も表示されません。私も試しました$wpdb->show_errors()が、再び何も表示されませんでした。

wpdbのドキュメントは、私はそれらを正しく使用している場合、私はわからないよので、これらの関数を使用する方法について多くの詳細には触れません。しかし、テーブルを更新した結果が0を返し、エラーを表示しないのはなぜですか?

回答:


21

クエリの直後に次のコードを実行して、何が起こっているのかを確認することをお勧めします。

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

これにより、データベースにヒットした最後のクエリが出力されます。このような場合、通常、phpMyAdminを使用してこのようなクエリを手動で実行し、エラーなしで実行されるかどうか、データベースに影響するかどうかを確認します。さらに、実際に実行されたクエリを確認することで、コードから生じるクエリの問題を見つけることができます。たとえば、クエリはMySQLエラーを返さない場合がありますが、予想とは異なるクエリを実行する可能性があります。このデバッグコードを使用すると、少なくともそれが何であるかを確認し、すばらしいデバッグトレイルを続けることができます!さらに、問題をさらにトラブルシューティングするのに役立つ可能性があるため、「クラス変数」(Codex Ref)の詳細を調べる$wpdbこともできます。


1
うわー、この探して
K.キリアンリンドバーグ

それSHOW FULL COLUMNS FROM `` は私の場合に表示されます
アディ・プラセティョ

22

エラーを表示:

  • $wpdb->show_errors = trueWP_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()メソッドには3つの異なる出力があります。それをチェックするには、結果を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の詳細を読みました。詳細な回答をありがとうございます。
時計回り

...説明で恐ろしいより
ヴィシャル・クマールSahu

4

応答がゼロの場合、影響を受ける行はゼロであり、エラーとは異なります。

行が更新されない理由をクエリを見ずに言うのは難しいです。試すことができるデバッグツールの1つ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));
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.