$ wpdb nie wstawi wartości NULL do kolumny tabeli

13

Kiedy próbuję czegoś takiego

    $status = NULL;

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

W kolumnie „status” mam teraz pusty ciąg '', po prostu nie ustawi go na NULL.

Kolumna może oczywiście mieć wartość NULL. Przetestowałem również $ wpdb-> zapytanie i $ wpdb-> przygotowanie, a wyniki są takie same. Czy robię coś źle?

Dejan Stosic
źródło

Odpowiedzi:

9

Aktualizacja:

Od WordPress 4.4. to jest teraz obsługiwana przez insert, update, replaceoraz deletemetod wpdbi biletu # 15158 został zamknięty jako stałe .

Dzięki @dmsnell za komentowanie tej aktualizacji.

Z drugiej strony nullwsparcie w wpdb::prepare()jest obecnie zamknięte jako wontfix w bilecie # 12819 .

Poprzednia odpowiedź:

NULL Nieobsługiwany:

Wygląda na to, że będziesz musiał napisać własny niestandardowy kod SQL, aby zaktualizować wartość NULL.

Obecnie NULLnie jest obsługiwany przez $wpdb->prepare(), który pobiera dane wejściowe za pomocą funkcji formatowania vsprintf .

Sprawdź te otwarte bilety Trac:

Bilety te mają około 4 lat, więc nie wstrzymywałbym oddechu, dopóki nie zostanie to wsparte przez rdzeń ;-)

Powinieneś spojrzeć na źródło, jak sugerował @s_ha_dum.

Możliwe obejście:

Jeśli masz ochotę na przygodę, możesz wypróbować następujące queryfiltry:

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

gdzie

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

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

Być 'NULL'może '###NULL###'zamiast tego możesz chcieć użyć bardziej unikalnego ciągu niż do zamiany .

birgire
źródło
2
obsługa ustawień NULLzostała dodana w r34737 , więc nie ma już potrzeby obejścia tego problemu
dmsnell,
3

wpdb->update domyślnie ciąg znaków dla wszystkich typów danych.

format
(tablica | ciąg) (opcjonalnie) Tablica formatów do odwzorowania na każdą wartość w danych $. Jeśli ciąg znaków, ten format zostanie użyty dla wszystkich wartości w danych $. Jeśli zostanie pominięty, wszystkie wartości w danych $ będą traktowane jak łańcuchy, chyba że określono inaczej w wpdb::$field_types.

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

Możesz określić format, ale dozwolone specyfikatory to:

Możliwe wartości formatu :% s jako ciąg; % d jako liczba całkowita (liczba całkowita), a% f jako liczba zmiennoprzecinkowa. (Aby uzyskać więcej informacji, patrz poniżej). W przypadku pominięcia wszystkie wartości w $ gdzie będą traktowane jak łańcuchy.

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

Możesz przeczytać źródło i opracować proces.

Jeśli zhakujesz wpdb->preparemetodę (na serwerze dewelopera, który jest okresowo czyszczony :)), aby zrzucić SQL przed tuż przed powrotem, zobaczysz, że zamiana nastąpi wcześniej wpdb->prepare:

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

Chociaż, jak sugeruje @birgire, może to być granica, preparektóra skłoniła tę wymianę.

s_ha_dum
źródło
2

Chciałbym wyjaśnić, jak to zrobić w WP 4.4 i późniejszych wersjach. Musisz ustawić zarówno element danych, jak i format, który ma być pusty, na wartość PHP „null”.

Przykład na bilecie nr 15158 jest następujący:

$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'
            ]);
Mario Hendricks
źródło