Hiển thị lỗi với cập nhật $ wpdb


21

Tôi đang sử dụng $wpdb->updateđể cập nhật một bảng tùy chỉnh tôi có trong cơ sở dữ liệu của mình. Khi tôi var_dumpkết quả, nó trả về:

int(0)

Vì vậy, tôi đã cố gắng $wpdb->print_error()để xem những gì sai. Tuy nhiên, nó không cho thấy gì. Tôi cũng đã thử $wpdb->show_errors(), nhưng một lần nữa nó không cho thấy gì.

Các tài liệu wpdb không đi sâu vào chi tiết về cách sử dụng các hàm này, vì vậy tôi không chắc liệu tôi có đang sử dụng chúng một cách chính xác hay không. Nhưng tại sao kết quả cập nhật bảng lại trả về 0 và không hiển thị bất kỳ lỗi nào?

Câu trả lời:


21

Tôi khuyên bạn nên chạy mã sau ngay sau truy vấn của bạn để xem điều gì đang xảy ra:

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

Điều này sẽ in truy vấn cuối cùng đạt cơ sở dữ liệu của bạn. Trong những trường hợp như thế này, tôi thường sẽ tự chạy một truy vấn như vậy thông qua phpMyAdmin để xem nó có chạy không có lỗi hay không và để xem liệu nó có ảnh hưởng đến cơ sở dữ liệu hay không. Ngoài ra, bằng cách xem truy vấn đã thực sự chạy, bạn có thể tìm thấy sự cố trong truy vấn xuất phát từ mã của mình. Ví dụ: truy vấn có thể không trả về bất kỳ lỗi MySQL nào, nhưng nó có thể chạy một truy vấn khác với mong đợi của bạn. Với mã gỡ lỗi này, ít nhất bạn sẽ có thể thấy nó là gì và tiếp tục trên con đường gỡ lỗi tuyệt vời! Hơn nữa, bạn có thể muốn khám phá thêm về "Biến lớp" ( Codex Ref ) $wpdbvì chúng có thể giúp khắc phục sự cố của bạn.


1
Wow đã tìm kiếm điều này
K. Kilian Lindberg

nó chỉ hiển thị SHOW FULL COLUMNS FROM `` trong trường hợp của tôi
Adi Prasetyo

22

Hiển thị lỗi:

  • $wpdb->show_errors = truehiển thị lỗi tự động, nếu WP_DEBUGđược đặt thành true.
  • $wpdb->suppress_errors = false dừng việc khắc phục lỗi.

  • Multisite cần điều trị đặc biệt

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

Xử lý đầu ra

Các $wpdb->update()phương pháp có ba đầu ra khác nhau. Để kiểm tra lại nó, bạn phải lưu kết quả ia var : $result = $wpdb->update( /* ... */ );.

Việc xử lý các kịch bản:

  • false === $result: Thất bại
  • 0 === $result: Thành công, nhưng không cập nhật
  • 0 < $result: Sự thành công

Đầu ra lớp

  • $wpdb->last_error sẽ chỉ cho bạn lỗi cuối cùng, nếu bạn có một lỗi.
  • $wpdb->last_querysẽ hỗ trợ bạn hiển thị truy vấn cuối cùng (nơi xảy ra lỗi). Về cơ bản là giống như array_pop( $wpbd->queries );.

Quan trọng (bảo mật) Lưu ý

Vui lòng KHÔNG thêm mã này trên trang web trực tiếp. Đặc biệt là không nếu các plugin lưu trữ có liên quan. Điều này có thể tiết lộ dữ liệu quan trọng liên quan đến DB cho khách truy cập !

Nếu bạn không thể làm khác: luôn luôn bọc mã của bạn trong các câu lệnh có điều kiện để ngăn chặn đầu ra gỡ lỗi công khai!

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

Phơi bày $wpdbđối tượng cũng có thể làm lộ tên người dùng và mật khẩu cơ sở dữ liệu của bạn!


1
đây là một câu trả lời tuyệt vời Đọc điều này khiến tôi quay trở lại Codex WordPress và đọc thêm về $ wpdb nói chung. Cảm ơn một lần nữa cho câu trả lời sâu sắc.
clockwiseq

Hơn cả tuyệt vời trong lời giải thích ...
Vishal Kumar Sahu

4

Phản hồi bằng không có nghĩa là hàng không bị ảnh hưởng, khác với lỗi.

Thật khó để nói mà không nhìn vào truy vấn của bạn tại sao không có hàng nào được cập nhật. Một công cụ gỡ lỗi bạn có thể thử là đặt " SAVEQUERIES" thành true trong tệp wp-config.php của bạn.

Sau khi truy vấn của bạn chạy, hãy thử var_dumping $wpdb->queries.


3
$wpdb->show_errors();
$wpdb->print_error();

2

Hãy thử điều này trước khi truy vấn của bạn:

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

hoặc có lẽ điều này sau khi truy vấn của bạn:

if ($wpdb->last_error) {
  die('error=' . var_dump($wpdb->last_query) . ',' . var_dump($wpdb->error));
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.