$wpdb non inserisce NULL nella colonna della tabella

5 mag 2014, 16:01:47
Visualizzazioni: 17K
Voti: 15

Quando provo a fare qualcosa come questo:

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

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

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

0
Tutte le risposte alla domanda 3
1
12

Aggiornamento:

A partire da WordPress 4.4, questo è ora supportato dai metodi insert, update, replace e delete di wpdb e il ticket #15158 è stato chiuso come risolto.

Grazie a @dmsnell per aver commentato questo aggiornamento.

D'altra parte, il supporto per null in wpdb::prepare() è attualmente chiuso come non verrà risolto nel ticket #12819.

Risposta precedente:

NULL non supportato:

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

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

Dai un'occhiata a questi ticket Trac aperti:

Questi ticket hanno circa 4 anni, quindi non trattenere il fiato in attesa che venga aggiunto al core ;-)

Dovresti dare un'occhiata al codice sorgente come suggerito da @s_ha_dum.

Una possibile soluzione alternativa:

Se ti senti avventuroso puoi provare quanto segue con il filtro query:

    // Aggiungi un filtro per sostituire la stringa 'NULL' con NULL
    add_filter( 'query', 'wpse_143405_query' );

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

    // Rimuovi il filtro:
    remove_filter( 'query', 'wpse_143405_query' );

dove

/**
 * Sostituisce la stringa 'NULL' con NULL
 * 
 * @param  string $query
 * @return string $query
 */

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

Potresti voler usare una stringa più univoca di 'NULL' da sostituire, ad esempio '###NULL###'.

5 mag 2014 17:48:19
Commenti

il supporto per l'impostazione di NULL è stato aggiunto in r34737, quindi non è più necessario alcun workaround

dmsnell dmsnell
12 lug 2016 01:47:19
0

wpdb->update tratta per impostazione predefinita tutti i tipi di dati come stringhe.

format
(array|string) (opzionale) Un array di formati da mappare a ciascun valore in $data. Se è una stringa, quel formato verrà usato per tutti i valori in $data. Se omesso, tutti i valori in $data saranno trattati come stringhe a meno che non sia specificato diversamente in wpdb::$field_types.

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

Puoi specificare un formato, ma gli specificatori consentiti sono:

Valori di formato possibili: %s come stringa; %d come intero (numero intero) e %f come float. (Vedi sotto per maggiori informazioni.) Se omesso, tutti i valori in $where saranno trattati come stringhe.

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

Puoi leggere il codice sorgente e capire il processo.

Se modifichi il metodo wpdb->prepare (su un server di sviluppo che viene periodicamente ripulito :) ) per visualizzare l'SQL appena prima del return, vedrai che la sostituzione avviene prima di wpdb->prepare:

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

Tuttavia, come suggerito da @birgire, potrebbe essere un limite di prepare ad aver causato quella sostituzione.

5 mag 2014 17:48:54
0

Vorrei approfondire come eseguire questa operazione in WP 4.4 e versioni successive. È necessario impostare sia l'elemento dati che il formato che si desidera siano nulli su un valore PHP 'null'.

L'esempio nel ticket #15158 è il seguente:

$wpdb->update($ttable, 
              [
                'user_id' => NULL,  // Imposta user_id a NULL
                'status' => 'available',  // Imposta lo stato a 'available'
                'update_time' => $now->format('Y-m-d H:i:s')  // Formatta la data corrente
              ], [
                'therapist_id' => $therapist_id,  // Condizione: therapist_id
                'user_id' => $user_id,           // Condizione: user_id
                'start_time' => $ub['start_time']  // Condizione: start_time
              ], [
                 NULL,   // Formato per user_id (NULL)
                 '%s',   // Formato per status (stringa)
                 '%s'    // Formato per update_time (stringa)
              ], [
                 '%d',   // Formato per therapist_id (intero)
                 '%d',   // Formato per user_id (intero)
                 '%s'    // Formato per start_time (stringa)
            ]);
26 nov 2017 21:23:52