我使用以下内容作为'删除全部'用户选项。用户的帐户中包含图像以及每个图像的缩略图。每个图像在数据库中也有相应的行。
有效。我担心的是,新的图像可以上传,同时新的行被添加到数据库中'执行这个脚本。
所以说有大量的图像现在将被删除...所有图像都在第一个循环中被删除...现在可能在此期间添加了新图像...现在缩略图删除发生并删除新缩略图,其中第一遍中的图像未被删除。最后,数据库中的行被删除...同样的事情......新的条目被删除,现在有一个图像和拇指存在但数据库中没有相应的条目。希望这是有道理的。
如何确保从所有三个操作中删除相同的数据?
//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);
答案 0 :(得分:2)
我担心的是,新图像可以上传,新行也会被添加到数据库中。执行这个脚本。
您目前的做法并不好。首先,如果您希望删除花费更多时间,那么您应该介绍"删除"先是旗帜。在这种情况下,如果您要删除ie图像,则在DB中将其标记为deleted
(如果您需要进行更多清洁,则将其标记为用户帐户)以及它。完成。删除。有一些相关数据要物理删除吗?制作单独的"垃圾收集器"这将删除文件并删除已删除的"已删除"来自DB的记录并通过cron运行它。在这种方法中,删除很快,而清理剩菜可能需要更长时间,但这不是问题。
此外,您不应该首先迭代文件,而应该通过DB记录进行迭代,因为DB是更重要的数据。