$ wpdbはテーブル列にNULLを挿入しません


13

このようなことをしようとすると

    $status = NULL;

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

「ステータス」列に空の文字列があり''、単にNULLに設定されません。

列はもちろんNULLにすることができます。$ wpdb-> queryおよび$ wpdb-> prepareもテストしましたが、結果は同じです。私は何か間違っていますか?

回答:


9

更新:

WordPress 4.4以降。これは今ではサポートされているinsertupdatereplacedeleteの方法wpdbとチケット#15158としてクローズされた固定

この更新についてコメントしてくれた@dmsnellに感謝します。

一方、null中のサポートはwpdb::prepare()、現在のように閉じている WONTFIXチケットで#12819

前の答え:

NULL サポートされていません:

を使用して値を更新するには、独自のカスタムSQLを記述する必要があるようですNULL

現在NULL、ではサポートされていません。vsprintf書式設定関数を$wpdb->prepare()介して入力を受け取ります。

これらのオープン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
設定のサポートNULLr34737に追加されたため、回避策は必要なくなりました
-dmsnell

3

wpdb->update デフォルトは、すべてのデータ型の文字列です。

format
(array | string)(オプション)$ dataの各値にマップされるフォーマットの配列。文字列の場合、その形式は$ dataのすべての値に使用されます。省略した場合、$ dataのすべての値は、で特に指定されていない限り、文字列として扱われますwpdb::$field_types

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

形式を指定できますが、指定可能な指定子は次のとおりです。

可能な形式値:文字列としての%s; 整数(整数)としての%dおよび浮動小数点としての%f。(詳細については、以下を参照してください。)省略した場合、$ whereのすべての値は文字列として扱われます。

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

あなたはできるソースを読んで、プロセスをうまく。

wpdb->prepareメソッドをハックして(定期的に消去されるdevサーバーで:))、戻りの直前にSQLをダンプすると、置換が発生する前に発生することがわかりますwpdb->prepare

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

ただし、@ birgireが示唆してprepareいるように、それは置換を促したものの限界かもしれません。


2

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'
            ]);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.