首页 > 解决方案 > 使用 PHP 删除 Foreach 循环中的文件名数组

问题描述

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

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

下面是我正在尝试的代码,其中一部分基于@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();
    }
}

上面代码的关键部分是下面的这段代码:

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

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

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

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

MySQL数据库中的图像文件名

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

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

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

标签: phparraysfileforeach

解决方案


无需将文件名和扩展名存储在单独的数组中,甚至根本不需要存储在数组中。只需在循环中获取每个图像文件名和扩展名,将其组装成一个模式(例如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);
    }
}

推荐阅读