Inserir WPDB ou se existir Atualização


21

Não estou familiarizado com o WPDB ou SQL em geral, mas tenho uma tabela personalizada para o meu projeto e estou tentando atribuir alguns metadados a ele. O que eu gostaria que acontecesse é que, se existir uma linha, atualize-a e, se não, insira-a. Eu li tanto Insert quanto Update no WPDB Codex, mas nenhum deles realmente entrou em uma situação "ou" 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 como "SE existe atualização, inserção ELSE" ou preciso executar o SQL personalizado para conseguir isso ou preciso consultar o banco de dados primeiro para ver se existe um ID na minha tabela e, em seguida, decidir atualizar ou inseri-lo?

Respostas:


23

Primeiro, você está usando prepareincorretamente. Você parece ter $wpdb->updateos argumentos envolvidos $wpdb->preparedessa maneira. Isso não vai funcionar. Na verdade, você está passando updateum único argumento - a saída de prepare. Tente 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()corre preparepara você .

Segundo, se fosse eu, pulo a função auxiliar inchaço e escrevo uma ON DUPLICATE KEY UPDATEconsulta 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é um UNIQUEíndice ouPRIMARY KEY . Se a estrutura da sua tabela é como eu acho, deixe o banco de dados lidar com isso.


Isso foi incrivelmente útil ... Obrigado pelo seu tempo s_ha_dum!
Jake

Prepare retornos falsos para mim - nenhum outro erro de banco de dados. Se executar a consulta manualmente no phpmyadmin, funcionará conforme o esperado. Também verifiquei se as variáveis ​​são o que deveriam ser. Alguma idéia?
trainoasis 25/01

11
E se post_id não for a PRIMARY KEY?
Mike Kormendy #

18

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 plug-ins e ele funciona quando tenta evitar erros de duplicação de IDs exclusivos, etc.

Mais informações no codex


Isso funcionou para mim enquanto consulta personalizada não - obrigado por mencionar replace ()
trainoasis

Esta é a resposta correta para a pergunta.
Tyler Jones #

6
vale a pena notar que $wpdb->replaceé uma substituição destrutiva de todo o registro, enquanto $wpdb->updateapenas atualiza os campos específicos incluídos na $datamatriz
MatthewLee

0

Você deve verificar se a linha existe primeiro.

Provavelmente, você desejará tentar obter o ID ou a chave primária da linha que está tentando atualizar, $wpdb->updatese houver ou $wpdb->insertnão


14
Um exemplo de como verificar se o ID ou a chave primária existe realmente tornaria essa uma resposta útil. É quase como reiterar a pergunta.
Jake
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.