Отображение ошибок при обновлении через $wpdb

5 мая 2011 г., 04:42:02
Просмотры: 53.6K
Голосов: 27

Я использую $wpdb->update для обновления пользовательской таблицы в моей базе данных. Когда я выполняю var_dump результата, он возвращает:

int(0)

Поэтому я попробовал использовать $wpdb->print_error(), чтобы увидеть, что не так. Однако он ничего не показывает. Я также попробовал $wpdb->show_errors(), но опять же ничего не отобразилось.

Документация wpdb не содержит подробностей о том, как использовать эти функции, поэтому я не уверен, правильно ли я их использую. Но почему результат обновления таблицы возвращает 0 и не показывает никаких ошибок?

0
Все ответы на вопрос 5
2
28

Отображение ошибок:

  • $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 может также раскрыть имя пользователя и пароль вашей базы данных!

12 авг. 2011 г. 21:22:47
Комментарии

это потрясающий ответ! Прочитав это, я вернулся к WordPress Codex и изучил больше информации о $wpdb в целом. Еще раз спасибо за такой подробный ответ.

clockwiseq clockwiseq
7 июн. 2015 г. 19:33:18

Объяснение более чем потрясающее...

Vishal Kumar Sahu Vishal Kumar Sahu
2 апр. 2017 г. 22:39:53
2
26

Я рекомендую выполнить следующий код сразу после вашего запроса, чтобы увидеть, что происходит:

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

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

5 мая 2011 г. 08:02:53
Комментарии

Вау, я как раз это искал

K. Kilian Lindberg K. Kilian Lindberg
19 мар. 2014 г. 15:36:41

у меня просто отображается SHOW FULL COLUMNS FROM ``

Adi Prasetyo Adi Prasetyo
26 февр. 2019 г. 07:50:58
0

Нулевой ответ означает, что ни одна строка не была затронута, что отличается от ошибки.

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

После выполнения запроса попробуйте сделать var_dump для $wpdb->queries.

5 мая 2011 г. 05:28:08
0
$wpdb->show_errors(); // Показать ошибки базы данных
$wpdb->print_error();  // Вывести ошибку базы данных
2 мар. 2012 г. 18:04:03
0

Попробуйте это перед вашим запросом:

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

или возможно это после вашего запроса:

if ($wpdb->last_error) {
  die('error=' . var_dump($wpdb->last_query) . ',' . var_dump($wpdb->error));
}
16 апр. 2012 г. 22:21:45