$ wpdb sẽ không chèn NULL vào cột bảng


13

Khi tôi thử một cái gì đó như thế này

    $status = NULL;

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

Trong cột 'trạng thái' bây giờ tôi có một chuỗi trống '', đơn giản là nó sẽ không đặt nó thành NULL.

Cột có thể là NULL tất nhiên. Tôi cũng đã kiểm tra $ wpdb-> truy vấn và $ wpdb-> chuẩn bị và kết quả là như nhau. Tôi có làm điều gì sai?

Câu trả lời:


9

Cập nhật:

Kể từ WordPress 4.4. này ngay bây giờ được hỗ trợ bởi insert, update, replacedeletecác phương pháp wpdbvà vé # 15.158 đã bị đóng cửa như cố định .

Cảm ơn @dmsnell đã bình luận về bản cập nhật đó.

Mặt khác, nullhỗ trợ trong wpdb::prepare()hiện đang đóng dưới dạng wontfix trong vé # 12819 .

Câu trả lời trước:

NULL không được hỗ trợ:

Có vẻ như bạn sẽ phải viết SQL tùy chỉnh của riêng mình để cập nhật giá trị NULL.

Hiện tại NULLkhông được hỗ trợ bởi $wpdb->prepare(), có đầu vào thông qua chức năng định dạng vsprintf .

Kiểm tra các vé Trac mở này:

Những vé này khoảng 4 tuổi, vì vậy tôi sẽ không nín thở cho đến khi điều này được hỗ trợ bởi cốt lõi ;-)

Bạn nên xem nguồn như @s_ha_dum đề xuất.

Một cách giải quyết có thể:

Nếu bạn thích phiêu lưu, bạn có thể thử cách sau với querybộ lọc:

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

Ở đâu

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

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

Bạn có thể muốn sử dụng một chuỗi độc đáo hơn 'NULL'để thay thế, có lẽ '###NULL###'thay vào đó.


2
hỗ trợ cho cài đặt NULLđã được thêm vào trong r34737 , vì vậy không còn cần phải có cách giải quyết nữa
dmsnell

3

wpdb->update mặc định cho một chuỗi cho tất cả các loại dữ liệu.

định dạng
(mảng | chuỗi) (tùy chọn) Một mảng các định dạng được ánh xạ tới từng giá trị trong dữ liệu $. Nếu chuỗi, định dạng đó sẽ được sử dụng cho tất cả các giá trị trong dữ liệu $. Nếu được bỏ qua, tất cả các giá trị trong dữ liệu $ sẽ được coi là các chuỗi trừ khi có quy định khác wpdb::$field_types.

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

Bạn có thể chỉ định một định dạng nhưng các chỉ định cho phép là:

Các giá trị định dạng có thể có :% s dưới dạng chuỗi; % d là số nguyên (số nguyên) và% f là float. (Xem bên dưới để biết thêm thông tin.) Nếu bị bỏ qua, tất cả các giá trị trong $ sẽ được coi là chuỗi.

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

Bạn có thể đọc qua nguồn và tìm ra quy trình.

Nếu bạn hack wpdb->preparephương thức (trên máy chủ dev bị xóa sạch định kỳ :)) để kết xuất SQL trước khi trả về, bạn sẽ thấy sự thay thế xảy ra trước đówpdb->prepare :

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

Mặc dù, như được đề xuất bởi @birgire, nó cũng có thể là một giới hạn cho prepaređiều đó đã thúc đẩy sự thay thế đó.


2

Tôi muốn giải thích thêm về cách thực hiện điều này trong WP 4.4 và hơn thế nữa. Bạn cần đặt cả phần tử dữ liệu và định dạng mà bạn muốn là null thành giá trị 'null' của PHP.

Ví dụ trong vé số 15158 như sau:

$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'
            ]);
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.