Insertion WPDB ou mise à jour s'il existe


21

Je ne suis pas très familier avec WPDB ou SQL en général, mais j'ai une table personnalisée pour mon projet et j'essaie de lui attribuer des métadonnées. Ce que j'aimerais "se produire", c'est si une ligne existe, la mettre à jour et sinon l'insérer. J'ai lu à la fois Insérer et Mettre à jour dans le codex WPDB, mais ni l'un ni l'autre n'est vraiment entré dans une situation "non plus". Je pensais que je pouvais travailler avec la mise à jour, donc mon code ressemble jusqu'à présent à ceci:

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

WordPress a-t-il quelque chose comme une «mise à jour IF existe, une insertion ELSE», ou dois-je exécuter un SQL personnalisé pour y parvenir, ou dois-je d'abord interroger la base de données pour voir si un ID existe dans ma table PUIS décider de mettre à jour ou l'insérer?

Réponses:


23

Tout d'abord, vous utilisez prepareincorrectement. Vous semblez avoir $wpdb->updatedes arguments $wpdb->preparecomme ça. Ça ne marchera pas. En effet, vous passez updateun seul argument - la sortie de prepare. Essayez quelque chose de simple comme le suivant et vous verrez pourquoi cela ne fonctionnera pas:

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

Et $wpdb->update()court preparepour vous .

Deuxièmement, si c'était moi, je saute le ballonnement de la fonction d'assistance et j'écris une ON DUPLICATE KEY UPDATErequête appropriée :

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

Cela suppose qu'il post_ids'agit d'un UNIQUEindex ouPRIMARY KEY . Si votre structure de table correspond à ce que je pense, laissez la base de données la gérer.


C'était incroyablement utile ... Merci pour votre temps s_ha_dum!
Jake

Préparez les retours faux pour moi - pas d'autres erreurs de base de données. Si vous exécutez la requête manuellement dans phpmyadmin, cela fonctionne comme prévu. Vérifiez également que les variables sont ce qu'elles devraient être. Des idées?
trainoasis

1
Que faire si post_id n'est pas la CLÉ PRIMAIRE?
Mike Kormendy

18

As-tu essayé $wpdb->replace. Selon WP Codex:

Remplacez une ligne dans un tableau si elle existe ou insérez une nouvelle ligne dans un tableau si la ligne n'existait pas déjà.

Je me suis essayé dans certains plugins et il fait le travail en essayant d'éviter les erreurs de duplication d'ID uniques, etc.

Plus d'informations dans le codex


Cela a fonctionné pour moi alors que la requête personnalisée n'a pas fonctionné - merci d'avoir mentionné replace ()
trainoasis

Ceci est la bonne réponse à la question.
Tyler Jones

6
il convient de noter qu'il $wpdb->replaces'agit d'un écrasement destructeur de l'ensemble de l'enregistrement, alors qu'il $wpdb->updatene met à jour que les champs spécifiques inclus dans le $datatableau
MatthewLee

0

Vous devez vérifier si la ligne existe en premier.

Vous voudrez probablement essayer d'obtenir l'ID ou la clé primaire de la ligne que vous essayez de mettre à jour, alors $wpdb->updatesi c'est le cas ou si $wpdb->insertce n'est pas le cas


14
Un exemple de la façon de vérifier si l'ID ou la clé primaire existe en ferait vraiment une réponse utile. C'est presque comme réitérer la question.
Jake
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.