【问题标题】:Deleting files and folder from given path从给定路径中删除文件和文件夹
【发布时间】:2019-01-25 15:50:31
【问题描述】:

我有一个名为 images 的文件夹,位于以下用户的文件夹中:

图片

  • 用户 1
  • 用户 2
  • 等等..

当我从数据库中删除用户时,我还想删除该给定用户的所有文件和文件夹。所有这些都在一个具有函数的类中,但是当我执行该函数时,我的整个文件夹图像都会被删除......

我已经检查过是否选择了正确的用户,如果路径没问题。当我在 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);
  }

我希望删除带有用户名的文件夹,但实际上整个图像文件夹都被删除了...我尝试了很多但没有任何效果:(

有人可以帮助我吗?

【问题讨论】:

  • 尝试在循环中检查foreach( $files as $file ){ $file 不是../
  • 我怀疑 glob() 返回 ...

标签: php


【解决方案1】:

在您的 deleteUser 函数中,您在从数据库中选择用户名之前删除用户。

我怀疑这会导致this-&gt;userSelsectByID() 返回null,从而导致将'/sites/domain.nl/www/admin/images/' 传递给$this-&gt;delete_files()

您需要调整操作顺序,以确保在将用户名从数据库中删除之前检索用户名,并确保在将用户名和用户目录传递给 $this-&gt;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

【讨论】:

  • 是的,我发现用户名是空的!感谢您的回答! :)
【解决方案2】:

我认为你在星号前漏掉了一个斜线

$files = glob( $target . '/*');

更新

让我们做一些分析。

  1. 用户名是“test”
  2. 你打电话给$this-&gt;delete_files('/sites/domain.nl/www/admin/images/test');
  3. 目标是一个目录 - 所以你需要一个glob('/sites/domain.nl/www/admin/images/test/*')
  4. glob 返回一个空数组 - 因此您不会删除任何文件
  5. 然后你创建rmdir('/sites/domain.nl/www/admin/images/test'); 并退出函数

这可能出错的唯一方法是您的用户名是空字符串。

【讨论】:

  • 我一回到家就试试这个,谢谢你和我一起思考!
  • 这也不起作用,仍在删除文件夹'images'.. :(
  • 是的,我发现用户名是空的!感谢您的回答! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
  • 2022-01-12
  • 2014-12-11
  • 1970-01-01
相关资源
最近更新 更多