PHP MySQL:如果API数据中不存在则删除行

Posted

技术标签:

【中文标题】PHP MySQL:如果API数据中不存在则删除行【英文标题】:PHP MySQL: Delete row if its not present in API data 【发布时间】:2019-03-06 04:51:48 【问题描述】:

我正在从 API 获取数据并将其添加到表中。 我们有一个状态来控制网站上可见的数据 如果状态 = 可在网络上显示或状态 = 已过期,则将其从网站上删除

从 API 插入数据时,我正在运行更新和插入查询。

$final_data = $response->Results; - //API JSON 中的数据转换为数组

并检查数据是否已经在表中更新 如果数据不是他们的插入

if(is_array($final_data)) 
    foreach ($final_data as $row) 
        $id = $row->id
        $data1 = $row->data1;
        $data2 = $row->data2;
        $data3 = $row->data3;
    

    global $wpdb;

    // Insert Data if not exists
    $updateJobsDatabase_mainquery = $wpdb->get_results("SELECT id  FROM ".$table_name." WHERE id = ".$id."");

    if (count($updateJobsDatabase_mainquery) > 0)  
        // Update query excluding id
     else 
        // Insert query including id
    

但是,当 API 中的数据行之一的状态更改为已过期时,通过此逻辑。 它仍然保留在数据库中。

我想从本地表中删除该行。 那么什么是删除不属于 If-Else 语句的行的正确方法。即不在 API 数据中但存在于本地数据库中的额外行。

我在想if (count($updateJobsDatabase_mainquery) = 0) 会返回与 API 数据 ID 不匹配的数据。并使用删除它

$deleteIfStatus = $wpdb->query('DELETE FROM '.$table_name_temp.' WHERE id = what? ');

但是我又应该在 where 子句中添加什么?如果这个逻辑是正确的

【问题讨论】:

【参考方案1】:

如果我正确理解您的代码,您应该可以使用(假设 id 是数字)

$deleteIfStatus = $wpdb->query('DELETE FROM '.$table_name_temp.' WHERE id NOT IN (' . implode(',', array_map(function ($v)  return $v->code; , $updateJobsDatabase_mainquery)) . ')');

如果id 不是数字,则使用

$deleteIfStatus = $wpdb->query('DELETE FROM '.$table_name_temp.' WHERE id NOT IN (\'' . implode("','", array_map(function ($v)  return $v->code; , $updateJobsDatabase_mainquery)) . '\')');

【讨论】:

是的,它是数字,在没有 if 语句的情况下都试过了,有错误 Catchable fatal error: Object of class stdClass could not be converted to string 我显然误解了$updateJobsDatabase_mainquery 的内容。里面有什么? 对不起,我的意思是数据格式是什么?根据你得到的错误,它似乎是一个对象数组? 对于这个查询"SELECT id FROM ".$table_name." WHERE id = ".$id."",它应该是一个stdClass Object ( [id] => 50982 )的数组? 我已经根据$updateJobsDatabase_mainquerystdClass Object ( [id] => 50982 ) 之类的对象数组的假设更新了我的答案。可以试试吗?【参考方案2】:

Nick 推荐的最终解决方案 - 每个循环的外部

$deleteFromDatabase_mainquery = $wpdb->get_results("SELECT PositionId  FROM `".$table_name_temp."`");

$deleteFromDatabase_tmparr1 = array();
$deleteFromDatabase_tmparr2 = array();

foreach ($deleteFromDatabase_mainquery as $row)  // Push local table id's in empty array
    array_push($deleteFromDatabase_tmparr1, $row->PositionId);

foreach ($final_data as $row)  // Push API data id's in empty array
    array_push($deleteFromDatabase_tmparr2, $row->PositionId);

// Add a joint array excluding excess records.
$deleteFromDatabase_finalqr = array_intersect($deleteFromDatabase_tmparr2,$deleteFromDatabase_tmparr1);

// Delete data from live table where ids are not present in new joint array
$deleteIfStatus = $wpdb->query("DELETE FROM ".$table_name." WHERE PositionId NOT IN ('" . implode( "', '" , $deleteFromDatabase_finalqr ) . "' )");

【讨论】:

以上是关于PHP MySQL:如果API数据中不存在则删除行的主要内容,如果未能解决你的问题,请参考以下文章

如果 VTL / API 网关模板中不存在密钥,则返回 null

如果表存在则删除行 SQL

如果 PHP 中不存在,则复制文件并创建目录 [重复]

MySQL:如果表中不存在则插入记录[重复]

检查列表中的对象是不是存在,如果在 R 中不存在则将其删除

Puppet - 在迭代哈希时,如果hiera中不存在,则设置清单中的默认值