php - 使用glob删除图像文件以及相应的db行

时间:2014-10-28 06:01:24

标签: php

我使用以下内容作为'删除全部'用户选项。用户的帐户中包含图像以及每个图像的缩略图。每个图像在数据库中也有相应的行。

有效。我担心的是,新的图像可以上传,同时新的行被添加到数据库中'执行这个脚本。

所以说有大量的图像现在将被删除...所有图像都在第一个循环中被删除...现在可能在此期间添加了新图像...现在缩略图删除发生并删除新缩略图,其中第一遍中的图像未被删除。最后,数据库中的行被删除...同样的事情......新的条目被删除,现在有一个图像和拇指存在但数据库中没有相应的条目。希望这是有道理的。

如何确保从所有三个操作中删除相同的数据?

//delete all screenshots first
$ss_files = glob($_SERVER['DOCUMENT_ROOT'].'/../user-data/'.$_SESSION['user']['account_id'].'/screenshots/*');

foreach($ss_files as $ss_file)
{
    if(is_file($ss_file))
    {
        unlink($ss_file); // delete file
    }
}

//delete all thumbnails first
$ss_files = glob($_SERVER['DOCUMENT_ROOT'].'/../user-data/'.$_SESSION['user']['account_id'].'/screenshots/thumbs/*');

foreach($ss_files as $ss_file)
{
    if(is_file($ss_file))
    {
        unlink($ss_file); // delete file
    }
}

//create stmt
$stmt = $db->prepare("
    DELETE del_table.*
    FROM image_logs AS del_table
    INNER JOIN users
        ON users.user_id = del_table.user_id
    INNER JOIN computers
        ON computers.computer_id = users.computer_id            
    WHERE computers.account_id = :account_id
");                     

//add bindings and execute
$binding = array(
    'account_id' => $_SESSION['user']['account_id']
);
$stmt->execute($binding);

1 个答案:

答案 0 :(得分:2)

  

我担心的是,新图像可以上传,新行也会被添加到数据库中。执行这个脚本。

您目前的做法并不好。首先,如果您希望删除花费更多时间,那么您应该介绍"删除"先是旗帜。在这种情况下,如果您要删除ie图像,则在DB中将其标记为deleted(如果您需要进行更多清洁,则将其标记为用户帐户)以及它。完成。删除。有一些相关数据要物理删除吗?制作单独的"垃圾收集器"这将删除文件并删除已删除的"已删除"来自DB的记录并通过cron运行它。在这种方法中,删除很快,而清理剩菜可能需要更长时间,但这不是问题。

此外,您不应该首先迭代文件,而应该通过DB记录进行迭代,因为DB是更重要的数据。