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

Форум PHP

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

 

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

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

тема: Удаление файлов
 
 автор: Buhen   (04.07.2008 в 10:16)   письмо автору
 
 

Доброго всем времни суток! Данный скрипт сопоставляет названия файлов с теми что в бд. если названия файла в бд нет, файл удаляется с сервера. Поле pictures TEXT и в нем храняется названия типа 34sfnsd034534|23423sdf345435vfd546| и тд. Но почему то ничего не удаляется и ошибки нету. Расширение картинок, хранящихся на сервере - jpg.


<?
$dir 
opendir("car_img/medium/");  

while((
$file readdir($dir))) 
  { 
     
    if(
is_file($file)) 
      { 
        
$file substr($file0, -4);

    
$query "SELECT * FROM umc_cars WHERE pictures LIKE '$file'";
    
$result mysql_query($query);

    if (
mysql_num_rows($result) == '0'
    {
     
unlink ("car_img/medium/".$file.".jpg");
    }




      } 
  } 
    
closedir($dir);
?>

   
 
 автор: Miha_Kregoff   (04.07.2008 в 11:37)   письмо автору
 
   для: Buhen   (04.07.2008 в 10:16)
 

что по вашему делает эта строчка?

$query = "SELECT * FROM umc_cars WHERE pictures LIKE '$file'";

   
 
 автор: Buhen   (04.07.2008 в 11:47)   письмо автору
 
   для: Miha_Kregoff   (04.07.2008 в 11:37)
 

выбирает из таблицы umc_cars все строки с полем pictures где есть совпадение переменной $file.
Я решил сделать так но не получается почему то(

<?
    $query 
"SELECT * FROM umc_cars";
    
$result mysql_query($query);
    
$row=mysql_fetch_assoc($result);

    
$pics explode("|"$row["pictures"]);



$dir opendir("car_img/medium/");  
while((
$file readdir($dir))) 
  { 
    if(
is_file($file)) 
      { 
        
$file substr($file0, -4);    
    
//if (mysql_num_rows($result) == '0') 
    
if($file != $pics)
    {
     
unlink ("car_img/medium/".$file.".jpg");
    }

      } 
  } 
    
closedir($dir);

?>



В рез-те ничего не удаляется(((

   
 
 автор: Trianon   (04.07.2008 в 11:54)   письмо автору
 
   для: Buhen   (04.07.2008 в 11:47)
 

Вы бы объяснили, что содержит поле pictures в этой таблице, и почему его нужно резать по | .

В последнем скрипте Вы пытаетесь сравнивать строку ($file) с массивом ($pics).
Само собой - ничего не выходит.

   
 
 автор: Miha_Kregoff   (04.07.2008 в 11:58)   письмо автору
 
   для: Trianon   (04.07.2008 в 11:54)
 

тогда что такое LIKE ? не очень понятна структура базы и именно данный запрос

   
 
 автор: Buhen   (04.07.2008 в 12:02)   письмо автору
 
   для: Miha_Kregoff   (04.07.2008 в 11:58)
 

я просто хотел запросом выбрать все записи с полем pictures где встречается переменная $file.

   
 
 автор: Buhen   (04.07.2008 в 11:59)   письмо автору
 
   для: Trianon   (04.07.2008 в 11:54)
 

а как надо сделать??? напишите

Поле pictures тип TEXT содержит названия изображений только без расширений ну например:
1880943c61b854c9b89fbc5ba0cb2e2f|de0450e568ef4de8f4dbc97d600ce82d|3367b23947c6ef344bdd08c0631cd772|04e17d89cda21ca08669c7db1d286595|
ну и так далее. Надо разбить на разделетели что я сделал и затем подставить расширение и сделать условие - если файл на сервере есть а названия в поле pictures нету то удалить данный файл с сервера. Ибо много всяких ненужных файлов вроде.

   
 
 автор: Buhen   (04.07.2008 в 12:14)   письмо автору
 
   для: Buhen   (04.07.2008 в 11:59)
 

Сделал так но ничего не удаляется.

<? 
    $query 
"SELECT * FROM umc_cars"
    
$result mysql_query($query); 
    
$row=mysql_fetch_assoc($result); 

    
$pics explode("|"$row["pictures"]); 



$dir opendir("car_img/medium/");   
while((
$file readdir($dir)))  
  {  
    if(
is_file($file))  
      {  
        
$file substr($file0, -4);     

 if (!
in_array($file$pics))
    { 
     
unlink ("car_img/medium/".$file.".jpg"); 
    } 

      }  
  }  
    
closedir($dir); 

?>

   
 
 автор: Trianon   (04.07.2008 в 12:20)   письмо автору
 
   для: Buhen   (04.07.2008 в 11:59)
 

>а как надо сделать??? напишите
>
>Поле pictures тип TEXT содержит названия изображений только без расширений ну например:
>1880943c61b854c9b89fbc5ba0cb2e2f|de0450e568ef4de8f4dbc97d600ce82d|3367b23947c6ef344bdd08c0631cd772|04e17d89cda21ca08669c7db1d286595|
>ну и так далее. Надо разбить на разделетели что я сделал и затем подставить расширение и сделать условие - если файл на сервере есть а названия в поле pictures нету то удалить данный файл с сервера. Ибо много всяких ненужных файлов вроде.

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

запрос, который проверил бы наличие имени в таком списке, будет выглядеть как-то так:
$query = "SELECT COUNT(*) FROM umc_cars 
  WHERE pictures = '$file' 
    OR pictures LIKE '%|$file|%' 
    OR pictures LIKE '$file|%'
    OR pictures LIKE '%|$file' " ;
$res = mysql_query($query) OR die( "error in $query: ".  mysql_error());
if(mysql_result($res, 0) == 0) //если ни одной строки нет
    удаляем файл. 


потому что имя может быть в середине, в начале , в конце списка, так и единственным вообще.

Работать эта конструкция должна изрядно долго.
А всё потому, что кучу элементов данных в одной ячейке таблицы в БД не хранят.
Хранят отдельными строками.

PS. Я Вам настоятельно советую, пока не завершите отладку подобного рода скриптов, вместо unlink писать echo. Чтобы сперва посмотреть, что именно вы собираетесь грохнуть. Иначе снесете нахрех весь каталог из-за какой-нибудь мелочи.

   
 
 автор: Buhen   (04.07.2008 в 12:49)   письмо автору
 
   для: Trianon   (04.07.2008 в 12:20)
 

странно вообще белая страница и ничего не удаляет(
поставил счетчик на цикл - ниразу не выполнился(((

   
 
 автор: Trianon   (04.07.2008 в 12:54)   письмо автору
 
   для: Buhen   (04.07.2008 в 12:49)
 

так может у Вас там и нет лишних файлов?

Код Вы не показали.

   
 
 автор: Buhen   (04.07.2008 в 12:54)   письмо автору
 
   для: Buhen   (04.07.2008 в 12:49)
 

Все работает:) только почему то ошибка
Warning: unlink(car_img/medium/Thumb.jpg) [function.unlink]: No such file or directory
у меня и так его нету

   
 
 автор: Trianon   (04.07.2008 в 13:01)   письмо автору
 
   для: Buhen   (04.07.2008 в 12:54)
 

может он не jpg?
Вы так спокойно ото всех имен отдираете расширения и приклеиваете jpg, что могли под гребенку еще какой-нибудь тип замести.

   
Rambler's Top100
вверх

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