Отображение ошибок с обновлением $ wpdb

21

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

int(0)

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

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

Jarred
источник

Ответы:

21

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

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

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

tollmanz
источник
1
Вау искал это
К. Килиан Линдберг
это просто показывает SHOW FULL COLUMNS FROM `` в моем случае
Ади Prasetyo
22

Показать ошибки:

  • $wpdb->show_errors = trueпоказывает ошибки автоматически, если WP_DEBUGустановлено значение true.
  • $wpdb->suppress_errors = false перестает подавлять ошибки.

  • Мультисайт нуждается в особом уходе

    // Show errors in Multisite:
    global $wpdb, $blog_id;
    // There's no is_multisite(), so we need to check the ID
    // This means, that we can't debug the blog with the ID 1 as MU-blog by default
    // Check if we are on Blog ID#1 and if not, check the defines and add error handling
    if ( 1 !== $blog_id )
        ! defined( 'DIEONDBERROR' ) AND define( 'DIEONDBERROR', true );

Обработка вывода

$wpdb->update()Метод имеет три различных выходов. Для того, чтобы проверить против него, вы должны сохранить результат ıA вар: $result = $wpdb->update( /* ... */ );.

Обрабатывать эти сценарии:

  • false === $result: Провал
  • 0 === $result: Успех, но без обновления
  • 0 < $result: Успех

Выход класса

  • $wpdb->last_error покажет вам последнюю ошибку, если вы ее получили.
  • $wpdb->last_queryпоможет вам с отображением последнего запроса (где произошла ошибка). Это в основном так же, как array_pop( $wpbd->queries );.

Важное (безопасность) Примечание

Пожалуйста, НЕ добавляйте эти коды на сайт. Особенно, если кеш-плагины задействованы. Это может предоставить важные данные, связанные с БД, посетителям !

Если вы не можете поступить иначе: всегда оборачивайте свой код в условные операторы, чтобы предотвратить публичный вывод отладочной информации!

// Example
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 .= 'Last Error: ';
            $output .= var_export( $wpdb->last_error, true );

            $output .= "\n\nLast Query: ";
            $output .= var_export( $wpdb->last_query, true );

            if ( false === $result )
            {
                $result = new WP_Error( 'query_failed', 'No update.', $data );
            }
            elseif ( 0 === $result )
            {
                $result = new WP_Error( 'update_failed', 'Updated zero rows.', $data );
            }
            elseif ( 0 < $result )
            {
                $result = 'Success';
            }
        $output .= '</pre>';

        // Only abort, if we got an error
        is_wp_error( $result ) 
            AND exit( $output.$result->get_error_message() );
    }
}

Экспонирование $wpdbобъекта может также раскрыть имя пользователя и пароль вашей базы данных!

кайзер
источник
1
это потрясающий ответ! Прочтение этого заставило меня вернуться к Кодексу WordPress и узнать больше о $ wpdb в целом. Еще раз спасибо за подробный ответ.
часовой стрелке
Более чем удивительно в объяснении ...
Вишал Кумар Саху
4

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

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

Затем, после выполнения запроса, попробуйте var_dumping $wpdb->queries.

goldenapples
источник
2

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

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

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

if ($wpdb->last_error) {
  die('error=' . var_dump($wpdb->last_query) . ',' . var_dump($wpdb->error));
}
Volomike
источник