$ wpdb non inserirà NULL nella colonna della tabella


13

Quando provo qualcosa del genere

    $status = NULL;

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

Nella colonna 'status' ora ho una stringa vuota '', semplicemente non la imposterà su NULL.

La colonna può essere ovviamente NULL. Ho anche testato $ wpdb-> query e $ wpdb-> prepararsi e i risultati sono gli stessi. Sto facendo qualcosa di sbagliato?

Risposte:


9

Aggiornare:

Da WordPress 4.4. questo è ora supportato dai insert, update, replacee deletemetodi di wpdbe il biglietto # 15158 è stato chiuso come fisso .

Grazie a @dmsnell per aver commentato quell'aggiornamento .

D'altra parte, il nullsupporto in wpdb::prepare()è attualmente chiuso come wontfix nel ticket # 12819 .

Risposta precedente:

NULL non supportato:

Sembra che dovrai scrivere il tuo SQL personalizzato per aggiornare il valore NULL.

Attualmente NULLnon è supportato da $wpdb->prepare(), che accetta l'input tramite la funzione di formattazione vsprintf .

Dai un'occhiata a questi biglietti Trac aperti:

Questi biglietti hanno circa 4 anni, quindi non trattengo il respiro fino a quando questo non viene supportato dal core ;-)

Dovresti dare un'occhiata alla fonte come suggerito da @s_ha_dum.

Una possibile soluzione alternativa:

Se sei avventuroso, puoi provare quanto segue con il queryfiltro:

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

dove

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

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

Potresti voler usare una stringa più unica di quella 'NULL'da sostituire, forse '###NULL###'invece.


2
il supporto per l'impostazione è NULLstato aggiunto in r34737 , quindi non è più necessario un
rimedio

3

wpdb->update il valore predefinito è una stringa per tutti i tipi di dati.

format
(array | string) (opzionale) Un array di formati da mappare su ciascuno dei valori in $ data. Se stringa, quel formato verrà utilizzato per tutti i valori in $ data. Se omesso, tutti i valori in $ data saranno trattati come stringhe se non diversamente specificato in wpdb::$field_types.

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

È possibile specificare un formato ma gli identificatori consentiti sono:

Possibili valori di formato :% s come stringa; % d come numero intero (numero intero) e% f come valore a virgola mobile. (Vedi sotto per maggiori informazioni.) Se omesso, tutti i valori in $ dove saranno trattati come stringhe.

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

Puoi leggere la fonte ed elaborare il processo.

Se modifichi il wpdb->preparemetodo (su un server dev che viene periodicamente ripulito :)) per scaricare l'SQL prima del ritorno, vedrai che la sostituzione avviene prima wpdb->prepare:

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

Tuttavia, come suggerito da @birgire, potrebbe essere un limite a prepareciò che ha richiesto tale sostituzione.


2

Vorrei spiegare ulteriormente come farlo in WP 4.4 e oltre. È necessario impostare sia i dati che l'elemento di formato che si desidera essere nulli su un valore "null" di PHP.

L'esempio nel ticket n. 15158 è il seguente:

$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'
            ]);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.