【问题标题】:Compare JSON against MySQL database for removed records将 JSON 与 MySQL 数据库进行比较以查找已删除的记录
【发布时间】:2023-04-08 17:14:01
【问题描述】:

我设置了一个 JSON 解析器,它使用 PHP 将事件添加到 MySQL 数据库。 JSON 文件中的所有事件都有一个 ID,我检查它是否已存在于数据库中,如果存在,则仅更新某些数据。如果事件不存在,它会将其添加到数据库中。

所有这些都运行良好,但一个问题是我不知道是否存在已从 JSON 文件中删除但之前已导入数据库的事件。导入每周运行一次,所以上周可能已经添加了一个现在已被取消的事件,所以我想停用这些事件(数据库中有一个状态标志)。

我尝试为此设置一个单独的查询 ($check_removed),但我无法让它工作,它似乎没有做任何事情。在查询中,我还添加了一个检查以仅查找即将发生的事件,因为早于今天的事件不相关。

这是我的代码,有点简化:

$filename = "events.json";
$data = file_get_contents($filename);
$array = json_decode($data, true);

foreach ($array as $row) {
 $id = $row["id"];
 $title = $row["title"];
 $date = $row["date"];

 // Get current date for comparison of removed records
 $today = date("Y-m-d");

 $check = mysqli_query($connect,"SELECT * FROM `events` WHERE `ID` = '".$id."'"); 
 $check_removed = mysqli_query($connect,"SELECT * FROM `events` WHERE `date` >= '".$today."' AND `ID` != '".$id."'");  

 if(mysqli_num_rows($check_removed)==1) {
  // Upcoming event found in database but not in JSON (doesn't work)
 } elseif(mysqli_num_rows($check)==1) {
  // Existing ID matches, only update event (this works)
 } else {
  // No existing ID matches, add new event (this works)
 }
}

任何想法我做错了什么?

【问题讨论】:

  • 您是否遇到任何错误?什么不工作?
  • PHP 或 SQL 中没有错误。它似乎只是跳过了第一个 IF 查询。
  • echo mysqli_num_rows($check_removed) 给你什么?并尝试将 "SELECT * FROM events WHERE ID = '".$id."'" 更改为 "SELECT COUNT(*) FROM events WHERE ID = '".$id."'"并回显结果
  • 您的逻辑是错误的:第二个查询获取所有未来事件减去具有当前 id 的事件。如果您正确处理日期。相反,您应该将所有 id 添加到一个数组中,并在循环后使用NOT IN(...) 进行 sql 检查。

标签: php mysql json


【解决方案1】:

感谢您将我推向正确的方向!它帮助我找到了another post,我可以对其进行修改以使其正常工作。

$FutureRecords = mysqli_query($connect,"SELECT `ID` FROM `events` WHERE `date` >= '".$today."'");

$FutureRecords_TempArray1 = array();
$FutureRecords_TempArray2 = array();

foreach ($FutureRecords as $row) { // Push local table id's in empty array
    array_push($FutureRecords_TempArray1, $row["ID"]);
}
foreach ($array as $row) { // Push JSON data id's in empty array
    array_push($FutureRecords_TempArray2, $row["ID"]);
}
// Add a joint array excluding excess records.
$FutureRecords_Query = array_intersect($FutureRecords_TempArray2,$FutureRecords_TempArray1);

// Update data in live table where ids are not present in new joint array
$DeactivateRemovedRecords = mysqli_query($connect,"UPDATE `events` SET `Active` = 0 WHERE `Start` >= '".$today."' AND `ID ` NOT IN ('" . implode( "', '" , $FutureRecords_Query ) . "' )");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    相关资源
    最近更新 更多