De ce $wpdb nu inserează NULL în coloana tabelului
Când încerc ceva de genul:
$wpdb->update(
'table',
['status' => NULL], // Încerc să setez valoarea NULL
['id' => 1]
);
În coloana status
acum am un șir gol ''
, pur și simplu nu setează NULL.
Coloana poate fi NULL, desigur. Am testat și cu $wpdb->query
și $wpdb->prepare
și rezultatele sunt aceleași. Fac ceva greșit?

Actualizare:
Începând cu WordPress 4.4, această funcționalitate este acum suportată de metodele insert
, update
, replace
și delete
ale clasei wpdb
, iar tichetul #15158 a fost închis cu statutul rezolvat.
Mulțumim lui @dmsnell pentru comentariul despre această actualizare.
Pe de altă parte, suportul pentru null
în wpdb::prepare()
este în prezent marcat ca wontfix în tichetul #12819.
Răspuns anterior:
NULL
nesuportat:
Se pare că va trebui să scrii propriul tău cod SQL personalizat pentru a actualiza valoarea cu NULL
.
În prezent, NULL
nu este suportat de $wpdb->prepare()
, care preia datele de intrare prin funcția de formatare vsprintf.
Consultă aceste tichete Trac deschise:
Aceste tichete au aproximativ 4 ani vechime, așa că nu aș ține respirația până când această funcționalitate va fi suportată în nucleu ;-)
Ar trebui să arunci o privire la sursă, așa cum a sugerat @s_ha_dum.
O soluție posibilă:
Dacă ești aventuros, poți încerca următoarea metodă cu filtrul query
:
// Adaugă un filtru pentru a înlocui șirul 'NULL' cu NULL
add_filter( 'query', 'wpse_143405_query' );
global $wpdb;
$wpdb->update(
'table',
array(
'status' => 'NULL',
),
array( 'id' => 1 )
);
// Elimină filtrul după utilizare:
remove_filter( 'query', 'wpse_143405_query' );
unde
/**
* Înlocuiește șirul 'NULL' cu NULL
*
* @param string $query
* @return string $query
*/
function wpse_143405_query( $query )
{
return str_ireplace( "'NULL'", "NULL", $query );
}
Poți dori să folosești un șir mai unic decât 'NULL'
pentru înlocuire, poate '###NULL###'
în schimb.

suportul pentru setarea NULL
a fost adăugat în r34737, așa că nu mai este nevoie de nicio soluție alternativă

wpdb->update
utilizează implicit șir de caractere pentru toate tipurile de date.
format
(array|string) (opțional) Un array de formate care să fie mapate fiecărei valori din $data. Dacă este un șir, acel format va fi utilizat pentru toate valorile din $data. Dacă este omis, toate valorile din $data vor fi tratate ca șiruri de caractere cu excepția cazului în care este specificat altfel înwpdb::$field_types
.
Puteți specifica un format, dar specificatorii permisi sunt:
Valori posibile pentru format: %s pentru șir de caractere; %d pentru întreg (număr întreg) și %f pentru float. (Mai jos găsiți mai multe informații.) Dacă este omis, toate valorile din $where vor fi tratate ca șiruri de caractere.
Puteți parcurge codul sursă și să înțelegeți procesul.
Dacă modificați metoda wpdb->prepare
(pe un server de dezvoltare care este șters periodic :) ) pentru a afișa SQL-ul chiar înainte de return, veți vedea că înlocuirea are loc înainte de wpdb->prepare
:
string(48) "UPDATE `table` SET `status` = %s WHERE `id` = %s"
Cu toate acestea, așa cum a sugerat @birgire, este posibil să fie o limitare a prepare
care a determinat această înlocuire.

Vreau să explic mai în detaliu cum se face acest lucru în WordPress 4.4 și versiunile ulterioare. Trebuie să setați atât elementul de date, cât și formatul pe care doriți să le fie null, la valoarea PHP 'null'.
Exemplul din tichetul #15158 este următorul:
$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'
]);
