$wpdb->prepare搭配ON DUPLICATE KEY UPDATE占位符数量错误问题
解决WordPress wpdb中INSERT...ON DUPLICATE KEY UPDATE的占位符不匹配问题
你遇到的问题核心是SQL语句里的占位符数量和传递的参数数量不匹配:你的INSERT部分有8个%s,ON DUPLICATE KEY UPDATE部分又额外加了6个%s,总共14个占位符,但你只传递了8个变量,自然会报"14个占位符对应8个变量"的错误。
另外你尝试的status_type = status_type这种写法等于没有更新任何值,所以完全不会生效;至于疑似删除行的问题大概率是其他逻辑导致,但先解决核心的更新逻辑问题。
正确的写法:使用VALUES()函数复用插入值
MySQL的ON DUPLICATE KEY UPDATE支持用VALUES(字段名)来引用INSERT语句中对应字段的插入值,这样就不需要在UPDATE部分再写额外的占位符,也就不用重复传递参数了。
修改后的完整代码如下:
$event_id = "value"; $status_type = "value"; $sport_name = "value"; $startdate = "value"; $ut = "value"; $name = "value"; $value_home = "value"; $value_away = "value"; // 使用VALUES()函数复用插入的字段值,避免额外占位符 $sql = "INSERT INTO wp_mytable (event_id, status_type, sport_name, startdate, ut, name, value_home, value_away) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) ON DUPLICATE KEY UPDATE status_type = VALUES(status_type), startdate = VALUES(startdate), ut = VALUES(ut), name = VALUES(name), value_home = VALUES(value_home), value_away = VALUES(value_away)"; $sql = $wpdb->prepare($sql, $event_id, $status_type, $sport_name, $startdate, $ut, $name, $value_home, $value_away); $wpdb->query($sql);
关键说明
为什么这样有效?
VALUES(status_type)会直接引用INSERT语句中准备插入的status_type值,所以UPDATE部分不需要再写%s占位符,整个SQL语句只有8个占位符,和你传递的8个参数完全匹配,不会再报错。前提条件
必须确保event_id字段是主键或者设置了唯一索引,否则ON DUPLICATE KEY UPDATE无法触发(它依赖唯一键冲突来判断是否执行更新)。如果确实需要单独传递更新值(比如插入和更新用不同的值)
那你需要把更新部分的6个参数也传递给prepare,总共传递8+6=14个参数,示例如下:$sql = "INSERT INTO wp_mytable (event_id, status_type, sport_name, startdate, ut, name, value_home, value_away) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) ON DUPLICATE KEY UPDATE status_type = %s, startdate = %s, ut = %s, name = %s, value_home = %s, value_away = %s"; // 传递8个插入参数 + 6个更新参数,共14个 $sql = $wpdb->prepare($sql, $event_id, $status_type, $sport_name, $startdate, $ut, $name, $value_home, $value_away, $update_status_type, $update_startdate, $update_ut, $update_name, $update_value_home, $update_value_away );但这种方式需要维护两组参数,不如第一种方式简洁,除非你有特殊的更新值需求。
内容的提问来源于stack exchange,提问作者Galivan
相关产品推荐
相关产品推荐

