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

Гриша К.

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

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

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

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

Возможно это распространенная ситуация, есть какие-то варинты решения, которые я незнаю.
 

PHPer

Новичок
Не совсем понял вопрос, но почему бы не создать резервную копию удаляемых фоток и чистить ее раз в сутки, к примеру?
 

denver

?>Скриптер
Гриша К.
А разобраться раз и навсегда почему это она вдруг не удалиляется и починить, это заведомо неподходящий вариант?
 

PHPer

Новичок
Автор оригинала: denver
Гриша К.
А разобраться раз и навсегда почему это она вдруг не удалиляется и починить, это заведомо неподходящий вариант?
Ошибаешься, иногда файл может не удалится, и ошибки в коде нет при этом. И заблокирован он грамотно
 

Гриша К.

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

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

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

-~{}~ 27.07.06 02:16:

PHPer, возможно вы имели ввиду перед удалением фотографий сделать их резервную копию, если одна из них не удалилась, то восстановить ее из резервной копии, после чего удалить ее сразу в резервной копии и иногда проверять хранилище временных фотографий?
 

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]);
}
 

denver

?>Скриптер
PHPer
Если вы так уверены что дважды unlink не глючит то вот это бы всё решило:
PHP:
while (file_exists($filename)) unlink($filename);
Вы можете дать гарантию что это не зациклится?

-~{}~ 27.07.06 02:56:

Гриша К.
В следующий раз как случится глюк -- не спешите выдумывать механизм об оповещении. Проверьте владельца "_big.jpg" какие выставлены права на него, от какого пользователя запускается скрипт который не может удалить файл и т.д.
 

Гриша К.

Новичок
denver, спасибо за ответ.
Глюка у меня пока еще не было, поэтому проверять щас нечего (тестирую щас все на локальной машине, там проблем с правами нет).
А если глюк случится, я о нем по крайней мере узнаю и буду уже проверять в чем проблема.
 

eXtreme

Новичок
А не пробовали от конца сработать?
Т.е. вначале удалить большую фотку. Обновить запись в БД, что она отсутствует.
Затем удилить маленькую. Обновить запись в БД.
А затем, если обе предыдущие операции успешны - удалить саму запись.
 

Гриша К.

Новичок
eXtreme, спасибо за ответ.
В итоге всеравно получится что одна фотограия останется, если unlink не сработала. Я сначала думал над тем как вообще в такой ситуации поступить, сделать откат удаления из БД, или продолжить, но фотки на сервере останутся ненужные.
Ну потом вот назрел вариант с лог-файлами и отправкой ошибки на мыло, а тот кто-будет удалять товар, ничего не заметит (предполагается что это будет человек незнающий программирования, ошибки его очень напугают, либо он забъет на них если увидит).

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

Я решил использовать MySQL транзакции в тех местах где много разных операторов SELECT, INSERT, UPDATE, - это учень удобно, если идет сбой, то просто все отменяется (в лог конечно запишется, но втоже время ничего в БД изменять не надо, только скрипт).
Исходя из этого я подумал о схожем решении (по смыслу) при сбое unlink().
 

kruglov

Новичок
Гриша К.
Раз в неделю ходите кроном и ищите неприкаянные фотки.
Хотя проблема явно из пальца.
 

Гриша К.

Новичок
kruglov, спасибо за ответ.
С Кроном я пока совсем не знаком, суть его использования мне нужна, но пока я не готов применять его.
Сделаю щас то что описал выше, а потом возможно действительно бду использовать крон для таких вот случаев например.
 

kruglov

Новичок
Просто сделать скрипт, который выдаст имена файлов, у которых нету записей в базе, сможете?
 

Гриша К.

Новичок
kruglov, спасибо за ответ.
Думаю смогу:
прочитаю все названия фото для проверки на сервере, запишу их в массив,
затем сделаю запросы к БД, используя цикл,
и те фото которые не имеют записи при проходе цикла запишу в массив или переменную,
образно говоря так.
 

kruglov

Новичок
Этот скрипт записываете в панели управления хостингом в крон, и пускай удаляет.

Хотя нет. Пускай он составляет список неудаленных файлов, а вы потом сравнивайте его на пустоту раз в год.
 

Гриша К.

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