問題描述

我通常不會熟悉 WPDB 或 SQL,但是我有一個自定義的表,我正在嘗試為它分配一些後設資料。 “like” 發生的是如果一行存在,更新它,如果不插入。我讀過 WPDB Codex 中的 Insert 和 Update,但並沒有真正進入”either or” 情況。我以為我可以使用更新,所以我的程式碼到目前為止看起來像這樣:

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

WordPress 有什麼像 「如果存在更新,ELSE 插入」,或者我需要執行自定義 SQL 來實現這一點,或者我需要首先查詢資料庫,看看我的表中是否存在一個 ID,然後決定是否更新它還是插入?

最佳解決方案

首先,您正在使用 prepare 。你似乎有 $wpdb->update 的引數包裝在 $wpdb->prepare 這樣。那不行。實際上,您正在傳遞 update 一個引數–prepare 的輸出。嘗試像下面這樣簡單的東西,你會看到為什麼這不行:

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

$wpdb->update()為您執行 prepare

第二,如果這是我,我跳過幫助函式膨脹並寫一個正確的 ON DUPLICATE KEY UPDATE 查詢:

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

這假設 post_idUNIQUE 索引或 PRIMARY KEY 。如果你的表結構是我認為的,讓資料庫處理它。

次佳解決方案

你試過 $wpdb->replace 嗎根據 WP Codex:

如果表中存在該行或在表中插入新行 (如果該行不存在),則替換該行。

我嘗試過自己的一些外掛,並嘗試避免唯一的 ID 重複錯誤等工作。

More info in the codex

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。