WPDB 삽입 또는 존재하는 경우


21

나는 일반적으로 WPDB 또는 SQL에 익숙하지 않지만 프로젝트에 대한 사용자 정의 테이블이 있으며 메타 데이터를 할당하려고합니다. 내가 원하는 "행"은 행이 존재하면 업데이트하고 삽입하지 않으면 발생하는 것입니다. WPDB 코덱에서 삽입과 업데이트를 모두 읽었지만 실제로 "또는"상황에 빠지지는 않았습니다. 업데이트로 작업 할 수 있다고 생각 했으므로 지금까지 내 코드는 다음과 같습니다.

$wpdb->update(
    $wpdb->prepare(
        $wpdb->prefix.'item_info',
        array(
            'post_id'       => $post_id,
            'item_stock'    => $item_stock
        ),
        array('post_id' => $post_id)
    )
);

WordPress에 "IF 존재 업데이트, ELSE 삽입"과 같은 것이 있거나이를 수행하기 위해 사용자 지정 SQL을 실행해야합니까, 또는 먼저 데이터베이스에 쿼리하여 ID가 ​​내 테이블에 존재하는지 확인해야합니까? 삽입하거나 삽입 하시겠습니까?

답변:


23

먼저, prepare잘못 사용하고 있습니다 . 당신은 갖고있는 것 같다 $wpdb->update'에 싸여 인수이야 $wpdb->prepare그런를. 작동하지 않습니다. 실제로 update단일 인수 인의 출력을 전달 합니다 prepare. 다음과 같은 간단한 것을 시도하면 왜 작동하지 않는지 알 수 있습니다.

$post_id = 123;
$item_stock = 567;
var_dump(
  $wpdb->prepare(
    $wpdb->prefix.'item_info',
    array(
        'post_id'       => $post_id,
        'item_stock'    => $item_stock
    ),
    array('post_id' => $post_id)
  )
);

그리고 당신을 위해 $wpdb->update()실행됩니다prepare .

둘째, 이것이 나이라면 도우미 함수 팽창을 건너 뛰고 적절한 ON DUPLICATE KEY UPDATE쿼리를 작성하십시오 .

$sql = "INSERT INTO {$wpdb->prefix}item_info (post_id,item_stock) VALUES (%d,%s) ON DUPLICATE KEY UPDATE item_stock = %s";
// var_dump($sql); // debug
$sql = $wpdb->prepare($sql,$post_id,$item_stock,$item_stock);
// var_dump($sql); // debug
$wpdb->query($sql);

이것은 그 가정 post_idA는 UNIQUE인덱스 나PRIMARY KEY . 테이블 구조가 내가 생각하는 것이라면 데이터베이스가 처리하도록하십시오.


이것은 정말 유용했습니다 ... 시간 내 주셔서 감사합니다 s_ha_dum!
Jake

다른 DB 오류는 없습니다. phpmyadmin에서 수동으로 쿼리를 실행하면 예상대로 작동합니다. 또한 변수가 무엇인지 확인했습니다 .. 어떤 아이디어?
trainoasis

1
post_id가 기본 키가 아닌 경우 어떻게합니까?
Mike Kormendy

18

당신이 시도 했습니까 $wpdb->replace. WP Codex에 따르면 :

행이 존재하면 테이블에 행을 바꾸거나 행이 존재하지 않으면 테이블에 새 행을 삽입하십시오.

나는 일부 플러그인에서 나 자신을 시도했고 고유 ID 중복 오류 등을 피하려고 할 때 작동합니다.

코덱스에 대한 추가 정보


사용자 지정 쿼리하지 않았다 동안이 나를 위해 일한 - 감사 대체 () 언급에 대해
trainoasis

이것이 질문에 대한 정답입니다.
Tyler Jones

6
이는 $wpdb->replace전체 레코드를 파괴적으로 덮어 쓰는 반면 $wpdb->update, $data배열에 포함 된 특정 필드 만 업데이트 한다는 점 은 주목할 가치가 있습니다.
MatthewLee

0

행이 먼저 존재하는지 확인해야합니다.

대부분의 경우 당신은, 당신은 갱신하려는 행의 ID 또는 기본 키를 얻으려고 할 것이다 $wpdb->update는 않는 경우 또는 $wpdb->insert그렇지 않은의


14
ID 또는 기본 키가 있는지 확인하는 방법의 예는 실제로 유용한 답변이 될 것입니다. 이것은 거의 질문을 반복하는 것과 같습니다.
Jake
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.