отвязать и УДАЛИТЬ ИЗ не получится

Я пытаюсь удалить папку из каталога моего сервера. Он содержит одно изображение. Файловая система работает примерно так: «www/comics/0/page1.jpg», где я хотел бы исключить «0». (www — это корневой каталог, в котором находятся все скрипты сайта PHP). Я также пытаюсь удалить комикс из базы данных. Комикс упоминается любыми страницами, помеченными его comicID как внешний ключ.

Мой вопрос заключается в том, как заставить unlink/DELETE FROM выполнять свою работу. В настоящее время сайт не выдает никаких ошибок при запуске и правильно перебирает страницы, но ничего не удаляет. Следует отметить, что я могу без проблем удалить отдельные страницы.

Пара замечаний:

  • Комикс без страниц будет удален из базы данных, но его папка останется в файловой системе.
  • Комикс со страницами ничего не делает и остается как в базе данных, так и в файловой системе.
  • Комикс без каталога файлов будет удален из базы данных. (Каталог файлов создается при создании первой страницы).
  • comicsID берет числовое значение из comicsList, выпадающего списка выбора. Здесь должно быть «0» или так далее, идентификатор комикса, выбранного для удаления, и имя его папки.

Код:

<?php
session_start();
if(isset($_POST['btnEdit']))
{
    $_SESSION['comicID'] = $_POST['comicsList'];
}

if(isset($_POST['btnDelete']))
{
    $_SESSION['comicID'] = $_POST['comicsList'];
    $setComic = $_SESSION['comicID'];
    include_once('includes/conn.inc.php');

    unlink(comics/$setComic);
    mysqli_query($conn, "DELETE FROM comic WHERE comicID = '$setComic'");
    mysqli_close($conn);
    header('Location: myComics.php');
}
?>

person alex494    schedule 05.12.2014    source источник
comment
«папка», а не «корм». Извиняюсь.   -  person alex494    schedule 05.12.2014
comment
Попробуйте unlink("comics/$setComic/$the_image");, затем rmdir("comics/$setComic"); - $the_image является искусственной переменной; вам нужно будет заменить его именем/переменной изображения.   -  person Funk Forty Niner    schedule 05.12.2014
comment
Обновление: выполнение $image = "file.jpg"; $setComic = "0"; unlink("comics/$setComic/$image"); rmdir("comics/$setComic"); сработало для меня, так что это то, что вам нужно сделать/использовать.   -  person Funk Forty Niner    schedule 05.12.2014
comment
это работает сейчас ??.   -  person mydeve    schedule 05.12.2014


Ответы (3)


Это логика, которую вам нужно использовать:

$image = "file.jpg";
$setComic = "0";
unlink("comics/$setComic/$image");
rmdir("comics/$setComic");

Согласно моему комментарию:

"Сначала вам нужно удалить все файлы (или выбранные файлы), а затем удалить папку. отключить не выполняет оба действия."

  • rmdir удаляет каталог, но только работает с пустыми папками.

  • отменить связь удаляет файл, но не удалить папки.

Взято с http://www.paulund.co.uk/php-delete-directory-and-files-in-directory

После того, как все файлы будут удалены, он может удалить каталог с помощью функции rmdir.

<?php
function delete_directory($dirname) {
         if (is_dir($dirname))
           $dir_handle = opendir($dirname);
     if (!$dir_handle)
          return false;
     while($file = readdir($dir_handle)) {
           if ($file != "." && $file != "..") {
                if (!is_dir($dirname."/".$file))
                     unlink($dirname."/".$file);
                else
                     delete_directory($dirname.'/'.$file);
           }
     }
     closedir($dir_handle);
     rmdir($dirname);
     return true;
}
?>

Более чистая версия Льюиса Коулза

Увидев этот фрагмент PHP, Льюис ушел и улучшил код, сократив его до 9 строк кода. Это здорово, когда люди берут эти фрагменты и улучшают их, так как это помогает всем узнать немного больше о коде.

Вот фрагмент, который удалось придумать Льюису.

<?php
/* 
 * php delete function that deals with directories recursively
 */
function delete_files($target) {
    if(is_dir($target)){
        $files = glob( $target . '*', GLOB_MARK ); //GLOB_MARK adds a slash to directories returned

        foreach( $files as $file )
        {
            delete_files( $file );      
        }

        rmdir( $target );
    } elseif(is_file($target)) {
        unlink( $target );  
    }
}
?>

Затем для отладки/устранения неполадок:

Добавьте отчеты об ошибках вверху ваш файл(ы), которые помогут найти ошибки.

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// rest of your code

Примечание. Отчеты об ошибках следует создавать только на стадии подготовки, а не в рабочей среде.

а также с or die(mysqli_error($conn)) по mysqli_query()

person Funk Forty Niner    schedule 05.12.2014

попробуйте указать правильный путь к файлу, например

unlink('comics/'.$setComic); // use path with quote and concat php var to path
person Rakesh Sharma    schedule 05.12.2014
comment
Это ни на что не повлияло, к сожалению. - person alex494; 05.12.2014
comment
Так должно быть. Пытаюсь удалить папку comics/0/ и якобы все внутри /0/. - person alex494; 05.12.2014
comment
@ alex494 Сначала вам нужно удалить все файлы (или выбранные файлы), а затем удалить папку. unlink не выполняет оба действия. Взгляните на paulund.co.uk/php- удалить-каталог-и-файлы-в-каталоге и developphp.com/ page.php?id=559 — Примечание: rmdir работает только с пустыми папками php.net/manual/en/function.rmdir.php - person Funk Forty Niner; 05.12.2014

Строку нужно исправить:

unlink(comics/$setComic);

To:

unlink('comics/'.$setComic);

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

person Pupil    schedule 05.12.2014
comment
/comics/ — это папка. Я удаляю внутри нее еще одну папку «0». - person alex494; 05.12.2014