Отображение ошибок при обновлении через $wpdb
Я использую $wpdb->update
для обновления пользовательской таблицы в моей базе данных. Когда я выполняю var_dump
результата, он возвращает:
int(0)
Поэтому я попробовал использовать $wpdb->print_error()
, чтобы увидеть, что не так. Однако он ничего не показывает. Я также попробовал $wpdb->show_errors()
, но опять же ничего не отобразилось.
Документация wpdb не содержит подробностей о том, как использовать эти функции, поэтому я не уверен, правильно ли я их использую. Но почему результат обновления таблицы возвращает 0 и не показывает никаких ошибок?
Отображение ошибок:
$wpdb->show_errors = true
автоматически показывает ошибки, еслиWP_DEBUG
установлен вtrue
.$wpdb->suppress_errors = false
отключает подавление ошибок.Для мультисайтов требуется особый подход
// Отображение ошибок в мультисайте: global $wpdb, $blog_id; // Функции is_multisite() не существует, поэтому проверяем ID // Это означает, что по умолчанию мы не можем отлаживать блог с ID 1 как MU-блог // Проверяем, находимся ли мы не на блоге с ID#1, и если да, проверяем определения и добавляем обработку ошибок if ( 1 !== $blog_id ) ! defined( 'DIEONDBERROR' ) AND define( 'DIEONDBERROR', true );
Обработка результатов
Метод $wpdb->update()
имеет три разных варианта результата. Для проверки необходимо сохранить результат в переменную: $result = $wpdb->update( /* ... */ );
.
Варианты обработки:
false === $result
: Ошибка0 === $result
: Успех, но без обновлений0 < $result
: Успех
Вывод информации из класса
$wpdb->last_error
покажет последнюю ошибку, если она была.$wpdb->last_query
поможет отобразить последний запрос (где произошла ошибка). Фактически аналогичноarray_pop( $wpbd->queries );
.
Важное замечание (безопасность)
НЕ добавляйте этот код на рабочий сайт. Особенно если используются плагины кеширования. Это может раскрыть важные данные БД перед посетителями!
Если иного выхода нет: всегда оборачивайте код в условные конструкции, чтобы предотвратить публичный вывод отладочной информации!
// Пример
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 .= 'Последняя ошибка: ';
$output .= var_export( $wpdb->last_error, true );
$output .= "\n\nПоследний запрос: ";
$output .= var_export( $wpdb->last_query, true );
if ( false === $result )
{
$result = new WP_Error( 'query_failed', 'Нет обновления.', $data );
}
elseif ( 0 === $result )
{
$result = new WP_Error( 'update_failed', 'Обновлено ноль строк.', $data );
}
elseif ( 0 < $result )
{
$result = 'Успех';
}
$output .= '</pre>';
// Прерываем только при ошибке
is_wp_error( $result )
AND exit( $output.$result->get_error_message() );
}
}
Раскрытие объекта $wpdb
может также раскрыть имя пользователя и пароль вашей базы данных!

Я рекомендую выполнить следующий код сразу после вашего запроса, чтобы увидеть, что происходит:
exit( var_dump( $wpdb->last_query ) );
Это должно вывести последний запрос, который был выполнен в вашей базе данных. В подобных случаях я обычно вручную запускаю такой запрос через phpMyAdmin, чтобы убедиться, что он выполняется без ошибок и действительно влияет на базу данных. Кроме того, увидев сам запрос, вы можете обнаружить проблемы в нём, которые возникают из-за вашего кода. Например, запрос может не возвращать ошибок MySQL, но при этом выполнять совсем не то, что вы ожидаете. С этим кодом для отладки вы хотя бы сможете увидеть, что именно выполняется, и продолжить по замечательному пути отладки! Дополнительно, вы можете изучить другие "переменные класса" (Справка Codex) для $wpdb
, так как они могут помочь в дальнейшем решении вашей проблемы.

Нулевой ответ означает, что ни одна строка не была затронута, что отличается от ошибки.
Трудно сказать без просмотра вашего запроса, почему строки не обновляются. Один из инструментов отладки, который можно попробовать — установить значение "SAVEQUERIES
" в true в файле wp-config.php.
После выполнения запроса попробуйте сделать var_dump
для $wpdb->queries
.
