У меня проблема, и я не могу ее решить. Я пытаюсь удалить файл и выводить сообщение об успешном завершении, но при установке он удаляет файл, но возвращает false. Вот мой код:

if(unlink(".".MEDIA_PATH."/$av")){          
    exit(header("Location: page.php?&msg=success"));
}
else{
    exit(header("Location: page.php?msg=fail"));    
}

DanFromGermany мне помог! Решение: не используйте Windows для программирования, используйте Linux :) Ошибка возникла из-за того, что я использую localhost в ОС Windows.

1
Luka Rogovic 23 Сен 2014 в 19:37

4 ответа

Лучший ответ

Я немного изменил ваш код.

Сначала проверьте наличие файла, затем удалите.

$file = '.' . MEDIA_PATH . '/' . $av;

if (file_exists($file)) {
    if (unlink($file)) {          
        header("Location: page.php?msg=success");
    } else {
        header("Location: page.php?msg=fail&reason=cannot-delete");
    }
} else {
    header("Location: page.php?msg=fail&reason=file-not-exists");
}

exit;

Обновление:

Известно, что unlink() иногда дает сбой в системах Windows.

1
Daniel W. 24 Сен 2014 в 13:46

Убедитесь, что файл существует, прежде чем удалять его с помощью функции «file_exists» («unlink» может быть вызван при одновременном вызове двух экземпляров, но это не имеет значения для тестирования).

$filePath = "." . MEDIA_PATH . "/$av";
if( !file_exists($filePath) ) {
    echo "File does not exist: $filePath";
    exit(1);
} else if( unlink($filePath) ) {
    exit(header("Location: page.php?&msg=success"));
} else{
    exit(header("Location: page.php?msg=fail"));    
}

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

Вы также можете использовать xdebug с перерывами для тестирования вашего кода.

0
Pedro Amaral Couto 23 Сен 2014 в 16:54

Я нашел решение, но оно не самое лучшее. Если у вас есть, пожалуйста, помогите мне.

Это мое решение:

$del_file=".".MEDIA_PATH."/$av"; 

// Deleting file from server
@unlink($del_file); 

if(!file_exists($del_file)){                
    exit(header("Location: page.php?&msg=success"));
}
else{
    exit(header("Location: page.php?&msg=fail"));   
}

Он по-прежнему дает мне ошибку false при unlink (), поэтому я добавил оператор @ в unlink (), чтобы замаскировать его, но это не то, что я хочу. Имеет ли это значение, потому что я нахожусь на локальном хосте (Windows), а не на живом сервере?

Похоже, что func unlink () запускается дважды, и в первый раз, когда он удаляет файл, и второй раз, он возвращает ложную ошибку, потому что не может найти указанный файл.

0
Luka Rogovic 24 Сен 2014 в 12:50

Лука Рогович:

Похоже, что func unlink () запускается дважды, и в первый раз, когда он удаляет файл, и второй раз, он возвращает ложную ошибку, потому что не может найти указанный файл.

Попробуй это:

$filePath = "." . MEDIA_PATH . "/$av";

if( !filter_has_var(INPUT_GET, 'msg') ) {
    if( !file_exists ) {
        exit(header("Location: page.php?msg=fail&reason=file-does-not-exist")); 
    } else if( unlink($filePath) ) {
        exit(header("Location: page.php?&msg=success"));
    } else{
        exit(header("Location: page.php?msg=fail&reason=cannot-delete"));
    }
}

Я считаю, что «page.php» вызывается дважды, а «unlink» - дважды.

Условие "! Filter_has_var (INPUT_GET, 'msg')" предотвращает это.

Тем не менее, вы должны понимать, почему «решения» работают: используйте «Проверить элемент» в своем браузере, чтобы проанализировать перенаправления, и используйте xdebug, чтобы увидеть, не вызывается ли «unlink» дважды.

0
Pedro Amaral Couto 24 Сен 2014 в 16:31