使用wpdb->prepare()实现ON DUPLICATE KEY UPDATE时忽略指定列
解决$wpdb->prepare()配合ON DUPLICATE KEY UPDATE时保留创建时间的问题
核心问题是要在重复键时只更新指定列,同时满足$wpdb->prepare()的占位符与参数数量匹配,避免覆盖date_created_gmt。用MySQL的VALUES()函数就能完美解决,它可以直接引用INSERT语句中对应列的值,不用重复传参数。
修改后的代码
function create_customer_data_table(){ require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); global $wpdb; $table_name = $wpdb->prefix . 'my_table'; $users = $wpdb->prefix . 'users'; // 注意:MyISAM引擎不支持外键,若需要外键建议改用InnoDB $wpdb->query( "CREATE TABLE IF NOT EXISTS $table_name ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, customer_id BIGINT(20) UNSIGNED NOT NULL UNIQUE, name VARCHAR(255) DEFAULT NULL, date_created_gmt DATETIME DEFAULT NULL, FOREIGN KEY (customer_id) REFERENCES $users(ID) ) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci" ); } function insert_customer_data_row() { global $wpdb; $tablename = $wpdb->prefix . 'my_table'; $customer_id = $_POST["customer-id-hidden"]; $name = $_POST['name']; $date_created_gmt = wp_date('Y-m-d H:i:s'); $sql = $wpdb->prepare( "INSERT INTO $tablename (`customer_id`, `name`, `date_created_gmt`) VALUES (%d, %s, %s) ON DUPLICATE KEY UPDATE name = VALUES(name)", // 仅更新name,复用INSERT中的值,无需额外占位符 $customer_id, $name, $date_created_gmt ); $wpdb->query($sql); }
关键说明
- 避免覆盖创建时间:
ON DUPLICATE KEY UPDATE中完全不提及date_created_gmt,数据库会保留原字段的值,不会被新传入的创建时间覆盖。 - 匹配占位符与参数:使用
VALUES(name)复用INSERT语句里的name值,无需在UPDATE部分新增占位符,$wpdb->prepare()的占位符数量(3个)和传入的参数数量(3个)完全一致,不会触发PHP报错。 - 移除不必要的更新:
customer_id是唯一键,触发UPDATE的前提就是该键重复,所以不需要在UPDATE中再次赋值,直接省略即可。
内容的提问来源于stack exchange,提问作者CoochieCook
相关产品推荐
相关产品推荐

