2016-02-12 49 views
4

我有這個功能,並且這會從我的數據庫中自動刪除特定時間後的文本文件。下載到根目錄並從數據庫中刪除文件後

$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"]); 
     } 

現在這樣在首先TEXTFILES在根目錄/www/backup自動下載,然後腳本應該以字符串$r->delete($row["ID"]);

此刻,我不知道刪除TEXTFILES我會修改這個功能我如何能夠實現這一點。

+0

什麼是TEXTFILES類?你可以從你的數據庫中選擇文件的路徑嗎? – gen

+0

所有這些運行在幾個.phps。有些人可以訪問數據庫,然後進一步處理上面的代碼片段。 – BASF

+0

這不是根目錄,也不知道你的文件系統如何映射到URL,我們不知道路徑是什麼。如果這些文件已經在服務器上,那麼「下載」是什麼意思?爲什麼使用昂貴的數據庫查詢來確定時間?爲什麼在隨後的查詢中將該值用作參數而不是僅僅使用'now()'?這是一個很混亂的問題。 – symcbean

回答

3

對我來說,似乎不可能完全回答你的問題,因爲泄漏的信息。

您是將整個文件內容存儲在數據庫中還是僅存儲路徑和文件名? 這將幫助我們看看代表數據庫中的一行的「$row」的內容是什麼。


如果你只是存儲的文件名(和可選的路徑),你可以使用「複製」(http://php.net/manual/de/function.copy.php)從PHP函數將文件複製到備份目錄。請注意,您必須確保執行腳本或運行Web服務器的用戶具有寫入目錄的權限。

您可以像makeBackup這樣的方法將此功能添加到類textfiles

1

有幾個信息,但我會試一試。如果你刪除前行要備份,你可以將它們在.txt文件使用這片插入foreach循環代碼存儲在json_encoded形式,之前刪除命令:

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

Thx @所有的幫助!現在已經搞亂了這些建議,並且來自Aamir的貢獻對我來說是最有幫助的,並給了他賞金。 – BASF

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); 
} 

但這還不是最優化的方法,你甚至可以在初始查詢轉移到刪除功能上面,並調用刪除功能只有一次,與其說這是一個循環..