Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > Удалить из базы при отсутствие файла


Автор: Gold Dragon 2.9.2008, 09:40
есть две таблицы

в этой талице хранятся фотографии
Код

CREATE TABLE `foto_datsogallery` (
  `id` int(11) NOT NULL auto_increment,
  `catid` int(11) NOT NULL default '0',
  `imgtitle` text NOT NULL,
  `imgauthor` varchar(50) default NULL,
  `imgtext` text NOT NULL,
  `imgdate` varchar(20) default NULL,
  `imgcounter` int(11) NOT NULL default '0',
  `imgvotes` int(11) NOT NULL default '0',
  `imgvotesum` int(11) NOT NULL default '0',
  `published` tinyint(1) NOT NULL default '0',
  `ordering` int(11) NOT NULL default '0',
  `imgoriginalname` varchar(50) NOT NULL default '',
  `imgfilename` varchar(50) NOT NULL default '',
  `imgthumbname` varchar(50) NOT NULL default '',
  `checked_out` int(11) NOT NULL default '0',
  `owner` varchar(50) NOT NULL default '',
  `approved` int(1) NOT NULL default '0',
  `useruploaded` int(1) NOT NULL default '0',
  PRIMARY KEY  (`id`)
)


в это хранятся комментарии к фотографиям
Код

CREATE TABLE `foto_datsogallery_comments` (
  `cmtid` int(10) NOT NULL auto_increment,
  `cmtpic` int(10) NOT NULL default '0',
  `cmtip` varchar(15) NOT NULL default '',
  `cmtname` varchar(20) NOT NULL default '',
  `cmttext` text NOT NULL,
  `cmtdate` varchar(20) default NULL,
  `published` tinyint(1) NOT NULL default '0',
  PRIMARY KEY  (`cmtid`)
)


связываются таблицы так
`foto_datsogallery`.`id`=`foto_datsogallery_comments`.`cmtpic`

в `foto_datsogallery`.`imgoriginalname` хранится имя файла.

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

Как это можно оптимально организовать?

Автор: Kesh 2.9.2008, 09:57
Наверное
Код

if (!file_exists("...")) {
  mysql_query("...");
}

Автор: Gold Dragon 2.9.2008, 10:38
в том то и дело что в папке хранится очень большое количество файлов и их имена конечно генеряться автоматом.. Мне получается нужно получить весь список файлов, сверить с таблицами, если такой файл есть то оставить запись, если в списке такого файла нет - удалить...

просто что-то даже не могу понять как это организовать

Автор: skyboy 2.9.2008, 11:11
фи. не делать же на каждую запись проверку!
делаем отдельную таблицу(можно - temporary), в которую запихиваем одним циклом имена картинок, имеющихся в папке. после чего, сделав left join на эту таблицу, вполне можно будет удалить записи, не имеющих связей с существующими файлами.

Автор: Gold Dragon 2.9.2008, 15:50
skyboy,  smile 
чёрт, совсем не подумал об этом.... А я тутвсякие циклы придумываю..

А как мне перебрать все файлы в папке? просто с файлами не очень хорошо работаю... smile

Автор: solenko 2.9.2008, 16:12
Gold Dragon, для этой задачи проще всего результат ls. Где-то так:
Код

exec('ls -1', $files);
$sql = 'INSERT INTO tmp_table VALUES (\''.join('\'),(\''), $files);

Автор: gta4kv 2.9.2008, 16:40
есть к файлу идёт обращение не напрямую, а через скрипт, то лучше сделать как сказал(о/а) Kesh.

Автор: skyboy 2.9.2008, 16:43
можно воспользоваться http://ua2.php.net/glob, который за один вызов тебе вернет список файлов.

Автор: Gold Dragon 3.9.2008, 10:27
glob понравился smile

вот только не сображу как запрос то  составить...  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)