$ wpdb不会在表列中插入NULL


13

当我尝试这样的事情

    $status = NULL;

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

现在在“状态”列中,我有一个空字符串'',它根本不会将其设置为NULL。

该列当然可以为NULL。我还测试了$ wpdb-> query和$ wpdb-> prepare,结果是相同的。难道我做错了什么?

Answers:


9

更新:

自WordPress 4.4起。现在insert,票证#15158已被关闭updatereplace并且已通过,和delete方法固定支持wpdb

感谢@dmsnell 对此更新发表评论

另一方面,中的null支持wpdb::prepare()当前已关闭,因为 票据#12819中的willtfix

先前的答案:

NULL 不支持:

看来您必须编写自己的自定义SQL才能使用来更新值NULL

当前NULL不支持$wpdb->prepare(),它通过vsprintf格式化功能获取输入。

查看以下打开的Trac门票:

这些票大约有4岁了,所以我不会屏住呼吸,直到得到核心支持;-)

您应该按照@s_ha_dum的建议查看源代码。

可能的解决方法:

如果您喜欢冒险,可以尝试使用以下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' );

哪里

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

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

您可能想要使用比'NULL'替换更唯一的字符串,'###NULL###'而不是替换。


2
r34737NULL中增加了对设置的支持,因此不再需要任何解决方法
dmsnell '16

3

wpdb->update 默认为所有数据类型的字符串。

format
(array | string)(可选)要映射到$ data中每个值的格式数组。如果是字符串,则该格式将用于$ data中的所有值。如果省略,则除非$另有说明,否则$ data中的所有值都将被视为字符串wpdb::$field_types

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

您可以指定格式,但允许的说明符为:

可能的格式值:%s作为字符串;%d为整数(整数),%f为浮点数。(有关更多信息,请参见下文。)如果省略,则$ w​​here中的所有值将被视为字符串。

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

您可以通读源代码并制定流程。

如果您修改wpdb->prepare方法(在定期清除干净的开发服务器上:)),以便在返回之前转储SQL,您会发现替换发生在wpdb->prepare

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

但是,正如@birgire所建议的那样,这很可能会限制prepare替换的发生。


2

我想进一步解释如何在WP 4.4及更高版本中执行此操作。您需要将希望为null的data和format元素都设置为PHP'null'值。

票证#15158中的示例如下:

$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'
            ]);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.