$wpdb不会在表列中插入空值

时间:2014-05-05 作者:Dejan Stosic

当我尝试这样的事情时

    $status = NULL;

    $wpdb->update(
            \'table\',
            array( 
                \'status\' => $status,
            ), 
            array( \'id\' => 1 ) 
    );
在“状态”列中,现在我有一个空字符串\'\', 它只是不会将其设置为NULL。

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

3 个回复
最合适的回答,由SO网友:birgire 整理而成

更新:自WordPress 4.4以来。这现在由insert, update, replacedelete 方法wpdb 还有票#15158 已关闭为已修复。

感谢@dmsnellcommenting 关于那个更新。

另一方面null 中的支持wpdb::prepare() 当前在票证中关闭为wontfix#12819.

上一个答案:

NULL 不支持:

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

目前NULL 不受支持$wpdb->prepare(), 通过vsprintf 格式化函数。

查看这些开放的Trac票证:

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

您应该按照@s\\u ha\\u 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###\' 相反

SO网友:s_ha_dum

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

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

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

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

Possible format values: %s作为字符串;%d为整数(整数),而%f为浮点。(详见下文。)如果省略,则$where中的所有值都将被视为字符串。

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

你可以read through the source 并制定出流程。

如果你破解了wpdb->prepare 方法(在定期清除的dev服务器上:)在返回之前转储SQL,您将看到替换发生在wpdb->prepare:

string(48) "UPDATE `table` SET `status` = %s WHERE `id` = %s"
不过,正如@birgire所建议的,这很可能是对prepare 这促使了更换。

SO网友:Mario Hendricks

我想在WP 4.4及更高版本中进一步解释如何做到这一点。您需要将希望为null的data和format元素都设置为PHP“null”值。

ticket中的示例#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\'
            ]);

结束

相关推荐

如何对自定义WPDB查询中的列进行计数?

如何计算自定义WPDB 查询虽然我需要不同类型的输出,但这确实有效:$sql_assoc = \"SELECT * FROM test\"; $num_cols = count((array) current($sql_assoc)); echo $num_cols; OUTPUT: 47 但我想要的是column+总输出,如下所示:471234567891011121314151617181920212223242526272829303