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

时间:2018-10-01 05:24:11

标签: php mysql arrays json wordpress

我正在从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子句中添加什么?如果这种逻辑是正确的

2 个答案:

答案 0 :(得分: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)) . '\')');

答案 1 :(得分:0)

尼克建议的最终解决方案-针对每个循环的外部

$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 ) . "' )");