$wpdb->UPDATE()总是需要再次尝试

时间:2022-02-15 作者:kolja

我将使用REST APi的自定义端点来更新自定义表中的字段。因此,我编写了以下函数:

function update_table_single($request = null){
    global $wpdb;
    $data_key = trim($request[\'data_key\']);
    $data_value = trim($request[\'data_value\']);
    $where_key = trim($request[\'where_key\']);
    $where_value = trim($request[\'where_value\']);
    $table = trim($request[\'table\']); 

    $data = [ $data_key => $data_value ];  
    $where = [ $where_key => $where_value ]; 
    $wpdbupdate = $wpdb->update($wpdb->prefix.$table, $data, $where);
 
    // $wpdbupdate =  $wpdb->query(
    //     $wpdb->prepare( "UPDATE $wpdb->prefix.$table SET $data_key = %s WHERE $where_key = %d", $data_value, $where_value )
    // );

    $wpdb->show_errors = TRUE;
    $wpdb->suppress_errors = FALSE;
    if($wpdbupdate === 0){
        $response[\'error\'] = $wpdb->last_error;
        $response[\'query\'] = $wpdb->last_query;
        $response[\'status\'] = 200;
    }else{
        $response[\'error\'] = $wpdb->last_error;
        $response[\'query\'] = $wpdb->last_query;
        $response[\'status\'] = 400;
    }

    return new WP_REST_Response($response, 123);
}
但奇怪的是,第一次尝试用新值更新字段always 返回false(status:400).
第二次尝试(只需再次发送POST请求)将按预期更新字段
在这两种情况下,查询完全相同:
"UPDATE izq5I_my_customer SET user_color = \'red\' WHERE user_id = 2169"
我还尝试了prepare() 函数,但这会给出相同的结果。

我还可以试着找出这种奇怪行为的原因吗?

1 个回复
最合适的回答,由SO网友:Oleksii 整理而成

简短回答:
您的代码中存在逻辑错误,此条件错误:

 if($wpdbupdate === 0)
替换为:

if($wpdbupdate >= 0)
它将按预期工作。

详细说明:$wpdb->;update方法返回更新的行数,在您的情况下为1,因此代码继续到下一个块,并分配状态400。

请参阅有关wpdb的WP文档->;更新时间:https://developer.wordpress.org/reference/classes/wpdb/update/

返回#
(int | false)更新的行数,或错误返回false。

您的代码仅在未更新任何内容时返回状态200,$wpdb->;update返回零,奇怪的行为如下:

更新表行,更新返回1,触发状态400,第二次尝试时未更新任何内容,更新返回0,触发状态200。若要解决此问题,请将if条件更改为

if($wpdbupdate >= 0)
更新或忽略行时返回状态200(因为更新包含的值等于现有值),或

if($wpdbupdate > 0)
仅在值更改时返回状态200