$ wpdb จะไม่แทรก NULL ลงในคอลัมน์ตาราง


13

เมื่อฉันลองทำอะไรแบบนี้

    $status = NULL;

    $wpdb->update(
            'table',
            array( 
                'status' => $status,
            ), 
            array( 'id' => 1 ) 
    );

ในคอลัมน์ 'สถานะ' ตอนนี้ฉันมีสตริงว่างเปล่า''มันจะไม่ตั้งเป็น NULL

คอลัมน์สามารถเป็นค่า NULL แน่นอน ฉันได้ทดสอบ $ wpdb-> query และ $ wpdb-> เตรียมพร้อมแล้วและผลลัพธ์ก็เหมือนกัน ฉันกำลังทำอะไรผิดหรือเปล่า?

คำตอบ:


9

ปรับปรุง:

ตั้งแต่ WordPress 4.4 นี้ได้รับการสนับสนุนในขณะนี้โดยinsert, update, replaceและdeleteวิธีการwpdbและตั๋ว# 15158ได้รับการปิดถาวร

ขอบคุณ @dmsnell สำหรับความคิดเห็นเกี่ยวกับการอัปเดตนั้น

บนมืออื่น ๆ ที่nullสนับสนุนในการwpdb::prepare()ปิดให้บริการในปัจจุบันเป็น wontfixในตั๋ว# 12819

คำตอบก่อนหน้า:

NULL ไม่รองรับ:

ดูเหมือนว่าคุณจะต้องมีการเขียน SQL NULLที่กำหนดเองของคุณเองเพื่อปรับปรุงค่าด้วย

ขณะนี้NULLยังไม่รองรับโดย$wpdb->prepare()ใช้อินพุตจากฟังก์ชันการจัดรูปแบบvsprintf

ตรวจสอบตั๋ว Trac ที่เปิดอยู่เหล่านี้:

ตั๋วเหล่านี้มีอายุประมาณ 4 ปีดังนั้นฉันจะไม่กลั้นลมหายใจจนกว่าจะได้รับการสนับสนุนจากแกน ;-)

คุณควรตรวจสอบแหล่งที่มาตามที่ @s_ha_dum แนะนำ

วิธีแก้ปัญหาที่เป็นไปได้:

หากคุณชอบผจญภัยคุณสามารถลองใช้queryตัวกรองต่อไปนี้:

    // Add a filter to replace the 'NULL' string with NULL
    add_filter( 'query', 'wpse_143405_query' );

    global $wpdb;
    $wpdb->update(
        'table',
        array( 
            'status' => 'NULL',
        ), 
        array( 'id' => 1 ) 
    );

    // Remove the filter again:
    remove_filter( 'query', 'wpse_143405_query' );

ที่ไหน

/**
 * Replace the 'NULL' string with NULL
 * 
 * @param  string $query
 * @return string $query
 */

function wpse_143405_query( $query )
{
    return str_ireplace( "'NULL'", "NULL", $query ); 
}

คุณอาจต้องการใช้สตริงที่ไม่ซ้ำกันมากกว่า'NULL'แทนที่อาจจะ'###NULL###'แทน


2
การสนับสนุนสำหรับการตั้งค่าNULLถูกเพิ่มเข้ามาในr34737ดังนั้นจึงไม่จำเป็นต้องมีวิธีแก้ปัญหาอีกต่อไป
dmsnell

3

wpdb->update เริ่มต้นที่สตริงสำหรับทุกประเภทข้อมูล

format
(array | string) (เป็นทางเลือก) อาร์เรย์ของรูปแบบที่จะถูกแมปกับแต่ละค่าในข้อมูล $ หากสตริงรูปแบบนั้นจะถูกใช้สำหรับค่าทั้งหมดในข้อมูล $ หากละเว้นค่าทั้งหมดใน $ ข้อมูลจะได้รับการปฏิบัติเป็นสตริงwpdb::$field_typesนอกจากที่ระบุไว้ใน

http://codex.wordpress.org/Class_Reference/wpdb#UPDATE_rows

คุณสามารถระบุรูปแบบได้ แต่ตัวระบุที่ใช้ได้คือ:

ค่ารูปแบบที่เป็นไปได้ :% s เป็นสตริง % d เป็นจำนวนเต็ม (จำนวนเต็ม) และ% f เป็นจำนวนลอย (ดูข้อมูลเพิ่มเติมด้านล่าง) หากไม่ระบุค่าทั้งหมดใน $ จะถือเป็นสตริง

http://codex.wordpress.org/Class_Reference/wpdb#UPDATE_rows

คุณสามารถอ่านได้จากแหล่งที่มาและดำเนินการตามกระบวนการ

หากคุณแฮ็คwpdb->prepareวิธี (บนเซิร์ฟเวอร์ dev ที่ได้รับการทำความสะอาดเป็นระยะ ๆ :)) เพื่อดัมพ์ SQL ก่อนก่อนที่จะส่งคืนคุณจะเห็นว่าการแทนที่เกิดขึ้นก่อนwpdb->prepare:

string(48) "UPDATE `table` SET `status` = %s WHERE `id` = %s"

แม้ว่าตามที่แนะนำโดย @birgire มันอาจเป็นข้อ จำกัดprepareที่แจ้งให้มีการแทนที่


2

ฉันต้องการอธิบายเพิ่มเติมเกี่ยวกับวิธีการทำเช่นนี้ใน WP 4.4 ขึ้นไป คุณต้องตั้งค่าทั้งข้อมูลและองค์ประกอบรูปแบบที่คุณต้องการให้เป็นค่า Null ของ PHP

ตัวอย่างในตั๋ว# 15158มีดังนี้:

$wpdb->update($ttable, 
              [
                'user_id' => NULL,
                'status' => 'available',
                'update_time' => $now->format('Y-m-d H:i:s')
              ], [
                'therapist_id' => $therapist_id,
                'user_id' => $user_id,
                'start_time' => $ub['start_time']
              ], [
                 NULL,
                 '%s',
                 '%s'
              ], [
                 '%d',
                 '%d',
                 '%s'
            ]);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.