2013-09-01 4 views
0

У меня есть PHP-скрипт, который загружает файлы в каталог в моей файловой системе. В то же время я сохраняю имя файла в поле в базе данных MYSQL.проверить согласованность файла файловой системы с db

Я видел, что у меня больше файлов, чем записей в db.

Каков самый короткий способ узнать и удалить все те файлы, которые не связаны с записью в БД? Моя идея состояла бы в том, чтобы прочитать каждое имя файла из каталога, запустить запрос на db с именем файла, взятым с шага 1, и в случае, если запрос возвращает 0 результат для удаления файла.

Заранее благодарим за любые советы.

Lelio

+0

Fetch все имена файлов из БД в множестве А, принеси все имена файлов из файловой системы в множестве В, удалить те из множества B, которые не присутствуют в set A. – DCoder

+0

http://php.net/manual/en/function.scandir.php здесь, а также здесь http://php.net/manual/en/function.readdir.php – Parixit

ответ

1

Получить все файлы в папке, используя scandir, и используйте пункт NOT IN удалить файлы не в папке.

$files = implode(scandir('files/'), "', '"); 
$db->query("DELETE FROM files WHERE file_name NOT IN('{$files}')"); 

Если вы хотите сделать наоборот и удалить файлы, которые не содержат ссылки до записи в базе данных вы можете использовать функцию под названием unlink. Это приведет к удалению файла. Там, вероятно, более оптимизированные версии, но это то, что я хотел бы сделать:

$files = implode(scandir('files/'), "', '"); 
$sth = $db->query("SELECT * FROM files WHERE file_name NOT IN('{$files')"); 

foreach($sth->fetchAll(PDO::FETCH_OBJ) as $file) { 
    unlink("files/{$file_name}"); 
} 
+0

Спасибо! Не знаю, что делать с имплозией, я попробую. Еще один вопрос: насколько я понимаю, цикл foreach удалит те файлы, которые находятся как в db, так и в файловой системе, или мне что-то не хватает? –

+0

Он перечислит все файлы в папке, если один из них является 'NOT IN', то он удалит его. В БД не было записи для удаления. –