【问题标题】:Delete Array Of Filenames Inside A Foreach Loop Using PHP使用 PHP 删除 Foreach 循环中的文件名数组
【发布时间】:2021-11-13 07:13:17
【问题描述】:

如果网站用户想删除所有详细信息,我正在为他们创建“删除帐户”功能。

从数据库中删除相关记录非常简单。但是,我想删除他们保存在站点图像文件夹中的图像。

以下是我正在尝试的代码,其中一部分是基于@kmoser 的建议。

// $db_image_id, $db_image_ext, $db_image_filename are fetched in a previous code block for when images are outputted on the page.

if(isset($_POST['delete-account'])) {

    $loggedInUser = $_SESSION['logged_in'];
    $imagesLibrary = 'images-lib/';
    $imagesDownload = 'images-download/';

    try {

    $s = $connection->prepare("SELECT filename FROM `imageposts` WHERE user_id = :user_id");
    $s->bindParam(':user_id', $loggedInUser);
    $s->execute();

    // -- DELETE THE USER'S IMAGE FILES FROM 'IMAGES-LIB' FOLDER
    while ($row = $s->fetch()) { 
        if (isset($pattern)) {
            $pattern = $imagesLibrary . $row['filename'] . '-{500,750,1000,1500}' . '.' . $row['file_extension'];
            foreach (glob($pattern, GLOB_BRACE) as $filenames) {
                unlink($filenames);
            }
        }
    }
                        
    header("Location: index.php");

    } catch (PDOException $e) {
        echo "Error: " . $e->getMessage();
    }
}

上面代码的关键是下面这个sn-p:

// -- DELETE IMAGE FILES FROM 'IMAGES-LIB' FOLDER
while ($row = $s->fetch()) { 
    if (isset($pattern)) {
        $pattern = $imagesLibrary . $row['filename'] . '-{500,750,1000,1500}' . '.' . $row['file_extension'];
        foreach (glob($pattern, GLOB_BRACE) as $filenames) {
            unlink($filenames);
        }
    }
}

我最初收到与上面声明$pattern 变量的第3 行PHP 代码有关的错误PHP Notice: Undefined index: file_extension in /Applications/MAMP/htdocs/site/profile-edit.php。我已经设法通过将代码包装在现在存在的if(isset($pattern)) if 语句中来解决这个问题。我现在没有收到任何错误日志,但文件并未从“images-lib”目录中删除。

一个典型的文件名示例是6146972e2dc73_1632016174-500.jpeg

以下是文件在数据库中的外观示例:

当以<img> 标记输出到页面时,大小例如-500 文件名的一部分与src 属性内的字符串连接。

src="<?php echo '/images-lib/' . $db_image_filename . '-500' . '.' . $db_image_ext; ?>"

任何有关如何从图像目录中删除特定于用户的图像的帮助或帮助都会很棒。

【问题讨论】:

  • 对于存储在imageposts 表中的文件名,每个文件系统中是否存储了多个大小,还是只有一个?
  • @kmoser 数据库表中的每个图像只有一个。当输出到 img 标记中的页面时,src 属性将大小连接为字符串值。
  • if (isset($pattern)) 不是修复“未定义索引:file_extension”错误的正确方法。您需要将SELECT filename FROM `imageposts` 更改为SELECT filename, file_extension FROM `imageposts`

标签: php arrays file foreach


【解决方案1】:

没有必要将文件名和扩展名存储在单独的数组中,甚至根本不需要存储在数组中。只需在循环中获取每个图像文件名和扩展名,将其组装成一个模式(例如images/6146972e2dc73_1632016174-{500,750,1000,1500}.jpeg,然后glob() 模式以找到每个匹配的文件并取消链接:

while ($row = $s->fetch()) { 
    $pattern = $imagesLibrary . $row['filename'] . '-{500,750,1000,1500}.' . $row['file_extension'];
    foreach (glob($pattern, GLOB_BRACE) as $filename) {
        unlink($filename);
    }
}

【讨论】:

  • 图像目录中的图像确实都有大小作为文件名的一部分(总共 4 个大小)。我给出的示例文件名是 500px 大小。文件名是在图像上传并放置在目录中时生成的。上传图像的大小调整和重命名是使用 php Imagick 图像库完成的。
  • @paulo_cam 没有数据库中文件名和扩展名的具体示例,以及文件系统中匹配文件的具体示例,很难理解您想说什么。但是,我已经更新了我的答案,希望它现在可以工作。
  • @paulo_cam 请编辑您的问题以显示正在执行的确切 PHP 代码,并指出导致错误的行。
  • 好的,我已经做到了。我已经包含了您答案中的代码,尽管它还没有工作,但它似乎让我更进一步,并支持您的答案。
  • 谢谢。现在是一种享受。
猜你喜欢
  • 2018-08-20
  • 1970-01-01
  • 1970-01-01
  • 2015-09-21
  • 2012-02-15
  • 1970-01-01
  • 2011-06-09
  • 2020-05-17
  • 1970-01-01
相关资源
最近更新 更多