Finar.ru
web.finar.ru
video.finar.ru
Темы для BootstrapNew!

Исчезновение файлов из поля Множественная Загрузка Файлов в Netcat 4

мегабаг в NetCat 4 приводит к автоудалению файлов с сайта. Инструкция по исправлению

Автор: Филипп Усов, дата: 2013-06-27, просмотров 3203
Тэги

Некоторые пользователи и разработки Netcat замечали, что иногда файлы из объектов с полем множественная загрузка файлов исчезают без видимых причин. Объект и компонент не редактировались, а файлов нет, нет и записей о них в базе, нет их и в папке netcat_files.

Немного теории (для понимания сути процесса)

Множественная загрузка файлов (МЗФ) реализована следующим образом: при добавлении поля типа МЗФ в таблице messageXX создается поле, соответствующее полю компонента Netcat, при этом само поле в таблице всегда остается пустым, а информация о загруженных файлах записывается в таблицу Multifield.

В эту таблицу записываются следующие данные:

  • ID - auto_increment уникальный номер файла;
  • Field_ID – номер поля компонента из таблицы Field;
  • Message_ID – номер объекта которому принадлежит файл;
  • Priority – приоритет вывода файла в объект, в версии 4 не используется;
  • Name – описание файла, т.е. не имя файла а то, что пишется в отдельное поле над файлом;
  • Size - размер;
  • Path – путь, куда сохраняется файл;
  • Preview – путь для уменьшенного файла, используется только для картинок.

Как мы видим, невозможно посмотрев на строку из этой таблицы понять к какому объекту какого компонента принадлежит данный файл. Для этого нам нужно посмотреть в таблице Field соответствие Field_ID нашего файла и компонента.

Теперь страшный секрет Netcat: при удалении объектов из любого компонента скрипт делает запрос к таблице Multifield ищет там по полю Message_ID (!) записи и удаляет их, а также файлы, пути до которых берет из полей Path и Preview. Тем самым удаляются все файлы из поля типа МЗФ у объектов, которым "посчастливилось" иметь одинаковый ID с удаляемым в данный момент объектом совершенно другого компонента.

Приведем жизненный пример

На сайте некоторого фотографа есть всего два компонента:

  • простая страница, в которой он в простой и непринужденной форме записывает свои мысли о фотографии и о жизни (при этом на каждую мысль он создает отдельный объект, чтобы не запутаться в них :));
  • фотогалерея, в которую он также просто и непринужденно загружает свои работы на каждую тему создавая отдельный объект и загружая туда штук по сто фотографий.

И вот в один прекрасный день фотограф подумал, что мысль которую он записал в объект простой страницы с ID = 14 крамольна, после чего решил удалить этот самый объект, и удалил; а в след за ним удалились и все фотографии из объекта с ID = 14 в фотогалерее: и из базы, и с хостинга. А их там между прочем было целых 78 штук… Печально получилось.

Вернемся к технике.

Мы выяснили, что условия по поиску файлов, связанных с объектом, не достаточны и не однозначны. По этому их надо исправить!

А алгоритм таков:

  1. найти все номера полей типа МЗФ компонента, объект которого мы хотим удалить;
  2. cделать запрос к таблице Multifield с условием совпадения ID объекта и номеров полей (из прошлого пункта) и поля Field_ID;
  3. если мы получили результат, то удалить записи из Multifield и сами файлы

Вы сами можете реализовать это в файле message.php в папке /netcat/ (начало удаления файлов из поля МЗФ находится в районе 337 строчки) или, если вы используете версию 4.72, заменить этот файл на тот, который уже поправили мы (с обязательным сохранением оригинала на всякий случай):

message.php_472PhPh-edited.zip (скачиваний: 376)


Оставить комментарий 


Ваше имя:
->