WPDB einfügen oder falls vorhanden aktualisieren

21

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 Sie sie und wenn nicht, fügen Sie sie ein. 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?

Howdy_McGee
quelle

Antworten:

23

Erstens verwenden Sie preparefalsch. Sie scheinen die $wpdb->updateArgumente so verpackt zu haben $wpdb->prepare. Das geht nicht Tatsächlich übergeben Sie updateein 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()rennt preparefür dich .

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

$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_ides sich um einen UNIQUEIndex oder handeltPRIMARY KEY . Wenn Ihre Tabellenstruktur so ist, wie ich denke, lassen Sie die Datenbank damit umgehen.

s_ha_dum
quelle
Das war wahnsinnig nützlich ... Danke für deine Zeit s_ha_dum!
Jake
Prepare gibt für mich false zurück - keine weiteren DB-Fehler. Wenn Sie die Abfrage manuell in phpmyadmin ausführen, funktioniert sie wie erwartet. Auch überprüft, ob Variablen sind, was sie sein sollten. Irgendwelche Ideen?
trainoasis
1
Was ist, wenn post_id nicht der PRIMARY KEY ist?
Mike Kormendy
18

Hast du es 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.

Mehr Infos im Codex

E-Crespo
quelle
Dies funktionierte für mich, während benutzerdefinierte Abfrage nicht - danke für die Erwähnung von replace ()
Trainoasis
Dies ist die richtige Antwort auf die Frage.
Tyler Jones
6
Es ist anzumerken, dass dies $wpdb->replaceein destruktives Überschreiben des gesamten Datensatzes ist, während $wpdb->updatenur die im $dataArray enthaltenen spezifischen Felder aktualisiert werden
MatthewLee
0

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->updateob dies der Fall ist oder $wpdb->insertnicht

felipelavinz
quelle
14
Ein Beispiel für die Überprüfung, ob die ID oder der Primärschlüssel vorhanden sind, würde dies zu einer nützlichen Antwort machen. Dies ist fast so, als würde man die Frage wiederholen.
Jake