$ wpdb tidak akan memasukkan NULL ke dalam kolom tabel

13

Ketika saya mencoba sesuatu seperti ini

    $status = NULL;

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

Di kolom 'status' sekarang saya memiliki string kosong '', itu tidak akan mengaturnya ke NULL.

Kolomnya bisa NULL tentunya. Saya juga telah menguji $ wpdb-> query dan $ wpdb-> mempersiapkan dan hasilnya sama. Apakah saya melakukan sesuatu yang salah?

Dejan Stosic
sumber

Jawaban:

9

Memperbarui:

Sejak WordPress 4.4. ini sekarang didukung oleh insert, update, replacedan deletemetode wpdbdan tiket # 15.158 telah ditutup sebagai diperbaiki .

Terima kasih kepada @dmsnell karena berkomentar tentang pembaruan itu.

Di sisi lain, nulldukungan di wpdb::prepare()saat ini ditutup sebagai wontfix di tiket # 12819 .

Jawaban sebelumnya:

NULL tidak didukung:

Sepertinya Anda harus menulis SQL sendiri untuk memperbarui nilainya NULL.

Saat NULLini tidak didukung oleh $wpdb->prepare(), yang mengambil input melalui fungsi format vsprintf .

Lihat tiket Trac terbuka ini:

Tiket ini berusia sekitar 4 tahun, jadi saya tidak akan menahan nafas sampai ini didukung oleh inti ;-)

Anda harus melihat sumbernya seperti yang disarankan @s_ha_dum.

Solusi yang mungkin:

Jika Anda berjiwa petualang, Anda dapat mencoba yang berikut dengan queryfilter:

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

dimana

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

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

Anda mungkin ingin menggunakan string yang lebih unik daripada 'NULL'mengganti, mungkin '###NULL###'sebagai gantinya.

birgire
sumber
2
dukungan untuk pengaturan NULLtelah ditambahkan di r34737 , sehingga tidak ada lagi kebutuhan untuk penyelesaian masalah
dmsnell
3

wpdb->update default ke string untuk semua tipe data.

format
(array | string) (opsional) Array format yang akan dipetakan ke masing-masing nilai dalam $ data. Jika string, format itu akan digunakan untuk semua nilai dalam $ data. Jika dihilangkan, semua nilai dalam $ data akan diperlakukan sebagai string kecuali ditentukan lain dalam wpdb::$field_types.

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

Anda dapat menentukan format tetapi specifier yang diizinkan adalah:

Nilai format yang mungkin :% s sebagai string; % d sebagai bilangan bulat (bilangan bulat) dan% f sebagai float. (Lihat di bawah untuk informasi lebih lanjut.) Jika dihilangkan, semua nilai dalam $ di mana akan diperlakukan sebagai string.

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

Anda dapat membaca sumbernya dan mengerjakan prosesnya.

Jika Anda meretas wpdb->preparemetode (pada server dev yang dihapus secara berkala :)) untuk membuang SQL sebelum sebelum kembali, Anda akan melihat bahwa penggantian terjadi sebelum wpdb->prepare:

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

Padahal, seperti yang disarankan oleh @birgire, mungkin itu adalah batas untuk prepareyang meminta penggantian itu.

s_ha_dum
sumber
2

Saya ingin menjelaskan lebih lanjut bagaimana melakukan ini di WP 4.4 dan selanjutnya. Anda perlu mengatur elemen data dan format yang Anda inginkan menjadi nol untuk nilai PHP 'nol'.

Contoh di tiket # 15158 adalah sebagai berikut:

$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'
            ]);
Mario Hendricks
sumber