it-swarm.com.de

WPDB einfügen oder falls vorhanden aktualisieren

Ich bin mit WPDB oder SQL im Allgemeinen nicht verrückt, aber ich habe eine benutzerdefinierte Tabelle für mein Projekt und ich versuche, ihr einige Metadaten zuzuweisen. Was ich "möchte" ist, wenn eine Zeile existiert, aktualisieren und wenn nicht, einfügen. Ich habe sowohl Insert als auch Update im WPDB Codex gelesen, bin aber auch nicht wirklich in eine "entweder" oder "Situation" geraten. Ich dachte, ich könnte mit update arbeiten, also sieht mein Code bisher so aus:

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

Hat WordPress so etwas wie ein "WENN vorhanden, Update, ELSE Einfügen" oder muss ich benutzerdefiniertes SQL ausführen, um dies zu erreichen, oder muss ich zuerst die Datenbank abfragen, um festzustellen, ob eine ID in meiner Tabelle vorhanden ist, und dann entscheiden, ob eine Aktualisierung durchgeführt werden soll es oder legen Sie es ein?

18
Howdy_McGee

Erstens verwenden Sie prepare falsch. Sie scheinen die Argumente von $wpdb->update so in $wpdb->prepare eingebunden zu haben. Das geht nicht Tatsächlich übergeben Sie update ein einzelnes Argument - die Ausgabe von prepare. Versuchen Sie etwas Einfaches wie das Folgende und Sie werden sehen, warum das nicht funktioniert:

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

Und $wpdb->update() läuft prepare für Sie .

Zweitens, wenn ich das wäre, überspringe ich die Hilfsfunktion bloat und schreibe eine richtige ON DUPLICATE KEY UPDATE-Abfrage:

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

Dies setzt voraus, dass post_id ein UNIQUE INDEX ODER PRIMARY KEY ist. Wenn Ihre Tabellenstruktur so ist, wie ich denke, lassen Sie die Datenbank damit umgehen.

20
s_ha_dum

Haben Sie versucht, $wpdb->replace. Laut WP Codex:

Ersetzen Sie eine Zeile in einer Tabelle, falls vorhanden, oder fügen Sie eine neue Zeile in eine Tabelle ein, falls die Zeile noch nicht vorhanden war.

Ich habe mich in einigen Plugins ausprobiert und es funktioniert, wenn versucht wird, Fehler durch Duplizieren von eindeutigen IDs usw. zu vermeiden.

Weitere Infos im Codex

16
e-crespo

Sie sollten zuerst prüfen, ob die Zeile vorhanden ist.

Höchstwahrscheinlich möchten Sie versuchen, die ID oder den Primärschlüssel für die Zeile abzurufen, die Sie aktualisieren möchten, und dann $wpdb->update, falls dies der Fall ist, oder $wpdb->insert, falls dies nicht der Fall ist

0
felipelavinz