使用 PHP 删除 Foreach 循环内的文件名数组

Delete Array Of Filenames Inside A Foreach Loop Using PHP

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

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

下面是我正在尝试的代码,其中一部分是基于@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 变量的 PHP 代码的第 3 行有关。我已经通过将代码包装在现在存在的 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; ?>"

任何有关如何从图像目录中删除特定于用户的图像的帮助或协助都将是极好的。

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