@maluky

Написал код чтобы он сверял с бд. Если файл не существует в бд он удаляется с хостинга?

Здравствуйте. Помогите с написанием кода. Написал код чтобы он сверял с бд, если файл не существует в бд он удаляется с хостинга. А он удаляет все файлы с папки. Помогите поправить. Только учусь.
// Параметры подключения к базе данных
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "username";
$conn = new mysqli($servername, $username, $password, $dbname);

// Проверка подключения к базе данных
if ($conn->connect_error) {
    die("Ошибка подключения к базе данных: " . $conn->connect_error);
}

// Выполнение запроса к базе данных для получения списка всех файлов
$sql = "SELECT img_images FROM img_ads";
$result = $conn->query($sql);

// Получение списка файлов в папке
$imagesFolder = "media/images/";
$files = glob($imagesFolder . "*.webp");

// Проход по каждому файлу в папке
foreach ($files as $file) {
    // Проверка, существует ли файл в базе данных
    $filename = basename($file);
    $fileInDb = false;

    if ($result->num_rows > 0) {
        while ($row = $result->fetch_assoc()) {
            if ($row['img_images'] == $filename) {
                $fileInDb = true;
                break;
            }
        }
    }

    // Удаление файла с хостинга, если он не существует в базе данных
    if (!$fileInDb) {
        if (unlink($file)) {
            echo "Файл удален: " . $file . "<br>";
            // Запись результатов в файл log.txt
            file_put_contents("log/log.txt", "Удален файл: " . $file . PHP_EOL, FILE_APPEND);
        } else {
            echo "Не удалось удалить файл: " . $file . "<br>";
            // Запись результатов в файл log.txt
            file_put_contents("log/log.txt", "Не удалось удалить файл: " . $file . PHP_EOL, FILE_APPEND);
        }
    }

    // Сброс указателя результатов запроса перед новой итерацией
    $result->data_seek(0);
}

// Закрытие подключения к базе данных
$conn->close();
  • Вопрос задан
  • 144 просмотра
Пригласить эксперта
Ответы на вопрос 1
@DooX
// Сброс указателя результатов запроса перед новой итерацией
    $result->data_seek(0);


Привет. При каждой итерации цикла foreach он сбрасывает указатель результатов запроса $result->data_seek(0), что приводит к повторной обработке всех строк результата запроса. Это приводит к удалению всех файлов, так как они поочередно не находятся в базе данных на каждой итерации.

Попробуй по другому.

// Параметры подключения к базе данных
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "username";
$conn = new mysqli($servername, $username, $password, $dbname);

// Проверка подключения к базе данных
if ($conn->connect_error) {
    die("Ошибка подключения к базе данных: " . $conn->connect_error);
}

// Выполнение запроса к базе данных для получения списка всех файлов
$sql = "SELECT img_images FROM img_ads";
$result = $conn->query($sql);

// Получение списка файлов из базы данных
$filesInDatabase = array();
if ($result->num_rows > 0) {
    while ($row = $result->fetch_assoc()) {
        $filesInDatabase[] = $row['img_images'];
    }
}

// Получение списка файлов в папке
$imagesFolder = "media/images/";
$files = glob($imagesFolder . "*.webp");

// Проход по каждому файлу в папке
foreach ($files as $file) {
    // Проверка, существует ли файл в базе данных
    $filename = basename($file);

    if (!in_array($filename, $filesInDatabase)) {
        if (unlink($file)) {
            echo "Файл удален: " . $file . "<br>";
            // Запись результатов в файл log.txt
            file_put_contents("log/log.txt", "Удален файл: " . $file . PHP_EOL, FILE_APPEND);
        } else {
            echo "Не удалось удалить файл: " . $file . "<br>";
            // Запись результатов в файл log.txt
            file_put_contents("log/log.txt", "Не удалось удалить файл: " . $file . PHP_EOL, FILE_APPEND);
        }
    }
}

// Закрытие подключения к базе данных
$conn->close();
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы