我将使用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()
函数,但这会给出相同的结果。
我还可以试着找出这种奇怪行为的原因吗?
最合适的回答,由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