WPDB Insert ou s'il existe Mise à jour

13

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 aucun n'est vraiment entré 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 d'abord interroger la base de données pour voir si un ID existe dans ma table ALORS décider le mettre à jour ou l'insérer?

    
posée Howdy_McGee 20.05.2014 - 22:14

3 réponses

16

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 à update un seul argument - 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 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.

    
réponse donnée s_ha_dum 21.05.2014 - 15:09
12

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 le travail est fait pour éviter les erreurs de duplication d'identifiants uniques, etc.

Plus d'informations dans le codex

    
réponse donnée e-crespo 05.09.2014 - 01:39
0

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

Il est fort probable que vous souhaitiez obtenir l'ID ou la clé primaire de la ligne que vous essayez de mettre à jour, puis $wpdb->update si elle le fait ou $wpdb->insert ne le fait pas

    
réponse donnée felipelavinz 20.05.2014 - 22:40

Lire d'autres questions sur les étiquettes