删除文件& MySQL结果集中的行

时间:2011-06-08 20:27:49

标签: php mysql

我有一个Linux盒子,它捕获数据,创建文件,并在MySQL表中存储有关文件的数据。我需要能够选择性地开始修剪这些数据。

我计划使用php-cli脚本并通过cron每晚运行。

基本前提是选择符合删除条件的行,从匹配的行中删除文件,然后删除行。路径/文件名存储在行中。

我找到了以下查询来安全地选择,然后删除行,但我还需要从文件系统中删除结果中的文件:

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION;
SELECT foo FROM bar WHERE wee = 'yahoo!';
DELETE FROM bar WHERE wee = 'yahoo!';
COMMIT;

我知道如何使用php的unlink()函数删除文件。我只是不确定如何保留结果集,迭代删除文件,然后从表中删除结果集行...没有写入临时文本文件或其他东西的大丑陋。

任何帮助将不胜感激。谢谢!

编辑:PHP 5.3.6,MySQL 5.0.77

2 个答案:

答案 0 :(得分:0)

如果您只是启动1个DELETE查询,我认为您不需要事务。

<?php

    $pdo::prepare("SELECT [...]");
    foreach($result as $pathname) {
      unlink($pathname);
      if (/*everything went good*/)
        $pdo::prepare("DELETE [...]");
    }


?>

答案 1 :(得分:0)

我认为你实际上没有问题。您可以只选择所有记录并迭代它们。执行查询后,即使使用第二个查询删除它们,也可以迭代结果集中的每个记录。迭代结果集时,结果集会保留在内存中。

因此,只需查询(在一个查询中,如果可能的话)所有要删除的记录。在每次迭代中,删除该文件并删除该记录。

唯一的“问题”是文件系统不在与SQL语句相同的事务中进行事务处理,因此如果在删除记录时出错,则文件可能仍会被删除,反之亦然。

由于我认为使用这些文件的应用程序应始终明确检查文件是否存在,因此最好先清理文件。如果首先删除该文件,请检查它是否已删除,然后只删除该记录,您可以确保始终删除该文件。如果在删除记录时发生错误,您可以再次查询它以再次尝试。如果您先删除该记录,您可能会得到一个意外未删除的文件树,不必要地占用磁盘空间。