【发布时间】: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
eventsWHEREID= '".$id."'" 更改为 "SELECT COUNT(*) FROMeventsWHEREID= '".$id."'"并回显结果 -
您的逻辑是错误的:第二个查询获取所有未来事件减去具有当前 id 的事件。如果您正确处理日期。相反,您应该将所有 id 添加到一个数组中,并在循环后使用
NOT IN(...)进行 sql 检查。