De ce $wpdb nu inserează NULL în coloana tabelului

5 mai 2014, 16:01:47
Vizualizări: 17K
Voturi: 15

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?

0
Toate răspunsurile la întrebare 3
1
12

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.

5 mai 2014 17:48:19
Comentarii

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

dmsnell dmsnell
12 iul. 2016 01:47:19
0

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 în wpdb::$field_types.

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

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.

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

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.

5 mai 2014 17:48:54
0

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'
            ]);
26 nov. 2017 21:23:52