Почему $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, я столкнулся с довольно странным поведением. Даже когда мой запрос был правильным и показывал верный результат.
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
Но почему? Я ожидал, что вывод будет показан только если что-то пойдет не так, например ошибка или предупреждение, но в данном случае что-то показывается постоянно.
Приведённый выше вывод является ожидаемым поведением для $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;
}
Последнее редактирование: Исправлена синтаксическая ошибка
