$ wpdb não irá inserir NULL na coluna da tabela

13

Quando tento algo parecido com isto

    $status = NULL;

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

Na coluna 'status' agora eu tenho uma string vazia '', ela simplesmente não a define como NULL.

A coluna pode ser NULL, é claro. Também testei $ wpdb-> query e $ wpdb-> prepare e os resultados são os mesmos. Estou fazendo algo errado?

Dejan Stosic
fonte

Respostas:

9

Atualizar:

Desde o WordPress 4.4. este é agora suportado pelos insert, update, replacee deletemétodos de wpdbe o bilhete # 15158 foi fechado como fixo .

Agradecemos a @dmsnell por comentar sobre essa atualização.

Por outro lado, o nullsuporte em wpdb::prepare()está atualmente fechado como wontfix no ticket # 12819 .

Resposta anterior:

NULL não suportado:

Parece que você precisará escrever seu próprio SQL personalizado para atualizar o valor NULL.

Atualmente NULLnão é suportado por $wpdb->prepare(), que recebe a entrada através da função de formatação vsprintf .

Confira estes ingressos Trac abertos:

Esses ingressos têm cerca de 4 anos, então eu não prendi a respiração até que isso seja apoiado pelo núcleo ;-)

Você deve dar uma olhada na fonte, como @s_ha_dum sugeriu.

Uma possível solução alternativa:

Se você é aventureiro, tente o seguinte com o queryfiltro:

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

Onde

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

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

Você pode querer usar uma sequência mais exclusiva do 'NULL'que substituir, talvez em '###NULL###'vez disso.

Birgire
fonte
2
suporte para configuração NULLfoi adicionado em r34737 , por isso não há mais qualquer necessidade de uma solução alternativa
dmsnell
3

wpdb->update o padrão é uma sequência para todos os tipos de dados.

formato
(matriz | sequência) (opcional) Uma matriz de formatos a serem mapeados para cada valor em $ data. Se string, esse formato será usado para todos os valores em $ data. Se omitido, todos os valores em $ data serão tratados como cadeias, a menos que seja especificado de outra forma wpdb::$field_types.

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

Você pode especificar um formato, mas os especificadores permitidos são:

Valores possíveis de formato :% s como string; % d como inteiro (número inteiro) e% f como flutuante. (Veja abaixo para obter mais informações.) Se omitido, todos os valores em $ where serão tratados como seqüências de caracteres.

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

Você pode ler a fonte e elaborar o processo.

Se você hackear o wpdb->preparemétodo (em um servidor de desenvolvimento que é limpo periodicamente :)) para despejar o SQL antes do retorno, verá que a substituição ocorre antes wpdb->prepare:

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

Embora, como sugerido por @birgire, possa muito bem ser um limite para o prepareque levou à substituição.

s_ha_dum
fonte
2

Gostaria de explicar melhor como fazer isso no WP 4.4 e além. Você precisa definir os dados e o elemento de formato que deseja que sejam nulos para um valor 'nulo' do PHP.

O exemplo no ticket # 15158 é o seguinte:

$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
fonte