问题描述

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