web-dev-qa-db-ja.com

$ wpdbアップデートでエラーを表示

データベースにあるカスタムテーブルを更新するために$wpdb->updateを使用しています。結果をvar_dumpにすると、次のように返されます。

int(0)

そこで私は何が悪いのかを見るために$wpdb->print_error()を試みました。しかし、何も表示されません。私は$wpdb->show_errors()も試しましたが、やはり何も表示されませんでした。

wpdbのドキュメント これらの関数の使い方についてはあまり詳しく説明していないので、正しく使っているかどうかはわかりません。しかし、テーブルを更新した結果が0を返し、エラーが表示されないのはなぜでしょうか。

19
Jarred

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

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

データベースにヒットした最後のクエリが表示されます。このような場合、私は通常phpMyAdminを通して手動でそのようなクエリを実行して、それがエラーなしで実行されるかどうか、そしてそれがデータベースにさえ影響するかどうかを確かめます。また、実際に実行されたクエリを見ると、コードから発生するクエリに問題がある可能性があります。たとえば、このクエリはMySQLエラーを返さない場合がありますが、予想とは異なるクエリを実行する可能性があります。このデバッグコードを使えば、少なくともそれが何であるかを見て、すばらしいデバッグの道を続けることができるでしょう。さらに、$wpdbの "クラス変数"( Codex Ref )をさらに調べると、問題の解決に役立つことがあります。

19
tollmanz

エラーを表示します。

  • $wpdb->show_errors = truetrueに設定されている場合、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オブジェクトを公開すると、データベースのユーザー名とパスワードも公開される可能性があります。

20
kaiser

ゼロ応答とは、ゼロ行が影響を受けることを意味します。これはエラーとは異なります。

クエリを見ないで行が更新されない理由を言うのは難しいです。あなたが試すことができる一つのデバッグツールはあなたのwp-config.phpファイルで "SAVEQUERIES"をtrueに設定することです。

クエリが実行されたら、var_dumping $wpdb->queriesを試します。

4
goldenapples
$wpdb->show_errors();
$wpdb->print_error();
3
Emil

あなたの質問の前にこれを試してください:

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

またはおそらくあなたのクエリの後にこれ:

if ($wpdb->last_error) {
  die('error=' . var_dump($wpdb->last_query) . ',' . var_dump($wpdb->error));
}
2
Volomike