循环处理联系人数据后,如何更新当前行的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
相关产品推荐
相关产品推荐

