こんなときに
$status = NULL;
$wpdb->update(
'table',
array(
'status' => $status,
),
array( 'id' => 1 )
);
'status'列に、空の文字列''
があるので、単にNULLに設定しません。
列はもちろんNULLでもかまいません。 $ wpdb-> queryと$ wpdb-> prepareもテストしましたが、結果は同じです。私は何か悪いことをしていますか?
WordPress 4.4以降これはinsert
のupdate
、replace
、delete
およびwpdb
メソッドでサポートされ、チケット #15158 は fixed としてクローズされました。
その更新について コメント - の@dmsnellに感謝します。
一方、wpdb::prepare()
のnull
サポートは現在チケットでは wontfix としてクローズされています #12819 。
前回の回答:
NULL
はサポートされていません。NULL
で値を更新するためにあなた自身のカスタムSQLを書かなければならないように見えます。
現在NULL
は$wpdb->prepare()
によってサポートされていません。これは vsprintf format関数を介して入力を受け取ります。
これらのオープン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
はデフォルトですべてのデータ型の文字列になります。
フォーマット
(array | string)(オプション)$ dataの各値にマップされるフォーマットの配列。 stringの場合、そのフォーマットは$ data内のすべての値に使用されます。 省略すると、$ data内のすべての値は文字列として扱われます _wpdb::$field_types
で特に指定されていない限り。
フォーマットを指定できますが、指定可能な指定子は次のとおりです。
指定可能なフォーマット値 :%s文字列。整数(整数)としての%dと浮動小数点としての%f。省略した場合、$ whereのすべての値は文字列として扱われます。
あなたは ソースを読み通すことができます そしてプロセスを解決することができます。
リターンの直前にSQLをダンプするためにwpdb->prepare
メソッド(定期的にクリーンになる:)をハックすると、置換はwpdb->prepare
の前に行われることがわかります。
string(48) "UPDATE `table` SET `status` = %s WHERE `id` = %s"
しかし、@ birgireが示唆しているように、その置き換えを促したのはprepare
の限界かもしれません。
これを行う方法をWP 4.4以降でさらに説明します。 nullにするデータとフォーマット要素の両方を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'
]);