从数据库中删除文件后,下载到root用户

时间:2016-02-12 09:02:33

标签: php database download

我有这个功能,这会在我的数据库中自动删除特定年龄后的文本文件。

$r = new textfiles;
$db = new DB;
$currTime_ori = $db->queryOneRow("SELECT NOW() as now");

...

if($this->site->textfilesretentiondays != 0)
        {
            echo "PostPrc : Deleting textfiles older than ".$this->site->textfilesretentiondays." days\n";

            $result = $db->query(sprintf("select ID from textfiles where postdate < %s - interval %d day", $db->escapeString($currTime_ori["now"]), $this->site->textfilesretentiondays));      
            foreach ($result as $row)
                $r->delete($row["ID"]);
        }

现在我将编辑此函数,以便首先将所有文本文件自动下载到根目录/www/backup中,然后脚本应删除带有字符串$r->delete($row["ID"]);的文本文件

目前我不知道如何实现这一点。

3 个答案:

答案 0 :(得分:3)

对我而言,由于信息泄漏,似乎无法完全回答你的问题。

您是将整个文件内容存储在数据库中还是只存储路径和文件名? 这将有助于我们看到&#34; $row&#34;的内容是什么?它代表数据库中的一行。

如果你只是存储文件名(以及可选的路径),你可以使用&#34; copy&#34; (http://php.net/manual/de/function.copy.php)函数从php将文件复制到备份目录。请注意,您必须确保执行脚本或运行Web服务器的用户具有写入目录的权限。

您可以像textfiles

这样的方法将此功能添加到课程makeBackup

答案 1 :(得分:1)

信息很少,但我会试一试。如果要在删除行之前备份行,可以在删除命令之前使用插入FOREACH循环中的这段代码以json_encoded格式将它们存储在.txt文件中:

$myfile = fopen("/www/backup/".$row["ID"].".txt", "w") or die("Unable to open file!");
$txt = json_encode($row);
fwrite($myfile, $txt);
fclose($myfile);

答案 2 :(得分:1)

按你的方法..

function delete ($id){
   $result = $db->query(sprintf("select * from textfiles where id=$id);

   //if you have filepath use copy as SebTM suggested
   $path = $row['path']; //assuming path is the column name in ur db
   $filename = basename($path); //to get filename
   $backup_location = '/www/backup/'.$filename;
   copy($path, $backup_location);

   //if you have data in db
   $content = $row['data'] //assuming data to be backed up to file is in a field 'data'
   $backup_location = '/www/backup/file.txt';
   file_put_contents($backup_location, $content);
}

但这不是最优化的方法,你甚至可以将初始查询转换为上面的删除函数,只调用一次delete函数,而不是在循环中调用它。