WPDB Insert or if exists Atualizar

13

Eu não sou louco familiarizado com o WPDB ou SQL em geral, mas eu tenho uma tabela personalizada para o meu projeto e estou tentando atribuir alguns metadados para ele. O que eu gostaria de acontecer é se uma linha existir, atualizá-la e, se não, inseri-la. Eu li tanto Insert e Update no WPDB Codex, mas nem realmente entrou em uma situação "ou". Eu pensei que poderia trabalhar com atualização, então meu código até agora é assim:

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

O WordPress tem algo parecido com um "IF existe Update, ELSE Insert", ou eu preciso executar o SQL personalizado para conseguir isso, ou eu preciso consultar o banco de dados primeiro para ver se existe um ID na minha tabela? se deseja atualizá-lo ou inseri-lo?

    
por Howdy_McGee 20.05.2014 / 22:14

3 respostas

16

Primeiro, você está usando prepare incorretamente. Você parece ter os argumentos de $wpdb->update envolvidos em $wpdb->prepare desse jeito. Isso não vai funcionar. De fato, você está passando update um único argumento-- a saída de prepare . Experimente algo simples como o seguinte e você verá por que isso não funcionará:

$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)
  )
);

E $wpdb->update() runs prepare para você .

Em segundo lugar, se este fosse eu, eu pulo o inchaço da função de ajuda e escrevo uma consulta ON DUPLICATE KEY UPDATE adequada:

$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);

Isso pressupõe que post_id seja um UNIQUE index ou PRIMARY KEY . Se sua estrutura de tabela é o que eu acho que é, deixe o banco de dados lidar com isso.

    
por s_ha_dum 21.05.2014 / 15:09
12

Você já tentou $wpdb->replace . De acordo com o WP Codex:

Substitua uma linha em uma tabela, se existir, ou insira uma nova linha em uma tabela, se a linha ainda não existir.

Eu tentei em alguns plugins e ele faz o trabalho ao tentar evitar erros de duplicação de IDs únicos, etc.

Mais informações no códice

    
por e-crespo 05.09.2014 / 01:39
0

Você deve verificar se a linha existe primeiro.

É mais provável que você queira tentar obter o ID ou a chave primária da linha que você está tentando atualizar, então $wpdb->update , se o fizer, ou $wpdb->insert dela não funcionar

    
por felipelavinz 20.05.2014 / 22:40