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

循环处理联系人数据后,如何更新当前行的updated_in_sib字段?

解决方案

首先得指出你代码里的一个小问题:$wpdb->get_results() 默认返回的是对象数组,所以你用 $customer[0] 这种数组索引的方式获取字段值是不对的,应该通过对象属性访问,比如 $customer->customer_id(具体字段名要和你的 imp_customer_log 表结构对应)。

接下来,要实现将当前行的 updated_in_sib 改为1,推荐使用WordPress内置的 $wpdb->update() 方法(安全且符合规范),最好在确认SendinBlue API调用成功后再执行更新,避免API失败时错误标记为已更新。

修改后的完整代码示例

require('../mailin.php');
$mailin = new Mailin("https://api.sendinblue.com/v2.0","Your access key");

// 查询待更新的数据
$customer_data = $wpdb->get_results("SELECT * FROM imp_customer_log WHERE updated_in_sib = '0'");

foreach( $customer_data as $customer ) {
    // 注意:这里要替换成你表中实际的字段名
    $log_id = $customer->id; // 假设表的主键是id,用来唯一定位当前行
    $customer_id = $customer->customer_id;
    $customer_event = $customer->event;
    $customer_data_val = $customer->data; // 避免和外层$customer_data变量重名
    
    $user = get_user_by( 'id', $customer_id );
    $user_email = $user->user_email;
    
    $data = array(
        "email" => $user_email,
        "attributes" => array(
            $customer_event => $customer_data_val,
        ),
    );
    
    // 调用API并获取响应
    $api_response = $mailin->create_update_user($data);
    var_dump($api_response);
    
    // 检查API是否调用成功(根据SendinBlue v2 API的返回格式调整判断逻辑)
    if (isset($api_response['code']) && $api_response['code'] === 'success') {
        // 使用$wpdb->update更新当前行
        $update_result = $wpdb->update(
            'imp_customer_log', // 表名
            array('updated_in_sib' => 1), // 要更新的字段和值
            array('id' => $log_id), // 更新条件:主键匹配当前行
            array('%d'), // 更新字段的格式(%d表示整数)
            array('%d') // 条件字段的格式
        );
        
        // 可选:检查更新结果,用于调试或日志记录
        if ($update_result === false) {
            error_log("更新imp_customer_log失败,行ID:{$log_id}");
        } elseif ($update_result === 0) {
            error_log("未找到要更新的imp_customer_log行,行ID:{$log_id}");
        }
    }
}

关键说明

  • 主键定位:必须用表的唯一标识(比如主键id)来定位要更新的行,不能仅靠customer_id,因为一个用户可能有多条日志记录。
  • SQL安全:使用$wpdb->update()或$wpdb->prepare()可以自动防止SQL注入,不要直接拼接SQL语句。
  • API成功判断:SendinBlue v2 API的成功响应通常包含code: "success",你可以根据实际返回的响应结构调整判断逻辑。
  • 变量重名问题:原代码中$customer_data既是查询结果数组,又是循环内的字段变量,容易导致混淆,建议重命名循环内的变量(比如改成$customer_data_val)。

如果你更习惯直接写SQL语句,也可以用$wpdb->query()配合prepare:

// 替代上面的$wpdb->update部分
$wpdb->query(
    $wpdb->prepare(
        "UPDATE imp_customer_log SET updated_in_sib = 1 WHERE id = %d",
        $log_id
    )
);

内容的提问来源于stack exchange,提问作者Rob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:03:30