Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Удаление файлов
 
 автор: segazav   (30.05.2013 в 08:20)   письмо автору
 
 

Всем доброго дня!

На удаленном сервере есть папка "foto" с фотографиями, которые добавляются пользователями на сайт.
Путь к этим фото хранится в базе данных.

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

Хотелось бы создать что то вроде "чистильщика" папки фото от ненужных файлов, путей к которым нет в базе данных на момент "чистки".

  Ответить  
 
 автор: psychomc   (30.05.2013 в 09:33)   письмо автору
 
   для: segazav   (30.05.2013 в 08:20)
 

это не сложно, нужно лишь обойти директорию и каждый найденный файл поискать в базе. если нашли - оставляем, иначе - удаляем. иногда такие скрипты работают через cron

  Ответить  
 
 автор: segazav   (30.05.2013 в 10:13)   письмо автору
 
   для: psychomc   (30.05.2013 в 09:33)
 

Это получается будет цикл в цикле, а если файлов 30 000 шт. - будет мощная нагрузка на сервер.

  Ответить  
 
 автор: confirm   (30.05.2013 в 10:29)   письмо автору
 
   для: segazav   (30.05.2013 в 10:13)
 

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

  Ответить  
 
 автор: DangerBay   (30.05.2013 в 17:49)   письмо автору
 
   для: segazav   (30.05.2013 в 08:20)
 

Путь к этим фото хранится в базе данных.

Это неправильно, хранить нужно только имя файла, без полного пути.

Делается примерно так


<?php
$path 
=  '../path/to/fotodir/'// полный путь к папке с файлами
// находим имена файлов в папке
foreach (glob($path '*') as $fname)
   
$arr[] = substr(strrchr($fname'/'), 1);

// находим имена файлов в бд
$res=mysql_query('SELECT fotoname FROM table');
while (
$row=mysql_fetch_assoc($res))
$dbarr[] = substr(strrchr($row['fotoname'], '/'), 1); // если там действительно полный путь

// ищем каждое имя из папки в массиве имен из бд
$size count($arr);
$c 0;
for(
$i=0$i<$size$i++)
if(!
in_array($arr[$i], $dbarr))
    if(
unlink($path $arr[$i])) $c++; // если нет, то удаляем файл

echo 'Удалено: ' $c ' файлов';
?>


Но проблема совсем не в этом, как уже заметили.
Ошибка в вашем коде, который не удаляет файлы.

  Ответить  
 
 автор: confirm   (31.05.2013 в 14:14)   письмо автору
 
   для: DangerBay   (30.05.2013 в 17:49)
 

substr(strrchr($row['fotoname'], '/'), 1) > basename()

  Ответить  
 
 автор: psychomc   (31.05.2013 в 14:19)   письмо автору
 
   для: confirm   (31.05.2013 в 14:14)
 

:)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования