2016-01-14 3 views
1

Я хочу отсоединить файл. Есть сотни сообщений об этом, но я не могу заставить его работать.Php Unlink с относительным путем не работает

Я исполняю свой скрипт:

public_html/dev/admin/delete.php 

Файл Im пытается удалить это по адресу:

public_html/dev/admin/upload/picture.jpeg 

Код:

$sql = "SELECT url FROM news WHERE id='$id'"; 

    $result = db::get_instance()->query($sql); 

    if ($result->num_rows > 0) { 
     while($row = $result->fetch_assoc()) { 
     unlink($row['url']); 
     } 
    } 

Содержание строки URL = upload/picture.jpeg

Теперь почему это не работает. Документация Php говорит, что относительные колодки подходят для использования, если они правы?

EDIT:

Так я узнал, что если я жёстко URL, он работает:

unlink('upload/picture.jpeg'); 

Но когда я использую следующие оно не:

unlink($row[url]); 

Но echo ($row[url]); отпечатки: upload/picture.jpeg

Может ли быть так, что $ row [url] не так tring или что-то еще?

+0

Могут ли быть разрешения? https://en.wikipedia.org/wiki/File_system_permissions –

+0

Я отредактировал мое сообщение с некоторой новой информацией. У меня действительно нет cleu, что происходит! –

+0

Вы уверены, что это не опечатка на ваших дорогах? или у вас действительно есть public_html и общедоступная папка ** k ** _ html? – Tschallacka

ответ

0

Удостоверьтесь, что путь $row['url'] правильный, и файл имеет правильное разрешение.

+0

Я обновил некоторую информацию к своему сообщению. hardcode url действительно работает, но печать строки doesnt. в то время как информация точно такая же. –

0

Это очень и очень хорошая идея всегда использовать подпрограммы файловой системы с абсолютным путем, чтобы не было «относительных» ошибок. Удаление неправильного файла в неправильной папке может быть дорогостоящим!

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

дает вам:

// remove potential double slashes in complete address. 
// Also add trailing slash before the $row 
$currentWD = ltrim(getcwd(),"/")."/"; 

unlink($_SERVER['DOCUMENT_ROOT'].$currentWD.$row['url']); 

Где:

$_SERVER['DOCUMENT_ROOT'] == "home/public_html/" 
getcwd() == "/dev/admin" 
$row['url'] == "upload/picture.jpeg" 

Следует иметь в виду, что в системах Apache (и большинство других, я думаю), что файловая система чувствителен к регистру !!


Также будьте осторожны с использованием кавычки вокруг ключей массива, вы хотите иметь $row['url'] с (одинарный) котировки, а не без кавычек.


EDIT: Некоторые отладка:

  • Что такое echo getcwd()? Это должна быть текущая папка.

  • Является ли ваша строка правильно кодированной символом, так что буквы требуемой файловой системы - это правильные буквы, а не критические или похожие, которые выглядят одинаково, но не совсем одинаковы (я знаю, что это неясно, но. ..)?

0

Укажите разницу?

public_html/dev/admin/upload/picture.png 
            ^^^ 

unlink('upload/picture.jpeg'); 
         ^^^^ 
+0

Да, это было просто опечатка в моем посте. Я нашел решение! –

0

Оке так $row['url'], кажется, получают дополнительные пробелы в ссылке.

Простой trim($row['url']) исправил его!

Спасибо всем!

Смежные вопросы