You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 16:37:20