Узнайте, какие файлы находятся в каталоге, которых «нет» в базе данных

#php #sql #database #list

#php #sql #База данных #Список

Вопрос:

У меня есть небольшой веб-сайт галереи, но количество изображений в каталоге отличается от количества, учитываемого в базе данных, примерно на 150, поэтому мне было интересно, есть ли способ узнать / перечислить, какие файлы находятся в каталоге, которых «нет» в базе данных (или наоборот).

базовая структура БД:

  • Изображения
    • ID
    • Изображения

имена изображений хранятся в базе данных как «imagename.jpg «

а сами изображения хранятся в каталоге images

Изображения/

Комментарии:

1. Как выглядит таблица базы данных? Как хранятся файлы? Слишком мало информации, чтобы ответить на этот вопрос.

Ответ №1:

Поместите имена файлов с сервера в один массив, а файлы из базы данных в другой. Используйте array_diff() для получения результата.

Пример (PHP):

 $files_db = array("car.jpg", "bike.jpg", "plane.jpg", "ship.jpg", "tank.jpg"); 
$files_server = array("car.jpg", "bike.jpg", "ship.jpg", "rocket.jpg"); 
  

Используйте

 print_r(array_diff($files_db, $files_server));
  

Вывод

 Array
(
    [2] => plane.jpg
    [4] => tank.jpg
)
  

Или (наоборот)

 print_r(array_diff($files_server, $files_db));
  

Вывод

 Array
(
    [3] => rocket.jpg
)
  

Комментарии:

1. Примечание: Вы можете использовать $files_server = scandir('/path/to/images/'); для создания массива файлов на сервере.

Ответ №2:

Если это, скорее всего, одноразовая проблема, я бы решил это половинчатым решением, используя сначала небольшой SQL-скрипт:

 SELECT filename FROM images;
  

и попросите клиента базы данных mysql или psql или что-то еще сбросить выходные данные в виде обычного текста в файл. (Перенаправление командной оболочки может выполнить эту работу, если вы не можете легко найти команду «дамп в файл» вашего клиента базы данных.)

Тогда я бы получил список каталогов:

 ls /path/to/images/ > ls_files
  

Отсортируйте оба:

 sort db_files > db_files.sorted
sort ls_files > ls_files.sorted
  

Затем запустите diff(1) , чтобы увидеть, на какие файлы ссылаются, где:

 diff -u ls_files.sorted db_files.sorted
  

Строки с префиксом или - находятся в одном, но не в другом.

Возможно, вам потребуется отредактировать выходные данные SQL или ls output, чтобы один из них соответствовал другому. Если в вашем редакторе есть инструмент, подобный vim ‘s ^V block select, некоторые из этих задач редактирования можно упростить, но иногда простой запуск ls из другого каталога может помочь добавить правильную структуру каталогов перед каждым именем файла.