問題描述
我通常不會熟悉 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_id 是 UNIQUE 索引或 PRIMARY KEY 。如果你的表結構是我認為的,讓數據庫處理它。
次佳解決方案
你試過 $wpdb->replace 嗎根據 WP Codex:
如果表中存在該行或在表中插入新行 (如果該行不存在),則替換該行。
我嘗試過自己的一些插件,並嘗試避免唯一的 ID 重複錯誤等工作。
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。