Почему $wpdb->show_errors() и print_error() выводят сообщение даже если запрос выполняется корректно?

23 февр. 2015 г., 12:18:45
Просмотры: 111K
Голосов: 15

Пытаясь разобраться со следующей проблемой, см. https://wordpress.stackexchange.com/questions/178995/sanitize-a-working-query-string-by-using-wpdb-prepare-fails-with-mysql-db-er, я столкнулся с довольно странным поведением. Даже когда мой запрос был правильным и показывал верный результат.

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_errors и print_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

Но почему? Я ожидал, что вывод будет показан только если что-то пойдет не так, например ошибка или предупреждение, но в данном случае что-то показывается постоянно.

0
Все ответы на вопрос 1
2
34

Приведённый выше вывод является ожидаемым поведением для $wpdb->print_error(), если выполняются следующие условия:

  • Вы используете одиночный сайт, а не мультисайт
  • $wpdb->suppress_errors установлен в false
  • $wpdb->show_errors установлен в false

Судя по вашему коду, все эти условия соблюдаются.

Также обратите внимание, что если вы ранее не отключали их, $wpdb->show_errors по умолчанию установлен в true, поэтому вам не нужно вызывать $wpdb->show_errors().

Чтобы выводить сообщения только при ошибках в базе данных, вы можете сделать одно из двух:

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:</strong> [$str]<br />
        <code>$query</code></p>
        </div>";

    endif;

}

Последнее редактирование: Исправлена синтаксическая ошибка

23 февр. 2015 г. 13:51:29
Комментарии

Возвращает пустую строку в $str и $query

User User
15 июл. 2018 г. 13:36:09

Сообщение об ошибке находится в $wpdb->last_error, а не в $wpdb->last_result.

Martin_W Martin_W
12 дек. 2018 г. 05:04:09