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?

Howdy_McGee
la source

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.

s_ha_dum
la source
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

e-crespo
la source
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

felipelavinz
la source
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