删除所有除指定的内容

时间:2019-02-20 07:19:37

标签: php mysql

我有一个程序,可以将条目发送到我的php脚本,然后将其添加到数据库中,如果已经存在,则进行更新

该程序发送大约3000个条目,并且php脚本将id保存到文本文件中,在发送所有条目之后,php脚本应该从数据库中删除所有条目,但那些id在文本文件中的条目除外。

当前,这是我的代码:

if($finished == "yes")
{
  if(file_exists("completed.txt"))
  {
    $completed = file("completed.txt");
    unlink("completed.txt");
    $product = database::query("select * from " . DB_TABLE_PRODUCTS . ";");
    while($row = database::fetch($product))
    {
      if(!in_array($row["ewe"], $completed))
      {
        if($row["ewe"] != "" && $row["ewe"] != null)
        {
          database::query("delete from " . DB_TABLE_PRODUCTS . " where id = '" . $row["id"] . "';");
          database::query("delete from " . DB_TABLE_PRODUCTS_TO_CATEGORIES . " where product_id = '" . $row["id"] . "';");
          database::query("delete from " . DB_TABLE_PRODUCTS_INFO . " where product_id = '" . $row["id"] . "';");
          database::query("delete from " . DB_TABLE_PRODUCTS_PRICES . " where product_id = '" . $row["id"] . "';");
          $product_images = database::query("select * from " . DB_TABLE_PRODUCTS_IMAGES . " where product_id = '" . $row["id"] . "';");
          while($product_image = database::fetch($product_images))
          {
            if(is_file(FS_DIR_HTTP_ROOT . WS_DIR_IMAGES . $product_image['filename']))
            {
              unlink(FS_DIR_HTTP_ROOT . WS_DIR_IMAGES . $product_image['filename']);
            }
            functions::image_delete_cache(FS_DIR_HTTP_ROOT . WS_DIR_IMAGES . $product_image['filename']);
            database::query("delete from " . DB_TABLE_PRODUCTS_IMAGES . " where product_id = '" . $row["id"] . "' and id = '" . (int)$product_image['id'] . "' limit 1;");
          }
        }
      }
    }
  }
  exit();
}

但是上面发生的是数据库中的所有记录都被删除了 就我而言,仅使用DELETE FROM x WHERE x NOT IN是不好的。

总而言之,我有一个每天运行的程序,它将大约3000个条目发送到我的php脚本中,然后将其添加/更新到数据库中并从数据库中删除那些在最后3000个批次中不存在的记录记录。

有人知道我该怎么做吗?

编辑:

我发现了罪魁祸首,似乎in_array($ row [“ ewe”],$ completed)不能正常工作,即使它应该返回true,它也会返回false。

我手动检查了$ row [“ ewe”],它同时存在于数组和数据库中,但是in_array返回false。

编辑2:

找到了解决方案,似乎我的数组中有空格/换行符,我使用以下方法解决了该问题:$ completed = array_map(“ trim”,file(“ completed.txt”));现在它就像一种魅力一样工作:)

1 个答案:

答案 0 :(得分:0)

查看数据库关系和约束:https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html

简而言之,您可以定义没有主记录B(例如OBJECT)就不能存在的记录A(例如OBJECT_DETAIL)。然后删除母版的所有详细信息也将被删除。这是您确保数据库完整性的方式。

要在批次之间相交,合并或减去记录,请为每个批次分配唯一的标识符。