问题描述
当我尝试这样的东西
$status = NULL;
$wpdb->update(
'table',
array(
'status' => $status,
),
array( 'id' => 1 )
);
在’status’ 列中,现在我有一个空字符串''
,它根本不会将其设置为 NULL 。
当然列可以为 NULL 。我也测试了 $ wpdb-> 查询和 $ wpdb-> 准备,结果是一样的。我做错了吗?
最佳解决方案
更新:
自 WordPress 4.4 。现在由 insert
,update
,replace
和 delete
wpdb
的 wpdb
方法得到支持,而 #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 inwpdb::$field_types
.
您可以指定格式,但允许的说明符是:
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.
您可以 read through the source 并制定出该过程。
如果您劫持 wpdb->prepare
方法 (在定期清除擦除的开发者服务器上):) 在返回之前转储 SQL,您将看到替换发生在 wpdb->prepare
之前:
string(48) "UPDATE `table` SET `status` = %s WHERE `id` = %s"
尽管如 @birgire 所建议的那样,对于 prepare
来说,这可能是一个限制。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。