KiGamji
@KiGamji

Как написать код, который будет удалять файл с названием поля id из базы данных, если само поле будет отсутствовать?

В базе данных имеется условная таблица saves. В еë структуре есть поле id с уникальным идентификатором каждой строки в таблице.
У каждого id в условной папке examplefolder есть файл, именуемый самим id своей строки из базы данных.
То есть, если в базе данных в таблице saves есть 3 строки с id 2, 5 и 128, то и в папке будут 3 файла, которые будут называться 2, 5 и 128 соответственно. (Пусть путь до этой папки выглядит так: "../../examplefolder")
Иногда из таблицы saves, или из папки examplefolder вручную удалялись некоторые строки или файлы. Я хочу написать код, который будет удалять файл, если к нему нет строки с его общим id в таблице saves, и наоборот, удалять строки, у которых из поля id нет соответствующего файла из папки examplefolder с названием этого же поля.
  • Вопрос задан
  • 102 просмотра
Решения вопроса 2
@Siverius
Если вам нужен пошаговый план действий, то примерно так:
1. получить все id из таблицы save в виде массива
2. получить все названия файлов в папке сохранений в виде массива
3. в цикле foreach пройтись по массиву id, искать в массиве названий файлов совпадения.
если совпадения нет, вызывать метод удаления записи из таблицы по id
4. в цикле foreach пройтись по массиву названий файлов, искать в массиве id совпадения.
если опять же совы не падают, вызывать метод удаления файла

в псевдокоде это будет примерно так:
class TableDirectoryCleaner
{
    private array $ids = [];
    private array $filenames = [];

    public function doTheBeauty()
    {
        $this->init();
        $this->checkTableAndDeleteRowsWithoutFiles();
        $this->checkFolderAndDeleteFilesWithousRow();
    }

    private function init()
    {
        $this->fillIds();
        $this->fillFilenames();
    }

    private function fillIds()
    {
        $this->ids = $this->getRepository(Save::class)->findAllIdsAsArray();
    }

    private function fillFilenames()
    {
        $this->filenames = $this->someMethodThatGetsFilenamesAsArray();
    }

    private function checkTableAndDeleteRowsWithoutFiles()
    {
        foreach ($this->ids as $id) {
            if (!array_search($id, $this->filenames)) {
                $this->getRepository(Save::class)->deleteRowWithId($id);
            }
        }
    }

    private function checkFolderAndDeleteFilesWithousRow()
    {
        foreach ($this->filenames as $filename) {
            if (!array_search($filename, $this->ids)) {
                unlink($filename);
            }
        }
    }
}


PS как, собственно, вам и написал nokimaro
Ответ написан
Комментировать
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
1. сделать select id из базы и затем проверить существование каждого файла по факту. Если файла нет - удалить запись с базы
2. собрать список всех файлов в папке, например используя RecursiveDirectoryIterator и затем проверить наличие id-файла в базе. Если в базе записи нет - удалить файл.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы