PHP mkdir() не работает

Вот мой код; Я переименовал каталоги, очевидно. ;)

$thepath = "/var/www/vhosts/sub.domain.co.uk/web/apps/storage/".$userclient."/evidence/".$scid."/".$doctype."/";
$testdir = is_dir($thepath); 
if ($testdir == false) {
    mkdir($thepath, 0777);
}

В этом случае применяются следующие переменные;

$userclient = '000';
$scid       = '9263';
$doctype    = 'Insurance Policy';

Итак, путь должен быть;

/var/www/vhosts/sub.domain.co.uk/web/apps/storage/000/evidence/9263/Insurance Policy/

Я знаю, что это работает ВЕЗДЕ в моем коде, у меня есть другие приложения, использующие почти идентичные настройки. Но тот, что выше, похоже, срабатывает на /evidence/ - он устанавливает разрешения на 755, но затем будет создавать каталоги при каждом запуске кода, если я установлю свидетельство на 777 (восьмеричное).

Я получаю следующее сообщение об ошибке, используя;

if (!@mkdir($thepath)) {
    $error = error_get_last();
    echo $error['message'];
}
mkdir(): No such file or directory

Буду очень признателен за любую помощь, я должен закончить это приложение к четвергу - и эта часть загрузки файла - последний бит!

Спасибо!


person Rob Milnes    schedule 25.09.2012    source источник
comment
Скорее всего, он падает на космос ....   -  person BugFinder    schedule 25.09.2012
comment
На это нет никаких шансов, пути в других областях кода работают отлично и работают отлично, в которых также есть пробелы (обратные URL-адреса заменяют пробелы на% 20 - это нормально ^^)   -  person Rob Milnes    schedule 25.09.2012
comment
Но ваш PHP-код не превращает пробел в% 20. Лично я бы избегал пробела обратной косой чертой.   -  person BugFinder    schedule 25.09.2012
comment
Спасибо за комментарии BugFinder, теперь он работает на основе рекурсивных настроек. Я использовал пробелы в каталогах в течение многих лет, и это всегда работало нормально, поэтому я никогда не беспокоился о лишних битах; P   -  person Rob Milnes    schedule 25.09.2012


Ответы (2)


PHP не может найти каталог, в котором вы хотите создать другой каталог.

Вам нужно установить параметр $recursive как true:

mkdir($thepath, 0777, true);
person Daniil Ryzhkov    schedule 25.09.2012
comment
Но код отлично работает в другом месте, он создает каталоги без проблем, один каталог короче. Там, где было бы «000/evidence/9263/Insurance Policy/», в другом месте он создает «000/subimages/9263/picture.jpg» без проблем. :/ - person Rob Milnes; 25.09.2012
comment
@Daniil, хотя предложение установить для рекурсии значение true действительно, код, который вы предлагаете, устанавливает для локальной переменной $recursive значение true и передает ее как режим. - person Michael Krelin - hacker; 25.09.2012
comment
Некоторое время не работал с php. Как можно установить аргумент ключевого слова в php? - person Daniil Ryzhkov; 25.09.2012
comment
Это вообще возможно? Я думаю, что это всего лишь третий параметр (см. мой ответ). Но это не имеет значения, ваш ответ все равно принят;) - person Michael Krelin - hacker; 25.09.2012
comment
@Michael Krelin - хакер, похоже, это действительно невозможно (stackoverflow.com/questions/7704339/). Извините, исправил мой ответ - person Daniil Ryzhkov; 25.09.2012

Может быть, вы хотите попробовать mkdir($path,$mode,true) также создать недостающие ссылки?

person Michael Krelin - hacker    schedule 25.09.2012
comment
Что будет делать ‘$mode, true’? Д: - person Rob Milnes; 25.09.2012
comment
Рассматривали ли вы возможность прочитать документацию по функции php mkdir? - person Michael Krelin - hacker; 25.09.2012
comment
Я да, неправильно прочитал мое заявление, я имею в виду - как это изменит его? Код отлично работает везде, но здесь не работает с одним дополнительным каталогом в глубину. :/ - person Rob Milnes; 25.09.2012
comment
Что ж, если вы создадите каталог /a/b/c там, где существует /a/b, все должно работать нормально. Если у вас есть только /a и вы хотите создать /a/b/c, вам также нужно создать отсутствующий каталог, и для этого и нужен рекурсивный. - person Michael Krelin - hacker; 25.09.2012
comment
Ах, я понимаю, что вы имеете в виду. Я пробовал оба предложения, и оба заработали, так что большое спасибо, ребята. :) - person Rob Milnes; 25.09.2012