Всем привет! Вопрос касается как php, так и mysql.
По какой логике лучше загружать изображения в таком случае?
1. Пользователи могут загружать изображения в пост, до 20 штук. Изначально была такая система:
через ajax загружались картинки и сохранялись в папке temp, из нее же изображение и выводилось сразу же на страницу (перед сохранением поста).
2. При сохранении самого поста в массиве images[] отправлялись имена картинок, полученные в первом шаге через ajax. Каждая картинка искалась в папке temp а затем обрезалась в нужных разрешениях (6 штук) и сохранялась уже в рабочие директории и информация о ней сохранялась в БД с привязкой к только что созданному посту.
Проблема этого способа в том, что пользователь сначала ждет загрузки изображений, а затем долго ждет сохранения поста, ведь при загрузке 20 картинок, в сумме нужно создать 120 изображений.
Решил пойти другим путем:
1. При загрузке сразу обрезать изображения и ложить их в рабочие директории под нужными разрешениями, при этом появилась необходимость сразу же и сохранять информацию о изображении в БД не привязывая к какому либо посту (для того, чтобы кроном, периодически удалять те картинки, которые пользователи так и не сохранили вместе с постом).
2. При сохранении поста, также ищем имена изображений в БД и привязываем их к ID поста.
Но тут другая проблема при редактировании поста, когда нужно проверить удалил ли пользователь какое-то изображение или добавил новое или и удалил старое и добавил новое одновременно. Получается мне нужно выполнить действие:
Прилетели имена картинок в images[], все картинки редактируемого поста отвязываем от него, назначив им в поле post_id значение 0. И сразу же после этого назначаем всем картинкам из массива images[] значение ID редактируемого поста. Остальные же будут удалены по крону в 24:00 если они не привязаны ни к какому посту. Так вот, проблема в том, что между этими двумя действиями редко, но может сработать крон, и удалить нужные изображения вместе с ненужными.
Либо я вообще придумал не правильный алгоритм загрузки, подскажите плз как можно лучше это организовать...
1. При загрузке сразу обрезать изображения и ложить их в рабочие директории под нужными разрешениями, при этом появилась необходимость сразу же и сохранять информацию о изображении в БД не привязывая к какому либо посту (для того, чтобы кроном, периодически удалять те картинки, которые пользователи так и не сохранили вместе с постом).
я точно также сделал у себя.
Дальше треш и вообще не понятно.
проблема в том, что между этими двумя действиями редко, но может сработать крон, и удалить нужные изображения вместе с ненужными
проблемы никакой быть не должно - записывай дату добавления изображения и кроном ищи изображения старше часа, например:
$sql = 'SELECT * FROM t
WHERE post_id IS NULL
AND file_date < (NOW() - INTERVAL 60 MINUTE)
ORDER BY id ASC LIMIT ?i';
Вот смотрите... Пользователь уже сохранил пост в двумя картинками, он есть все хорошо. У картинок есть названия "1.jpg", "2.jpg" И дата загрузки "месяц назад".
Пользователь нажимает редактировать пост и видит уже существующие изображения... добавляет третье "3.jpg" и удаляет второе "2.jpg" но пост еще не сохранил. В итоге в БД лежит 3 изображения:
(post_id == 0 для последнего изображения для того, что вдруг пользователь просто закроет браузер не сохраняя)
Теперь пользователь тыкает "сохранить пост" и мы начинаем проверять что он наделал с изображениями (помним, все изображения, которые нужно оставить в посте хранятся в массиве images[]):
Нам нужно привязать 3.jpg к посту 9, но так же отвязать 2.jpg т.е. оно удалено при редактировании.
Значит выполняем запрос:
UPDATE `images` SET `post_id` = 0 WHERE `post_id` = 9;
Вот тот момент, когда не одно из изображений не привязано к посту.
Дальше, сразу же выполняем запрос:
UPDATE `images` SET `post_id` = 9 WHERE `imagename` IN(implode(',', $_POST['images']))
В итоге, т.к. у нас в массиве images[] были имена изображений "1.jpg" и "3.jpg" - в БД останется это:
И выполнив в том промежутке cron с вашим запросом мы удалим также изображение 1.jpg т.к. в тот момент оно не привязано к посту и имеет дату загрузки "месяц назад"
Алексей Коновалов, слушай, правда, очень тяжело тебя понимать, но ты что-то не так делаешь. всё как-то усложнил.
давай я тебе расскажу как у меня
изображения гружу аяксом, через скрытый фрейм. из фрейма по факту загрузки в родительское окно стучится JS и рисует в форме
Vasiliy_M, Я так и делаю, вот только удаление через AJAX мне кажется плохо... т.к. юзер интуитивно не поймет, что его изменения (удаление картинки), удалит её из поста сразу, не требуя сохранения.
Vasiliy_M, Если бы редактирования поста было бы без кнопки "сохранить", то да, это был бы идеальный вариант... Но если есть кнопка сохранить, то лучше просто удалять кроном не прикрепленные ни к чему картинки