问题描述

当我尝试这样的东西

    $status = NULL;

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

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

当然列可以为 NULL 。我也测试了 $ wpdb-> 查询和 $ wpdb-> 准备,结果是一样的。我做错了吗?

最佳解决方案

更新:

自 WordPress 4.4 。现在由 insertupdatereplacedelete wpdbwpdb 方法得到支持,而 #15158 的票已经被封闭。

感谢 @dmsnell 的 commenting 关于该更新。

另一方面,wpdb::prepare()中的 null 支持目前在门票 #12819 中作为 wontfix 关闭。

以前的答案:

不支持 NULL

看起来你必须编写自己的自定义 SQL 来更新 NULL 的值。

目前,$wpdb->prepare()不支持 NULL,它通过 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###'

次佳解决方案

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

format
(array|string) (optional) An array of formats to be mapped to each of the value in $data. If string, that format will be used for all of the values in $data. If omitted, all values in $data will be treated as strings unless otherwise specified in wpdb::$field_types.

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

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

Possible format values: %s as string; %d as integer (whole number) and %f as float. (See below for more information.) If omitted, all values in $where will be treated as strings.

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

您可以 read through the source 并制定出该过程。

如果您劫持 wpdb->prepare 方法 (在定期清除擦除的开发者服务器上):) 在返回之前转储 SQL,您将看到替换发生在 wpdb->prepare 之前:

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

尽管如 @birgire 所建议的那样,对于 prepare 来说,这可能是一个限制。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。