问题描述
我通常不会熟悉 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。