$ wpdb tablo sütununa NULL eklemez


13

Böyle bir şey denediğimde

    $status = NULL;

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

'Durum' sütununda şimdi boş bir dize var '', sadece NULL olarak ayarlanmaz.

Sütun elbette NULL olabilir. Ben de $ wpdb-> sorgu ve $ wpdb-> hazırlamak test ettik ve sonuçları aynı. Yanlış bir şey mi yapıyorum?

Yanıtlar:


9

Güncelleme:

WordPress 4.4'ten beri. Bu artık destekleniyor insert, update, replaceve deleteyöntemleri wpdbve bilet # 15158 olarak kapatıldı sabit .

Bu güncelleme hakkında yorum yaptığı için @ dmsnell'e teşekkürler .

Öte yandan, nulldestek wpdb::prepare()şu anda # 12819 biletinde alışkanlık olarak kapalı .

Önceki cevap:

NULL desteklenmiyor:

Değeri güncellemek için kendi özel SQL'inizi yazmanız gerekecek gibi görünüyor NULL.

Şu anda NULLtarafından desteklenmiyor $wpdb->prepare(), bu giriş vsprintf biçimlendirme işlevi aracılığıyla gerçekleştiriliyor .

Bu açık Trac biletlerine göz atın:

Bu biletler yaklaşık 4 yaşında, bu yüzden çekirdek ;-) tarafından desteklenene kadar nefesimi tutmayacağım.

@S_ha_dum önerdiği gibi kaynağa bir göz atmalısınız.

Olası bir geçici çözüm:

Maceracıysanız, queryfiltreyle aşağıdakileri deneyebilirsiniz :

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

nerede

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

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

Bunun yerine 'NULL'değiştirmek yerine daha benzersiz bir dize kullanmak isteyebilirsiniz '###NULL###'.


2
ayar desteği r34737'deNULL eklendi , bu nedenle artık bir geçici çözüme gerek yok
dmsnell

3

wpdb->update varsayılan olarak tüm veri türleri için bir dize kullanır.

format
(dizi | dize) (isteğe bağlı) $ data içindeki değerin her birine eşlenecek format dizisi. Dize ise, bu biçim $ data içindeki tüm değerler için kullanılır. Atlanırsa, $ verilerindeki tüm değerler, aksi belirtilmedikçe dize olarak değerlendirilir wpdb::$field_types.

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

Bir biçim belirtebilirsiniz, ancak izin verilen belirteçler:

Olası biçim değerleri :% s dize; Tam sayı olarak% d (tam sayı) ve kayan nokta olarak% f. (Daha fazla bilgi için aşağıya bakın.) Atlanırsa, $ içindeki tüm değerler dize olarak değerlendirilir.

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

Kaynaktan okuyabilir ve işlemi çözebilirsiniz .

Geri wpdb->preparedönüşten hemen önce SQL'i dökmek için yöntemi (periyodik olarak temizlenen dev bir sunucuda :)) hack ederseniz , değiştirmenin daha önce gerçekleştiğini göreceksiniz wpdb->prepare:

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

@Birgire tarafından önerildiği gibi, bu değiştirme talebinde bulunanın bir sınırı olabilir prepare.


2

Bunu WP 4.4 ve ötesinde nasıl yapacağınızı daha fazla açıklamak istiyorum. Boş olmasını istediğiniz veri ve biçim öğesini bir PHP 'boş' değerine ayarlamanız gerekir.

15158 numaralı biletin örneği aşağıdaki gibidir:

$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'
            ]);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.