$ wpdb는 테이블 열에 NULL을 삽입하지 않습니다.


13

이런 식으로 시도하면

    $status = NULL;

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

'상태'열에 이제 빈 문자열 ''이 있으며 단순히 NULL로 설정하지 않습니다.

열은 물론 NULL 일 수 있습니다. 또한 $ wpdb-> query 및 $ wpdb-> prepare를 테스트했으며 결과는 동일합니다. 내가 뭔가 잘못하고 있습니까?

답변:


9

최신 정보:

WordPress 4.4 이후 이것은 현재 지원되고 insert, update, replacedelete방법 wpdb과 표 # 15158는 클로우즈되어 고정 .

해당 업데이트에 대한 의견 을 보내 주신 @dmsnell에게 감사드립니다 .

반면, null지원 은 티켓 # 12819의 wontfixwpdb::prepare()현재 닫혀 있습니다.

이전 답변 :

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
설정 NULL에 대한 지원 이 r34737 에 추가 되었으므로 더 이상 해결 방법이 필요 없습니다.
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리턴하기 직전에 SQL을 덤프하기 위해 메소드 를 해킹하면 (주기적으로 정리 된 dev 서버 :)) 대체가 이전에 발생하는 것을 볼 수 있습니다 wpdb->prepare.

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

@birgire가 제안한 것처럼 prepare교체를 유도하는 데 한계가있을 수 있습니다 .


2

WP 4.4 이상 에서이 작업을 수행하는 방법을 추가로 설명하고 싶습니다. 널 (null)이 되려는 data 및 format 요소를 모두 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.