Удаление файлов с сервера

Статус
Закрыто для дальнейших ответов.

alexander_dog

Well-Known Member
Регистрация
19.12.2009
Сообщения
80
Здравствуйте ВСЕ!!!
Назрел вопрос про удаление выбранной группы файлов с сервера.

Для удаления одного файла используем вот этот код

PHP:
<?php
$filename = 'c:/123.jpg';
unlink($filename);  
  // удаляем файл с именем 
  // c:/123.jpg
?>
А как удалить группу выбранных файлов ?

Приведу ниже код выбора файлов при удаллении из базы данных

Отмечаем нужные файлы index.php

PHP:
<form action="delit.php" method="post">
<?php
$as=$_SESSION['user'];
echo "<table width='600' border='0' cellspacing='0' cellpadding='0' align='center'><tr>";
$result22 = mysql_query ("SELECT * FROM user WHERE name = '$as' ORDER BY id ",$db);
if (empty($result22))
{
echo "<div class='text' align='center'><hr>У меня ещё нет файлов.</div>";
echo "</tr></table>";
}
else
{ echo $myrow["text2"];
while($myrow22 = mysql_fetch_array($result22))
{$myres22[]=$myrow22;}
for($i=0;$i<count($myres22);$i++)
{
printf("<td align='center' width='260' valign='top'><p class='text_ishodnik'>Дата : %s</p><p class='text_ishodnik'>Размер : %s x %s</p>
<input name='iid[]' type='checkbox' value='%s'>
<a href='%s' rel='lightbox' class='text_ishodnik' alt='%s' title='%s'><img src='%s' alt='%s' title='%s' class='border'><br>%s</a><br><br>
</td>",$myres22[$i]["data"],$myres22[$i]["wid"],$myres22[$i]["hei"],$myres22[$i]["id"],$myres22[$i]["file_big"],
$myres22[$i]["text"],$myres22[$i]["text"],$myres22[$i]["file"],$myres22[$i]["text"],$myres22[$i]["text"],$myres22[$i]["text"]);
if(($i+1)%$k==0) {echo "</tr><tr>";}
else {}}
echo "</tr></table>";
echo"<p> <input name='submit' type='submit' class='sbutton' value='Удалить'></p>
</form>"; }
?>
Обработчик delit.php

PHP:
<?php
// Удалить сразу несколько записей можно при
// помощи запроса "DELETE FROM base WHERE id IN (1,3,5,7)"
// Получаем список отмеченных флажков
$type = $_POST['iid'];
if(!empty($type))
{
// Начинаем формировать переменную, содержащую этот список
// в формате "(3,5,6,7)"
$query = "(";
foreach($type as $val) $query .= "$val,";
// Удаляем последнюю запятую, заменяя её закрывающей скобкой )
$query = substr($query, 0, strlen($query) - 1).")";
// Завершаем формирование SQL-запроса на удаление
$query = "DELETE FROM user WHERE id IN ".$query;
// Выполняем запрос
if(!mysql_query($query))
{
echo mysql_error()."<br>";
echo $query."<br>";
}
}
if ($query == 'true') {echo "<p class='text_2'><br><br><b>Выбранные файлы не удалены ! Попробуйте ещё раз !</b></p> <p>Переадресация ...</p>";
/* Здесь происходит рефреш */
echo "<html><head>
<meta http-equiv='Refresh' content='5; URL=index.php'>
</head></html>";
}
else 
{
$filename = $type;
unlink($filename); // удаляем файл с именем $type

echo "<p class='text_2'><br><br><b> Выбранные файлы удалены !</b></p>";
/* Здесь происходит рефреш */
echo "<html><head>
<meta http-equiv='Refresh' content='5; URL=index.php'>
</head></html>";
}
?>
Выдаёт ошибку:
Warning: unlink() expects parameter 1 to be string, array given in Z:\home\localhost\www\delit.php

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

PHP:
else 
{
$filename = $type; // $type - массив имён удаляемых файлов
unlink($filename); // удаляем файл с именем $type

echo "<p class='text_2'><br><br><b> Выбранные файлы удалены !</b></p>";
 

blackcot

Well-Known Member
Регистрация
10.09.2009
Сообщения
439
Ошибка звучит так - unlink() принимает 1 параметр строкового типа, текущий параметр - массив.
Попробуйте заменить
Код:
...
$filename = $type; // $type - массив имён удаляемых файлов 
unlink($filename); // удаляем файл с именем $type
...
на
Код:
foreach ($type as $filename)
{
unlink($filename);
}
 

alexander_dog

Well-Known Member
Регистрация
19.12.2009
Сообщения
80
Ксожалению вот - Warning: unlink(242) [function.unlink]: No such file or directory in Z:\home\localhost\www\delit.php
 

blackcot

Well-Known Member
Регистрация
10.09.2009
Сообщения
439
Что у Вас передается параметру id в POST запросе?
Соответственно - что передается переменной $type?
Ошибка сообщает, что нет такого файла или директории.

Если переменной $type передается массив имен файлов, то имена должны быть полностью, т.е. с расширением.
Также, в зависимости от настроек PHP, необходимо указать полный путь к файлу (лучше при помощи $_SERVER['DOCUMENT_ROOT']).

Ошибся вот здесь
...Что у Вас передается параметру id в POST запросе?...
Не id, а iid
 

ZitosS_32

Совесть
Регистрация
12.03.2006
Сообщения
852
Ошибка ругается, на то, что вы пытаетесь удалить файл, которого не существует. Советую вам распечатать ваш массив перед удалением с помощью print_r или var_dump, проверить пути.
Если относительные, они должны исходить от файла где исполняется команда. То есть к примеру у вас есть файл index.php и в него включается скрипт, удаляющий файлы delit.php, лежащий совсем в друго

Ошибка ругается, на то, что вы пытаетесь удалить файл, которого не существует. Советую вам распечатать ваш массив перед удалением с помощью print_r или var_dump, проверить пути.
Если относительные, они должны исходить от файла где исполняется команда. То есть к примеру у вас есть файл index.php и в него включается скрипт, удаляющий файлы delit.php, лежащий совсем в другой папке. Так вот, пути тогда надо строить относительно index.php
Если у вас абсолютные пути, то проверьте правильность путей до удаляемых файлов.
 

alexander_dog

Well-Known Member
Регистрация
19.12.2009
Сообщения
80
Спасибо огромное всем за Ваши отклики, поразмыслив тут на досуге и внимательно ещё раз просмотрев код, обнаружил не соответствие, заключается оно в следующем:

судя по коду файла delit.php мы удаляем данные из базы, а уж потом удаляем данные с винта, а надо то наоборот, сначала с винта и уже потом из базы.

Ну вот сейчас всё и проверим, как это всё будет робить =)
 

blackcot

Well-Known Member
Регистрация
10.09.2009
Сообщения
439
...судя по коду файла delit.php мы удаляем данные из базы, а уж потом удаляем данные с винта, а надо то наоборот, сначала с винта и уже потом из базы....
По идее - да, но в данном коде это без разницы, т.к. имена файлов у Вас хранятся в массиве $type, надо просто полный путь до них прописать.
 

alexander_dog

Well-Known Member
Регистрация
19.12.2009
Сообщения
80
Прошу прощения :blush: в массиве $type хранится вот это(если выбрать один файл) -
информация получена через print_r ($type);
Array ( [0] => 237 )
и (если выбрать много файлов) -
Array ( [0] => 243 [1] => 238 [2] => 237 )
// Получаем список отмеченных флажков
PHP:
$type = $_POST['iid'];
это id...

PHP:
<?php
// Удалить сразу несколько записей можно при
// помощи запроса "DELETE FROM base WHERE id IN (1,3,5,7)"
// Получаем список отмеченных флажков
$type = $_POST['iid'];
//print_r ($type);
if(!empty($type))
{

// Начинаем формировать переменную, содержащую этот список
// в формате "(3,5,6,7)"
$query = "(";
foreach($type as $val) $query .= "$val,";
// Удаляем последнюю запятую, заменяя её закрывающей скобкой )
$query = substr($query, 0, strlen($query) - 1).")";
// Завершаем формирование SQL-запроса на удаление

////////дополнение - извлекаем адрес картинки...

$queryimg = "SELECT * FROM user WHERE id IN ".$query;
$resultimg = mysql_query($queryimg);
$myrowimg = mysql_fetch_array($resultimg);
//echo "<img src=$myrowimg[avatar]><img src=$myrowimg[avatar_big]>";
$filename = "$myrowimg[avatar]"; // $myrowimg[avatar] - удаляемый файл
unlink($filename); // удаляем файл с именем $myrowimg[avatar]
$filename = "$myrowimg[avatar_big]"; // $myrowimg[avatar_big] - удаляемый файл
unlink($filename); // удаляем файл с именем $myrowimg[avatar_big]

////////

$query = "DELETE FROM user WHERE id IN ".$query;
// Выполняем запрос
if(!mysql_query($query))
{
//echo mysql_error()."<br>";
//echo $query."<br>";
}
}
if ($query == 'true') {echo "<p class='text_2'><br><br><b>Выбранные файлы не удалены ! Попробуйте ещё раз !</b></p> <p>Переадресация ...</p>";
/* Здесь происходит рефреш */
echo "<html><head>
<meta http-equiv='Refresh' content='5; URL=index.php'>
</head></html>";
}
else 
{
echo "<p class='text_2'><br><br><b> Выбранные файлы успешно удалены !</b></p>";
/* Здесь происходит рефреш */
echo "<html><head>
<meta http-equiv='Refresh' content='5; URL=index.php'>
</head></html>";
}
?>
В таком виде работает, но удаляет только по одному файлу, как удалить сразу несколько ?
Думаю, что надо загнать выбранные файлы в массив, но не знаю как это сделать :| подскажите =)

