web-dev-qa-db-ja.com

クエリの出力が正しい場合でも、$ wpdb-> show_errors()およびprint_error()が出力を表示するのはなぜですか?

次の問題を解決するために、 https://wordpress.stackexchange.com/questions/178995/sanitize-a-working-query-string-by-using-wpdb-prepare-fails-with-mysql-を参照してください。 db-er iはかなり奇妙な振る舞いをしました。私の使用したクエリでさえも正しく、正しい出力を示していました。

global $wpdb;
$wpdb->show_errors(); 
$pageposts = $wpdb->get_results( 
        $wpdb->prepare(
          "
          SELECT skposts.*
          FROM  $wpdb->posts skposts,
                $wpdb->postmeta skpostmeta1,
                $wpdb->postmeta skpostmeta2
          WHERE skposts.ID = skpostmeta1.post_id
            AND skposts.ID = skpostmeta2.post_id
            AND skpostmeta1.meta_key = %s
            AND skpostmeta2.meta_key = %s
            AND skposts.post_type = %s
            AND skposts.post_status = %s
          ORDER BY skpostmeta1.meta_value ASC,
                   skpostmeta2.meta_value ASC
          ", 
          'class_day',
          'class_start',
          'courses',
          'publish'
        )
, OBJECT
);
$wpdb->print_error();

私はshow_errorsprint_errorをアクティブにしている限り、決してWPデータベースエラーを出力します:

WordPress database error: []
SELECT skposts.* FROM hmjtZ_posts skposts, hmjtZ_postmeta skpostmeta1, hmjtZ_postmeta skpostmeta2 WHERE skposts.ID = skpostmeta1.post_id AND skposts.ID = skpostmeta2.post_id AND skpostmeta1.meta_key = 'class_day' AND skpostmeta2.meta_key = 'class_start' AND skposts.post_type = 'courses' AND skposts.post_status = 'publish' ORDER BY skpostmeta1.meta_value ASC, skpostmeta2.meta_value ASC

しかし、なぜ?エラーや警告のように問題が発生した場合にのみ出力が表示されることを期待していましたが、この方法では常に表示されます。

5
rpk

以下が当てはまる場合、上で投稿した出力は$wpdb->print_error()の予想される動作です -

  • マルチサイトではなく、単一のサイトを運営している
  • $wpdb->suppress_errorsがfalseに設定されている
  • $wpdb->show_errorsがfalseに設定されている

あなたのコードの外見から、あなたはすべてのそれらの条件を満たします。

また、以前にオフにしていない限り、デフォルトで$wpdb->show_errorstrueに設定されているので、$wpdb->show_errors()を呼び出す必要はありません。

DBエラーがあるときだけ何かを出力するには、次の2つのうちの1つを行うことができます -

1 - エラーを出力してログに追加する

$wpdb->print_error()メソッドは、画面に出力するだけでなく、エラーをログに記録します。これが望ましい動作(推奨)であれば、これを行うことができます -

if($wpdb->last_error !== '') :
    $wpdb->print_error()
endif;

2 - エラーを出力しますが、ログに記録しません

エラーをログに記録したくない場合は、独自のmy_print_error()関数を追加して、$wpdb->print_error()の代わりにそれを使用することができます -

function my_print_error(){

    global $wpdb;

    if($wpdb->last_error !== '') :

        $str   = htmlspecialchars( $wpdb->last_result, ENT_QUOTES );
        $query = htmlspecialchars( $wpdb->last_query, ENT_QUOTES );

        print "<div id='error'>
        <p class='wpdberror'><strong>WordPress database error:</strong> [$str]<br />
        <code>$query</code></p>
        </div>";

    endif;

}
15
David Gard