$ wpdb no insertará NULL en la columna de la tabla

10

Cuando intento algo como esto

    $status = NULL;

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

En la columna 'estado' ahora tengo una cadena vacía '' , simplemente no la establecerá en NULL.

La columna puede ser NULA por supuesto. También he probado $ wpdb- > query y $ wpdb- > prepare y los resultados son los mismos. ¿Estoy haciendo algo mal?

    
pregunta Dejan Stosic 05.05.2014 - 15:01

3 respuestas

8

Actualización:

Desde WordPress 4.4. ahora es compatible con los métodos insert , update , replace y delete de wpdb y el ticket # 15158 se ha cerrado como se corrigió .

Gracias a @dmsnell por comentando sobre esa actualización.

Por otra parte, el soporte null en wpdb::prepare() está actualmente cerrado como wontfix en el ticket # 12819 .

Respuesta anterior:

NULL no es compatible:

Parece que tendrá que escribir su propio SQL personalizado para actualizar el valor con NULL .

Actualmente NULL no es compatible con $wpdb->prepare() , que lleva la entrada a través de vsprintf función de formato.

Echa un vistazo a estas entradas abiertas de Trac:

Estas entradas tienen aproximadamente 4 años, por lo que no contendría la respiración hasta que el núcleo las respalde ;-)

Debería echar un vistazo a la fuente como se sugiere @s_ha_dum.

Una posible solución:

Si eres aventurero, puedes probar lo siguiente con el 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' );

donde

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

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

Es posible que desee utilizar una cadena más exclusiva que 'NULL' para reemplazar, tal vez '###NULL###' en su lugar.

    
respondido por el birgire 05.05.2014 - 16:48
3

wpdb->update por defecto es una cadena para todos los tipos de datos.

  
    

formato
        (array | cadena) (opcional) Una matriz de formatos a ser asignados a cada uno de los valores en $ data. Si es una cadena, ese formato será usado para     todo     Los valores en $ datos. Si se omite, todos los valores en $ data serán tratados     como cadenas a menos que se especifique lo contrario en wpdb::$field_types .

  
     

enlace

Puede especificar un formato, pero los especificadores permitidos son:

  
    

Valores de formato posibles :% s como cadena; % d como entero (número entero) y     % f como flotador. (Consulte a continuación para obtener más información). Si se omite, todos los valores     en $ donde serán tratados como cadenas.

  
     

enlace

Puede leer la fuente y elaborar el proceso.

Si piratea el método wpdb->prepare (en un servidor dev que se limpia de forma periódica :)) para volcar el SQL antes de la devolución, verá que el reemplazo ocurre antes de wpdb->prepare :

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

Aunque, como lo sugiere @birgire, puede ser un límite a prepare lo que provocó ese reemplazo.

    
respondido por el s_ha_dum 05.05.2014 - 16:48
2

Me gustaría explicar con más detalle cómo hacer esto en WP 4.4 y más allá. Debe establecer los datos y el elemento de formato que desea que sea nulo a un valor 'nulo' de PHP.

El ejemplo en el ticket # 15158 es el siguiente:

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

Lea otras preguntas en las etiquetas