WPDB插入或如果存在更新


21

总的来说,我对WPDB或SQL并不陌生,但是我有一个用于项目的自定义表,并且正在尝试为其分配一些元数据。我想“发生”的事情是如果存在一行,请对其进行更新,如果不插入该行。我已经阅读了WPDB Codex中的插入和更新,但是没有一个真正陷入“非此即彼”的境地。我以为我可以进行更新,所以到目前为止我的代码如下:

$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,然后决定是否更新还是插入?

Answers:


23

首先,您使用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。如果您的表结构是我认为的样子,请让数据库处理它。


这非常有用……感谢您的宝贵时间s_ha_dum!
2014年

Prepare为我返回false-没有其他数据库错误。如果在phpmyadmin中手动运行查询,它将按预期运行。还检查了变量应该是什么..有什么想法吗?
trainoasis

1
如果post_id不是主键怎么办?
Mike Kormendy

18

你试过了吗$wpdb->replace。根据WP Codex:

如果存在,请替换表中的行;如果不存在,则在表中插入新行。

我已经在一些插件中尝试过自己,并且在尝试避免唯一ID重复错误等时可以正常工作。

法典中的更多信息


这对我
有用,

这是对问题的正确答案。
泰勒·琼斯

6
值得注意的是,这$wpdb->replace是对整个记录的破坏性覆盖,而$wpdb->update仅更新$data数组中包含的特定字段
MatthewLee

0

您应该检查该行是否首先存在。

最有可能你会想尝试得到你想要更新该行的ID或主键,然后$wpdb->update如果它还是$wpdb->insert它不


14
一个有关如何检查ID或主键是否存在的示例确实会使这成为一个有用的答案。这几乎就像重申问题一样。
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.