PHP:
////////дополнение - извлекаем адрес картинки...

$queryimg = "SELECT * FROM user WHERE id IN ".$query;
$resultimg = mysql_query($queryimg);
$myrowimg = mysql_fetch_array($resultimg);
//echo "<img src=$myrowimg[avatar]><img src=$myrowimg[avatar_big]>";
$filename = "$myrowimg[avatar]"; // $myrowimg[avatar] - удаляемый файл
unlink($filename); // удаляем файл с именем $myrowimg[avatar]
$filename = "$myrowimg[avatar_big]"; // $myrowimg[avatar_big] - удаляемый файл
unlink($filename); // удаляем файл с именем $myrowimg[avatar_big]

////////
 

blackcot

Well-Known Member
Регистрация
10.09.2009
Сообщения
439
Вместо
Код:
////////дополнение - извлекаем адрес картинки... 
 
$queryimg = "SELECT * FROM user WHERE id IN ".$query; 
$resultimg = mysql_query($queryimg); 
$myrowimg = mysql_fetch_array($resultimg); 
//echo "<img src=$myrowimg[avatar]><img src=$myrowimg[avatar_big]>"; 
$filename = "$myrowimg[avatar]"; // $myrowimg[avatar] - удаляемый файл 
unlink($filename); // удаляем файл с именем $myrowimg[avatar] 
$filename = "$myrowimg[avatar_big]"; // $myrowimg[avatar_big] - удаляемый файл 
unlink($filename); // удаляем файл с именем $myrowimg[avatar_big] 
 
////////
Пишите
Код:
////////дополнение - извлекаем адрес картинки... 
 
$queryimg = "SELECT * FROM user WHERE id IN ".$query; 
$resultimg = mysql_query($queryimg); 
while ($myrowimg = mysql_fetch_array($resultimg))
{ 
//echo "<img src=$myrowimg[avatar]><img src=$myrowimg[avatar_big]>"; 
$filename = "$myrowimg[avatar]"; // $myrowimg[avatar] - удаляемый файл 
unlink($filename); // удаляем файл с именем $myrowimg[avatar] 
$filename = "$myrowimg[avatar_big]"; // $myrowimg[avatar_big] - удаляемый файл 
unlink($filename); // удаляем файл с именем $myrowimg[avatar_big]
}
 
////////
Должно помочь
 

alexander_dog

Well-Known Member
Регистрация
19.12.2009
Сообщения
80
Помогло, УРА !!! =))) Всё работает, как часы !!! Спасибо ВАМ огромное !!!
 
Статус
Закрыто для дальнейших ответов.
Верх Низ