{Удаляю данные из БД, затем удаляю файлы}, один из них не удаляется - какое решение?

Гриша К.

Новичок
{Удаляю данные из БД, затем удаляю файлы}, один из них не удаляется - какое решение?

Здравствуйте.

К примеру удаляется товар из БД интернет-магазина, сначала например удаляем его данные из таблицы "products", затем удаляем набор фотографий (маленькую и большую).
PHP:
unlink($row['photo_id'].'.jpg');
unlink($row['photo_id'].'_big.jpg');
И вот например одна фотография удалилась, а другая нет (_big.jpg), в данном случае я могу откатить транзакцию (товар из БД не будет удален), но одна фотография удалилась.
Вот незнаю как поступить в этом случае.

Сначала думал никак это не проверять, но всетаки
1) может быть лучше проверять и если хоть одна фотография не удалилась, откатывать транзакцию и выводить сообщение, чтобы с этим разбираться.
2) а возможно стоит записывать эту ситуацию в лог-файл и уведомление на e-mail.

Возможно это распространенная ситуация, есть какие-то варинты решения, которые я незнаю.
 
Не совсем понял вопрос, но почему бы не создать резервную копию удаляемых фоток и чистить ее раз в сутки, к примеру?
 
Гриша К.
А разобраться раз и навсегда почему это она вдруг не удалиляется и починить, это заведомо неподходящий вариант?
 
Автор оригинала: denver
Гриша К.
А разобраться раз и навсегда почему это она вдруг не удалиляется и починить, это заведомо неподходящий вариант?
Ошибаешься, иногда файл может не удалится, и ошибки в коде нет при этом. И заблокирован он грамотно
 
PHPer, спасибо за ответ.
Смысл не втом чтобы сохранить фотографии, а чтобы
например когда я удаляю какой-либо товар (данные хранятся в БД) и принадлежащие ему фотографии (хранятся на сервере),
так вот если одна из фотографий не удалилась, т.е. она отсалась на сервере (а надо ее удалить), я могу сделать так:
1) Отметнить удаление из БД, вывести уведомление об ошибке, которую необхождимо будет решить.
2) Записать данную ошибку в лог-файл и отправитт уведомление на e-mail.
3) ???

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

Вот если бы можно было бы делать, так скажем отмену удаления одной фотографии, если другая не удалилась.
Я думаю буду записывать данные в лог-файл и посылать уведомление на e-mail.

-~{}~ 27.07.06 02:16:

PHPer, возможно вы имели ввиду перед удалением фотографий сделать их резервную копию, если одна из них не удалилась, то восстановить ее из резервной копии, после чего удалить ее сразу в резервной копии и иногда проверять хранилище временных фотографий?
 
Смысл не втом чтобы сохранить фотографии, а чтобы
например когда я удаляю какой-либо товар (данные хранятся в БД) и принадлежащие ему фотографии (хранятся на сервере),
так вот если одна из фотографий не удалилась, т.е. она отсалась на сервере (а надо ее удалить), я могу сделать так:
1) Отметнить удаление из БД, вывести уведомление об ошибке, которую необхождимо будет решить.
2) Записать данную ошибку в лог-файл и отправитт уведомление на e-mail.
3) ???
Не совсем понял, как при этом вы отследите, удалилась ли фотография или нет? А если вы можете это отследить, так при обнаружении этого просто удалить фотографию. Не может же два раза подряд сглючить unlink
 
PHPer, спасибо за ответ.
Отследить можно например так:
PHP:
if(!unlink('1.txt'))
        echo 'Не удалилась';

Ну я так понимаю что способов на выбор =) нету, так что буду делать так:
PHP:
if(!unlink('1.txt'))
{
        error_log('Файл не удален ...', 0);
        error_log('Файл не удален ...', 1, [email][email protected][/email]);
}
 
PHPer
Если вы так уверены что дважды unlink не глючит то вот это бы всё решило:
PHP:
while (file_exists($filename)) unlink($filename);
Вы можете дать гарантию что это не зациклится?

-~{}~ 27.07.06 02:56:

Гриша К.
В следующий раз как случится глюк -- не спешите выдумывать механизм об оповещении. Проверьте владельца "_big.jpg" какие выставлены права на него, от какого пользователя запускается скрипт который не может удалить файл и т.д.
 
denver, спасибо за ответ.
Глюка у меня пока еще не было, поэтому проверять щас нечего (тестирую щас все на локальной машине, там проблем с правами нет).
А если глюк случится, я о нем по крайней мере узнаю и буду уже проверять в чем проблема.
 
А не пробовали от конца сработать?
Т.е. вначале удалить большую фотку. Обновить запись в БД, что она отсутствует.
Затем удилить маленькую. Обновить запись в БД.
А затем, если обе предыдущие операции успешны - удалить саму запись.
 
eXtreme, спасибо за ответ.
В итоге всеравно получится что одна фотограия останется, если unlink не сработала. Я сначала думал над тем как вообще в такой ситуации поступить, сделать откат удаления из БД, или продолжить, но фотки на сервере останутся ненужные.
Ну потом вот назрел вариант с лог-файлами и отправкой ошибки на мыло, а тот кто-будет удалять товар, ничего не заметит (предполагается что это будет человек незнающий программирования, ошибки его очень напугают, либо он забъет на них если увидит).

Вот например в windows, после удаления файла, можно вернуть его (из корзины). Возможно стоит сделать корзину, ну надо тогда проверять запись в нее, потом удаление из нее, очень громоздкое решение.

Я решил использовать MySQL транзакции в тех местах где много разных операторов SELECT, INSERT, UPDATE, - это учень удобно, если идет сбой, то просто все отменяется (в лог конечно запишется, но втоже время ничего в БД изменять не надо, только скрипт).
Исходя из этого я подумал о схожем решении (по смыслу) при сбое unlink().
 
Гриша К.
Раз в неделю ходите кроном и ищите неприкаянные фотки.
Хотя проблема явно из пальца.
 
kruglov, спасибо за ответ.
С Кроном я пока совсем не знаком, суть его использования мне нужна, но пока я не готов применять его.
Сделаю щас то что описал выше, а потом возможно действительно бду использовать крон для таких вот случаев например.
 
Просто сделать скрипт, который выдаст имена файлов, у которых нету записей в базе, сможете?
 
kruglov, спасибо за ответ.
Думаю смогу:
прочитаю все названия фото для проверки на сервере, запишу их в массив,
затем сделаю запросы к БД, используя цикл,
и те фото которые не имеют записи при проходе цикла запишу в массив или переменную,
образно говоря так.
 
Этот скрипт записываете в панели управления хостингом в крон, и пускай удаляет.

Хотя нет. Пускай он составляет список неудаленных файлов, а вы потом сравнивайте его на пустоту раз в год.
 
kruglov, Спасибо за идею, почитаю про крон, посмотрю свою cpanel и возможно получится так сделать.
 
Сверху