Показ помилок із оновленням $ wpdb


21

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

int(0)

Тому я спробував $wpdb->print_error()зрозуміти, що не так. Однак це нічого не показує. Я також спробував $wpdb->show_errors(), але знову нічого не показав.

Документи wpdb не розглядають багато деталей щодо використання цих функцій, тому я не впевнений, чи правильно я їх використовую. Але чому в результаті оновлення таблиці повертається 0, а не відображаються помилки?

Відповіді:


21

Я рекомендую запустити наступний код відразу після запиту, щоб побачити, що відбувається:

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

Це має надрукувати останній запит, який потрапив у вашу базу даних. У таких випадках, як правило, я вручну запускаю такий запит через phpMyAdmin, щоб перевірити, чи працює він без помилок, і побачити, чи впливає це навіть на базу даних. Крім того, побачивши фактично запущений запит, ви можете виявити проблеми у запиті, що випливає з вашого коду. Наприклад, запит не може повертати помилки MySQL, але він може запустити запит, який відрізняється від очікуваного. За допомогою цього коду налагодження ви, принаймні, зможете побачити, що це таке, і продовжувати чудовий слід налагодження! Крім того, ви можете вивчити більше "змінних класів" ( Codex Ref ), $wpdbоскільки вони можуть допомогти в подальшому вирішити проблему.


1
Нічого цього не шукав
К. Кіліан Ліндберг

це просто показати SHOW FULL COLUMNS FROM `` в моєму випадку
Аді Прасетьо,

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()Метод має три різних виходів. Щоб перевірити його, потрібно зберегти результат ia var : $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 Codex і прочитати більше про $ wpdb взагалі. Ще раз дякую за глибоку відповідь.
за годинниковою стрілкоюq

Більше ніж дивовижне пояснення ...
Вішал Кумар Саху

4

Нульова відповідь означає нульові рядки, які постраждали, що відрізняється від помилки.

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

Потім після запуску запиту спробуйте var_dumpін $wpdb->queries.



2

Спробуйте це перед запитом:

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

або, можливо, це після вашого запиту:

if ($wpdb->last_error) {
  die('error=' . var_dump($wpdb->last_query) . ',' . var_dump($wpdb->error));
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.