[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Очистка каталога от не нужных фото
Страницы: 1, 2, 3, 4
segazav
Здравствуйте!

Написал код для очистки каталога с фото "foto" от не нужных файлов (файлов путей к которым нет в базе данных):


foreach (glob("foto/*.*") as $filename)
{
$filename = basename($filename);
$file = "foto/". $filename;
$result1212 = mysql_query ("SELECT id FROM doska WHERE foto_mini1='$file'
OR foto_mini2='
$file'
OR foto_mini3='
$file'
OR foto_mini4='
$file'
OR foto_mini5='
$file'
OR foto_mini6='
$file'
OR foto_big1='
$file'
OR foto_big2='
$file'
OR foto_big3='
$file'
OR foto_big4='
$file'
OR foto_big5='
$file'
OR foto_big6='
$file'",$db);
$myrow1212 = mysql_fetch_array ($result1212);

if (!$myrow1212 = mysql_fetch_array ($result1212)) // если нет такой записи в таблице
{
if (unlink($file)) echo "$file<br>";
}
/*$i++;
if ($i==100) break; // Задаём количество выполнения циклов*/

}


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

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
segazav
А как включить вывод ошибок?
Доступ есть точно потому, что удаляются файлы.
Игорь_Vasinsky
ну может права у папки не те.

вывод ошибок
поставь в начале скрипта
error_reporting(1);
ini_set("display_errors", 1);


_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
kaww
1. Условие всегда true, правильно:
if (!($myrow1212 = mysql_fetch_array ($result1212))) // если нет такой записи в таблице
или (т.к. в дальнейшем myrow1212 не используется)
if (!mysql_fetch_array ($result1212)) // если нет такой записи в таблице

2. Алгоритм составлен таким образом, что он просто положит сервер БД т.к. выполняется запрос для каждого файла! (а что если их 1кк?). Лучше сначала получить все имена из базы а затем удалить те файлы, имен которых нет.
segazav
Можете показать на примере, как это сделать, не могу понять
Игорь_Vasinsky
Перед тем как писать код - нарисуй на бумаге блок схему алгоритма с возможными последствиями.

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

var_dump($var) - покажет что внутри переменной

дебажить нужно последовательно - строку за строкой - а не наугад.

$sql = "your sql query";
$res = mysql_query($sql);

if($res === false)
echo 'Error: '.mysql_error();
else{
if(mysql_num_rows($res) == 0)
echo 'Empty result';
else{
while($r = mysql_fetch_assoc($res)){
$files[] = $r['ячейка с адресом файла'];
}
}
}


if(isset($files)){
foreach($files as $file){
if(!unlink($file)){
'Not deleted: '.$file.'<br/>';
else
'Deleted: '.$file.'<br/>';
}
}
}


_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
segazav
А если несколько ячеек, как создать запись?


$files[] = $r['ячейка с адресом файла'];


И еще в вашем коде какая то синтаксическая ошибка.
Игорь_Vasinsky

Цитата
А если несколько ячеек, как создать запись?

нужные колонки добавляешь в $files[]

Цитата
И еще в вашем коде какая то синтаксическая ошибка.


if(isset($files)){
foreach($files as $file){
if(!unlink($file)){
'Not deleted: '.$file.'<br/>';
}
else{
'Deleted: '.$file.'<br/>';
}
}
}


пишу сразу сюда, тут нет подсветки.

и помогает включить свои мозги при использовании чужого кода для ТС - т.е. тебе

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
segazav
т.е. заносить в запись по очереди каждую ячейку в $r (foto_mini1, foto_mini2, и т.д.)?

$files[] = $r['foto_mini1'];
segazav
Вот так верно?

$res = mysql_query ("SELECT foto_mini1 FROM doska",$db);

if($res === false)
echo 'Error: '.mysql_error();
else{
if(mysql_num_rows($res) == 0)
echo 'Пустой результат!';
else{
while($r = mysql_fetch_assoc($res)){
$files[] = $r['foto_mini1'];
}
}
}


if(isset($files)){
foreach($files as $file){
if(!unlink($file)){
'Файл не удален: '.$file.'<br/>';
}
else{
'Файл удален: '.$file.'<br/>';
}
}
}


*Почему спрашиваю, потому что боюсь пробовать, дабы не удалить лишние файлы
Игорь_Vasinsky
Цитата
т.е. заносить в запись по очереди каждую ячейку в $r (foto_mini1, foto_mini2, и т.д.)?


  else{
while($r = mysql_fetch_assoc($res)){
$files[] = $r['foto_mini1'];
$files[] = $r['foto_mini2'];
//...
}
}


_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Kusss
вы сейчас обратное от желаемого получите. Удалите файлы которые ЕСТЬ в базе.
Kusss
// Открыть папку
$dh = opendir('папка с файлами');
while (false !== ($filename = readdir($dh))) {
// собрать все файлы
if ( $filename != "." && $filename != ".."){
$file_dir[] = $filename ;
}
}

closedir($dh);
// Расхождение массивов
$file_delete = array_diff($file_dir, $files);
if (is_array($result )) {
echo 'Удалять:<br>';
print_r($file_delete);
}
killer8080
$files = array_map('basename', glob("foto/*.*"));
$files_sql = "'".implode("', '", $files_sql)."'";

$result = mysql_query("
SELECT
foto_mini1, foto_mini2, foto_mini3, foto_mini4, foto_mini5, foto_mini6,
foto_big1, foto_big2, foto_big3, foto_big4, foto_big5, foto_big6
FROM doska
WHERE
foto_mini1 IN (
$files_sql)
OR foto_mini2 IN (
$files_sql)
OR foto_mini3 IN (
$files_sql)
OR foto_mini4 IN (
$files_sql)
OR foto_mini5 IN (
$files_sql)
OR foto_mini6 IN (
$files_sql)
OR foto_big1 IN (
$files_sql)
OR foto_big2 IN (
$files_sql)
OR foto_big3 IN (
$files_sql)
OR foto_big4 IN (
$files_sql)
OR foto_big5 IN (
$files_sql)
OR foto_big6 IN (
$files_sql)
"
);

while ($row = mysql_fetch_row($result)) {
foreach ($row as $file) {
if (!in_array($file, $files))
continue;

foreach (array_keys($files, $file) as $key) {
unset($files[$key]);
}

}
}


foreach ($files as $file) {
unlink('./foto/'.$file);
}
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.