$wpdb non inserisce NULL nella colonna della tabella
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?
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###'
.

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

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 inwpdb::$field_types
.
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.
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.

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)
]);
