แสดงข้อผิดพลาดพร้อมการอัปเดต $ 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 ) $wpdbเนื่องจากอาจช่วยแก้ไขปัญหาของคุณเพิ่มเติม


1
ว้าวมองหาสิ่งนี้
K. Kilian Lindberg

มันแสดงให้เห็นSHOW FULL COLUMNS FROM `` ในกรณีของฉัน
Adi Prasetyo

22

แสดงข้อผิดพลาด:

  • $wpdb->show_errors = trueข้อผิดพลาดการแสดงโดยอัตโนมัติหากมีการตั้งค่าWP_DEBUGtrue
  • $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()วิธีมีสามผลที่แตกต่างกัน หากต้องการตรวจสอบกับมันคุณจะต้องบันทึกผล var $result = $wpdb->update( /* ... */ );IA:

จัดการสถานการณ์เหล่านั้น:

  • 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 โดยทั่วไป ขอขอบคุณอีกครั้งสำหรับคำตอบเชิงลึก
ตามเข็มนาฬิกา

เป็นคำอธิบายที่ยอดเยี่ยมมาก ...
Vishal Kumar Sahu

4

การตอบสนองเป็นศูนย์หมายถึงผลกระทบของศูนย์แถวซึ่งแตกต่างจากข้อผิดพลาด

เป็นการยากที่จะพูดโดยไม่ดูข้อความค้นหาของคุณว่าเพราะเหตุใดจึงไม่มีการอัปเดตแถว เครื่องมือดีบั๊กอันหนึ่งที่คุณสามารถลองได้คือการตั้งค่า " SAVEQUERIES" เป็นจริงในไฟล์ 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));
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.