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

10

Quando eu tento algo assim

    $status = NULL;

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

Na coluna 'status' agora eu tenho uma string vazia '' , ela simplesmente não irá definir como NULL.

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

    
por Dejan Stosic 05.05.2014 / 15:01

3 respostas

8

Atualização:

Desde o WordPress 4.4. Agora, isso é suportado pelos métodos insert , update , replace e delete de wpdb e o ticket # 15158 foi fechado como corrigido .

Obrigado a @dmsnell por comentando sobre essa atualização.

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

Resposta anterior:

NULL não suportado:

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

Atualmente, NULL não é suportado por $wpdb->prepare() , que recebe a entrada por meio do vsprintf

Confira estes ingressos abertos do Trac:

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

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

Uma possível solução alternativa:

Se você é aventureiro, pode tentar o seguinte com o filtro query :

    // 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 string mais original que 'NULL' para substituir, talvez '###NULL###' .

    
por birgire 05.05.2014 / 16:48
3

wpdb->update é padronizado para uma string para todos os tipos de dados.

  
    

format
        (array | string) (opcional) Uma matriz de formatos a serem mapeados para cada um dos valores em $ data. Se string, esse formato será usado para     tudo de     os valores em $ data. Se omitido, todos os valores em $ data serão tratados     como strings , a menos que especificado em contrário em wpdb::$field_types .

  
     

enlace

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

  
    

Valores de formato possíveis :% s como string; % d como inteiro (número inteiro) e     % f como float. (Veja abaixo para mais informações). Se omitido, todos os valores     em $ onde serão tratados como strings.

  
     

enlace

Você pode ler a fonte e elaborar o processo.

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

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

Embora, como sugerido por @birgire, pode muito bem ser um limite para prepare que motivou essa substituição.

    
por s_ha_dum 05.05.2014 / 16:48
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 você deseja que sejam nulos para um valor PHP 'nulo'.

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'
            ]);
    
por Mario Hendricks 26.11.2017 / 20:23

Tags