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


13

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 NULL, por supuesto. También probé $ wpdb-> query y $ wpdb-> prepare y los resultados son los mismos. ¿Estoy haciendo algo mal?

Respuestas:


9

Actualizar:

Desde WordPress 4.4. esto ahora se apoya en los insert, update, replacey deletemétodos de wpdby el boleto # 15158 ha sido cerrado como fijo .

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

Por otro lado, el nullsoporte en wpdb::prepare()está actualmente cerrado como wontfix en el ticket # 12819 .

Respuesta anterior:

NULL No soportado:

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

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

Echa un vistazo a estos boletos abiertos de Trac:

Estas entradas tienen aproximadamente 4 años, así que no aguantaría la respiración hasta que el núcleo lo apoye ;-)

Deberías echar un vistazo a la fuente como @s_ha_dum sugirió.

Una posible solución alternativa:

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

dónde

/**
 * 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 única que 'NULL'para reemplazar, tal '###NULL###'vez en su lugar.


2
El soporte para la configuración NULLse agregó en r34737 , por lo que ya no hay necesidad de una solución alternativa
dmsnell

3

wpdb->update el valor predeterminado es una cadena para todos los tipos de datos.

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

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

Puede especificar un formato pero los especificadores permitidos son:

Posibles valores de formato :% s como cadena; % d como entero (número entero) y% f como flotante. (Consulte a continuación para obtener más información). Si se omite, todos los valores en $ where se tratarán como cadenas.

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

Puede leer la fuente y resolver el proceso.

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

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

Sin embargo, como lo sugirió @birgire, puede ser un límite prepareque provocó ese reemplazo.


2

Me gustaría explicar más a fondo cómo hacer esto en WP 4.4 y versiones posteriores. Debe establecer tanto el elemento de datos como el formato que desea que sea nulo en un valor 'nulo' de PHP.

El ejemplo en el boleto # 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'
            ]);
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.