web-dev-qa-db-fra.com

WPDB Insert ou s'il existe Mise à jour

Je ne connais pas très bien WPDB ou SQL en général, mais j'ai un tableau personnalisé pour mon projet et j'essaie de lui attribuer des métadonnées. Ce que j'aimerais "faire", c'est si une ligne existe, la mettre à jour et sinon l'insérer. J'ai lu les deux insertions et mise à jour dans le codex WPDB, mais ni l'un ni l'autre ne sont vraiment entrés dans une situation "soit ou". Je pensais pouvoir travailler avec update, mon code ressemble donc à 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 "IF existe Update, ELSE Insert", ou dois-je exécuter un code SQL personnalisé pour y parvenir, ou dois-je interroger la base de données d'abord pour voir si un ID existe dans ma table ALORS décider de mettre à jour ou l'insérer?

18
Howdy_McGee

Tout d'abord, vous utilisez prepare de manière incorrecte. Vous semblez avoir les arguments de $wpdb->update encapsulés dans $wpdb->prepare comme ça. Ça ne marchera pas. En fait, vous transmettez à un seul argument update - la sortie de prepare. Essayez quelque chose de simple comme ci-dessous et vous verrez pourquoi cela ne fonctionne 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() exécute prepare pour vous .

Deuxièmement, s’il s’agissait de moi, je saute la fonction d'assistance gonfle et écris une requête ON DUPLICATE KEY UPDATE 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 que post_id est un UNIQUE INDEX OU PRIMARY KEY . Si votre structure de table est ce que je pense, laissez la base de données la gérer.

20
s_ha_dum

Avez-vous essayé $wpdb->replace. Selon WP Codex:

Remplacez une ligne dans une table si elle existe ou insérez une nouvelle ligne dans une table 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'identifiants uniques, etc.

Plus d'infos dans le codex

16
e-crespo

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

Très probablement, vous voudrez essayer d'obtenir l'ID ou la clé primaire de la ligne que vous essayez de mettre à jour, puis $wpdb->update si c'est le cas ou $wpdb->insert ne le fait pas

0
felipelavinz