#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)
)
);
这假设
prepare
是ON DUPLICATE KEY UPDATE
索引或post_id
。如果您的表结构是我认为的样子,请让数据库处理它。 #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
评论
这非常有用……感谢您的宝贵时间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