Menampilkan kesalahan dengan pembaruan $ wpdb

21

Saya menggunakan $wpdb->updateuntuk memperbarui tabel kustom yang saya miliki di database saya. Ketika saya var_dumphasilnya kembali:

int(0)

Jadi saya mencoba $wpdb->print_error()melihat apa yang salah. Namun, itu tidak menunjukkan apa-apa. Saya juga mencoba $wpdb->show_errors(), tetapi sekali lagi tidak menunjukkan apa-apa.

Dokumen wpdb tidak menjelaskan secara rinci tentang cara menggunakan fungsi-fungsi ini, jadi saya tidak yakin apakah saya menggunakannya dengan benar. Tetapi mengapa hasil memperbarui tabel mengembalikan 0, dan tidak menunjukkan kesalahan?

Jarred
sumber

Jawaban:

21

Saya akan merekomendasikan menjalankan kode berikut tepat setelah permintaan Anda untuk melihat apa yang terjadi:

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

Ini akan mencetak kueri terakhir yang mengenai basis data Anda. Dalam kasus-kasus seperti ini, saya biasanya akan secara manual menjalankan query seperti itu melalui phpMyAdmin untuk melihat apakah ia berjalan tanpa kesalahan dan untuk melihat apakah itu mempengaruhi database. Selain itu, dengan melihat kueri yang sebenarnya dijalankan, Anda mungkin menemukan masalah dalam kueri yang dihasilkan dari kode Anda. Misalnya, kueri mungkin tidak mengembalikan kesalahan MySQL, tetapi bisa menjalankan kueri yang berbeda dari yang Anda harapkan. Dengan kode debug ini, Anda setidaknya dapat melihat apa itu dan melanjutkan jejak debug yang luar biasa! Lebih jauh, Anda mungkin ingin menjelajahi lebih banyak "Variabel Kelas" ( Codex Ref ) untuk $wpdbkarena mereka dapat membantu lebih lanjut memecahkan masalah Anda.

tollmanz
sumber
1
Wow sudah mencari ini
K. Kilian Lindberg
itu hanya ditampilkan SHOW FULL COLUMNS FROM `` dalam kasus saya
Adi Prasetyo
22

Tampilkan kesalahan:

  • $wpdb->show_errors = truemenunjukkan kesalahan secara otomatis, jika WP_DEBUGdiatur ke true.
  • $wpdb->suppress_errors = false berhenti menekan kesalahan.

  • Multisite memerlukan perawatan khusus

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

Penanganan keluaran

The $wpdb->update()metode memiliki tiga output yang berbeda. Untuk memeriksa terhadap itu, Anda harus menyimpan hasil besarbesaran var: $result = $wpdb->update( /* ... */ );.

Menangani skenario tersebut:

  • false === $result: Gagal
  • 0 === $result: Berhasil, tetapi tidak ada pembaruan
  • 0 < $result: Sukses

Output kelas

  • $wpdb->last_error akan menampilkan kesalahan terakhir, jika ada.
  • $wpdb->last_queryakan membantu Anda menampilkan kueri terakhir (di mana kesalahan terjadi). Pada dasarnya sama dengan array_pop( $wpbd->queries );.

Penting (keamanan) Catatan

Tolong JANGAN tambahkan kode ini di situs langsung. Terutama tidak jika plugin caching terlibat. Ini dapat mengekspos data penting terkait DB ke pengunjung !

Jika Anda tidak dapat melakukan sebaliknya: selalu bungkus kode Anda dalam pernyataan bersyarat untuk mencegah publik menghadapi hasil debug!

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

Mengekspos $wpdbobjek juga dapat mengekspos nama pengguna dan kata sandi database Anda!

kaisar
sumber
1
ini jawaban yang luar biasa! Membaca ini membuat saya kembali ke WordPress Codex dan membaca lebih lanjut tentang $ wpdb secara umum. Sekali lagi terima kasih atas jawabannya.
clockwiseq
Lebih dari Luar Biasa dalam penjelasan ...
Vishal Kumar Sahu
4

Respons nol berarti nol baris yang terpengaruh, yang berbeda dari kesalahan.

Sulit mengatakannya tanpa melihat permintaan Anda mengapa tidak ada baris yang diperbarui. Satu alat debug yang dapat Anda coba adalah pengaturan "SAVEQUERIES " ke true di file wp-config.php Anda.

Kemudian setelah berjalan permintaan Anda, cobalah var_dumping $wpdb->queries.

lempengan emas
sumber
3
$wpdb->show_errors();
$wpdb->print_error();
Emil
sumber
2

Coba ini sebelum permintaan Anda:

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

atau mungkin ini setelah kueri Anda:

if ($wpdb->last_error) {
  die('error=' . var_dump($wpdb->last_query) . ',' . var_dump($wpdb->error));
}
Volomike
sumber