总的来说,我对WPDB或SQL并不陌生,但是我有一个用于项目的自定义表,并且我正在尝试为其分配一些元数据。我想“发生”的事情是,如果存在一行,请对其进行更新,如果不插入该行。我已经阅读了WPDB Codex中的插入和更新,但是没有一个真正陷入“非此即彼”的境地。我以为我可以使用更新,所以到目前为止我的代码看起来像这样:我是否需要运行自定义SQL来实现此目的,还是需要先查询数据库以查看表中是否存在ID,然后再决定是对其进行更新还是插入?

#1 楼

首先,您使用的prepare错误。您似乎像这样将$wpdb->update的参数包装在$wpdb->prepare中。那行不通。实际上,您正在向update传递单个参数-prepare的输出。尝试以下类似的简单操作,您将了解为什么它行不通: ,如果是我,则跳过帮助程序功能,并编写正确的$wpdb->update()查询:

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


这假设prepareON DUPLICATE KEY UPDATE索引或post_id。如果您的表结构是我认为的样子,请让数据库处理它。

评论


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

–杰克
2014年7月30日15:01



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

–火车头病
16 Jan 25'8:37



如果post_id不是主键怎么办?

–迈克·科门迪(Mike Kormendy)
16年11月29日在0:36

#2 楼

您尝试过$wpdb->replace吗?根据WP Codex的说法:
如果存在表中的行,请替换它;如果该行不存在,请在表中插入新的行。尝试避免唯一ID重复错误等时。
法典中的更多信息

评论


这对我有用,而自定义查询没有-感谢您提到replace()

–火车头病
16 Jan 25'8:49



这是对问题的正确答案。

–泰勒·琼斯(Tyler Jones)
16-09-20在9:19

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

–马修·李
16 Dec 9'在4:46



此功能目前无法代替我。它复制相同的行。阻止替换发生的原因可以是PRIMARY KEY(id)字段吗?我在法典中看不到任何信息。

– ViktorBorítás
20年5月14日在16:54



我知道了:为了减轻此替换问题,在创建表时还需要将UNIQUE约束应用于特定列,从而使唯一行成为可能。

– ViktorBorítás
20 May 14 '17:12



#3 楼

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

您极有可能希望尝试获取要更新的行的ID或主键,然后选择$wpdb->update(如果有)或$wpdb->insert(不是)

评论


一个有关如何检查ID或主键是否存在的示例确实会使这成为一个有用的答案。这几乎就像重申问题一样。

–杰克
2014年7月30日14:57