[英]Deleting files and folder from given path
我在像這樣的用戶文件夾中有一個名為images的文件夾:
圖片
當我從數據庫中刪除用戶時,我還要刪除該給定用戶的所有文件和文件夾。 所有這些都在具有函數的類中,但是當我執行函數時,我的整個文件夾圖像都會被刪除...
我已經檢查了是否選擇了正確的用戶,路徑是否正確。 雖然我在test.php文件上對其進行了測試,但效果很好,但是在我的函數內部卻崩潰了。
如果單擊刪除按鈕,它將轉到此功能:
$user = new user();
$id = $_db->mysqli->real_escape_string($_POST['id']);
$query = "SELECT * FROM users WHERE id = '" .$id."'";
$result = $_db->mysqli->query($query);
$userNumb = $result->num_rows;
$finalUserNumb = $userNumb;
if ($finalUserNumb > 0) {
$user->deleteUser($id);
}
通過給定的ID獲取用戶信息
public function userSelsectByID($selector, $id)
{
$query = "SELECT " .$selector. " FROM users WHERE id ='" .$id."'";
$result = $this->mysqli->query($query);
$userInfo = $result->fetch_assoc();
$itemResult = $userInfo[$selector];
return $itemResult;
}
刪除文件功能
public function delete_files($target)
{
if(is_dir($target)){
$files = glob( $target . '*', GLOB_MARK ); //GLOB_MARK adds a slash to directories returned
foreach( $files as $file ){
$this->delete_files( $file );
echo "Deleted ".$file." succesfull...</br>";
}
rmdir( $target );
} elseif(is_file($target)) {
unlink( $target );
}
}
刪除用戶功能
public function deleteUser($id)
{
$user = "DELETE FROM users WHERE id = '$id'";
$userResult = $this->mysqli->query($user);
$uren = "DELETE FROM uren WHERE user_id = '$id'";
$urenResult = $this->mysqli->query($uren);
$cookieLogin = "DELETE FROM cookieLogin WHERE user_id = '$id'";
$cookieLoginResult = $this->mysqli->query($cookieLogin);
$gebruikersnaam = str_replace(' ', '_', $this->userSelsectByID('gebruikersnaam', $id));
$this->delete_files('/sites/domain.nl/www/admin/images/'.$gebruikersnaam);
}
我想刪除帶有用戶名的文件夾,但實際上整個圖像文件夾都被刪除了……我已經嘗試了很多,但沒有任何效果:(
有人可以幫助我嗎?
我想你在星星前錯過了一個斜線
$files = glob( $target . '/*');
讓我們做一些分析。
$this->delete_files('/sites/domain.nl/www/admin/images/test');
glob('/sites/domain.nl/www/admin/images/test/*')
rmdir('/sites/domain.nl/www/admin/images/test');
並退出功能 唯一可能出錯的方法是,如果您的用戶名是一個空字符串。
在deleteUser
函數中,先刪除用戶,然后再從數據庫中選擇用戶名。
我懷疑這會導致this->userSelsectByID()
返回null
,從而導致將'/sites/domain.nl/www/admin/images/'
傳遞給$this->delete_files()
。
您需要調整操作順序,以確保在將用戶名從數據庫中刪除之前已檢索到用戶名,並確保在將用戶名和用戶目錄傳遞到$this->delete_files()
之前,該用戶名和用戶目錄存在。
public function deleteUser($id)
{
$gebruikersnaam = str_replace(' ', '_', $this->userSelsectByID('gebruikersnaam', $id));
$userImagesPath = '/sites/domain.nl/www/admin/images/'.$gebruikersnaam;
$user = "DELETE FROM users WHERE id = '$id'";
$userResult = $this->mysqli->query($user);
$uren = "DELETE FROM uren WHERE user_id = '$id'";
$urenResult = $this->mysqli->query($uren);
$cookieLogin = "DELETE FROM cookieLogin WHERE user_id = '$id'";
$cookieLoginResult = $this->mysqli->query($cookieLogin);
if (!empty($gebruikersnaam) && is_dir($userImagesPath)) {
$this->delete_files($userImagesPath);
}
}
作為在函數內遞歸使用glob
的替代方法。 我建議改用RecursiveDirectoryIterator
。
這樣一來,您就可以按照刪除順序檢索所有文件和目錄的列表:
給定一個目錄結構
/home/fyrye/test/images
- user1
- 2018-12
- image1.jpg
- image2.jpg
- 2019-01
- image1.jpg
- image2.jpg
- user2
- 2019-01
- image1.jpg
- image2.jpg
- 2018-12
- image1.jpg
- image2.jpg
然后刪除user1
目錄及其中的所有內容。
$directory = '/home/fyrye/test/images/user1';
$ri = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($directory, FilesystemIterator::SKIP_DOTS | FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO),
RecursiveIteratorIterator::CHILD_FIRST
);
/**
* @var string $path
* @var \SplFileInfo $splFileInfo
*/
foreach ($ri as $path => $splFileInfo) {
if ($splFileInfo->isDir()) {
rmdir($path);
echo 'deleted directory: ' . $path;
} elseif ($splFileInfo->isFile()) {
unlink($path);
echo 'deleted file: ' . $path;
}
}
rmdir($directory);
echo 'deleted directory: ' $directory;
結果:
deleted file: /home/fyrye/test/images/user1/2018-12/image1.jpg
deleted file: /home/fyrye/test/images/user1/2018-12/image2.jpg
deleted directory: /home/fyrye/test/images/user1/2018-12
deleted file: /home/fyrye/test/images/user1/2019-01/image1.jpg
deleted file: /home/fyrye/test/images/user1/2019-01/image2.jpg
deleted directory: /home/fyrye/test/images/user1/2019-01
deleted directory: /home/fyrye/test/images/user1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.