Pokazuje błędy przy aktualizacji $ wpdb

21

Używam $wpdb->updatedo aktualizacji niestandardowej tabeli, którą mam w mojej bazie danych. Kiedy I var_dumpwynik zwraca:

int(0)

Próbowałem $wpdb->print_error()więc zobaczyć, co jest nie tak. Jednak nic nie pokazuje. Próbowałem też $wpdb->show_errors(), ale znowu nic nie pokazałem.

Dokumenty wpdb nie zawierają zbyt szczegółowych informacji na temat korzystania z tych funkcji, więc nie jestem pewien, czy korzystam z nich poprawnie. Ale dlaczego wynik aktualizacji tabeli zwraca 0 i nie pokazuje żadnych błędów?

Jarred
źródło

Odpowiedzi:

21

Zalecam uruchomienie następującego kodu bezpośrednio po zapytaniu, aby zobaczyć, co się dzieje:

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

To powinno wydrukować ostatnie zapytanie, które trafiło do twojej bazy danych. W takich przypadkach zazwyczaj ręcznie uruchomię takie zapytanie za pośrednictwem phpMyAdmin, aby sprawdzić, czy działa ono bez błędów i czy w ogóle wpływa na bazę danych. Dodatkowo, widząc zapytanie, które zostało faktycznie uruchomione, możesz znaleźć problemy w zapytaniu, które wynikają z twojego kodu. Na przykład zapytanie może nie zwrócić żadnych błędów MySQL, ale może uruchomić zapytanie inne niż się spodziewasz. Dzięki temu kodowi debugowania będziesz przynajmniej mógł zobaczyć, co to jest i kontynuować wspaniałą ścieżkę debugowania! Co więcej, możesz chcieć odkryć więcej „Zmiennych klas” ( Kodeks ref ), $wpdbponieważ mogą one pomóc w dalszym rozwiązywaniu problemu.

tollmanz
źródło
1
Wow tego szukałem
K. Kilian Lindberg
to po prostu pokazuje SHOW FULL COLUMNS FROM `` w moim przypadku
Adi Prasetyo
22

Pokaż błędy:

  • $wpdb->show_errors = truewyświetla błędy automatycznie, jeśli WP_DEBUGjest ustawiony na true.
  • $wpdb->suppress_errors = false przestaje tłumić błędy.

  • Multisite wymaga specjalnego traktowania

    // 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 );

Obsługa danych wyjściowych

$wpdb->update()Sposób ma trzy wyjścia. Aby sprawdzić czy przeciwko niej, trzeba zapisać wynik ia var: $result = $wpdb->update( /* ... */ );.

Obsługa tych scenariuszy:

  • false === $result: Zawieść
  • 0 === $result: Sukces, ale brak aktualizacji
  • 0 < $result: Sukces

Wyjście klasy

  • $wpdb->last_error pokaże ci ostatni błąd, jeśli go masz.
  • $wpdb->last_querypomoże ci pokazać ostatnie zapytanie (gdzie wystąpił błąd). Jest w zasadzie taki sam jak array_pop( $wpbd->queries );.

Ważna uwaga (bezpieczeństwo)

Proszę nie NIE dodać to kody na żywo miejscu. Zwłaszcza jeśli nie dotyczy to wtyczek buforujących. Może to ujawnić odwiedzającym ważne dane związane z DB !

Jeśli nie możesz zrobić inaczej: zawsze zawijaj kod w instrukcje warunkowe, aby uniknąć publicznego debugowania danych wyjściowych!

// 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() );
    }
}

Ujawnienie $wpdbobiektu może również ujawnić nazwę użytkownika i hasło do bazy danych!

kajzer
źródło
1
to niesamowita odpowiedź! Po przeczytaniu tego wróciłem do Kodeksu WordPress i ogólnie poczytałem więcej o $ wpdb. Jeszcze raz dziękuję za szczegółową odpowiedź.
zgodnie z ruchem wskazówek zegara
Więcej niż niesamowite w wyjaśnieniach ...
Vishal Kumar Sahu
4

Odpowiedź zerowa oznacza dotknięcie zerowych wierszy, co różni się od błędu.

Trudno powiedzieć bez spojrzenia na zapytanie, dlaczego żadne wiersze nie są aktualizowane. Jednym z narzędzi do debugowania, które możesz wypróbować, jest ustawienie SAVEQUERIEStrue dla pliku wp-config.php.

Następnie po swoich tras zapytania, spróbuj var_dumping $wpdb->queries.

Złote Jabłka
źródło
3
$wpdb->show_errors();
$wpdb->print_error();
Emil
źródło
2

Wypróbuj to przed zapytaniem:

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

a może po zapytaniu:

if ($wpdb->last_error) {
  die('error=' . var_dump($wpdb->last_query) . ',' . var_dump($wpdb->error));
}
Volomike
źródło