Мой код похож
$perm = "0777"; //this is fetch from the database
chmod("myFolder/", $perm);
но значение $ perm не в восьмеричном виде, как я могу изменить тип данных переменной на восьмеричное? даже альтернативный метод подойдет
Как уже упоминалось, восьмеричного числа не существует. И функция chmod получает второй параметр в виде целого числа. Неявное преобразование $perm
не предполагает, что число является восьмеричным. Итак, вам нужно преобразовать вашу «восьмеричную строку» в целое число с помощью соответствующей функции.
Просто используйте OctDec функция
$perm = "0777"; //this is fetch from the database
chmod("myFolder/", octdec($perm));
Или же intval
chmod("myFolder/", intval($perm, 8));
Постскриптум
var_dump('0644' == 0644); // bool(false)
var_dump(intval('0644') == 0644); // bool(false)
var_dump(decoct('0644') == 0644); // bool(false)
var_dump(octdec('0644') == 0644); // bool(true)
var_dump(intval('0644', 8) == 0644); // bool(true)
Казалось, ничего не работает для меня, поэтому я просто создал очень глупое решение, и я просто опубликую его здесь.
function permtooct($permissions) {
$mode = 0;
if ($permissions[0] == '1') $mode += 01000;
if ($permissions[0] == '2') $mode += 02000;
if ($permissions[0] == '3') $mode += 03000;
if ($permissions[0] == '4') $mode += 04000;
if ($permissions[0] == '5') $mode += 05000;
if ($permissions[0] == '6') $mode += 06000;
if ($permissions[0] == '7') $mode += 07000;
if ($permissions[1] == '1') $mode += 0100;
if ($permissions[1] == '2') $mode += 0200;
if ($permissions[1] == '3') $mode += 0300;
if ($permissions[1] == '4') $mode += 0400;
if ($permissions[1] == '5') $mode += 0500;
if ($permissions[1] == '6') $mode += 0600;
if ($permissions[1] == '7') $mode += 0700;
if ($permissions[2] == '1') $mode += 010;
if ($permissions[2] == '2') $mode += 020;
if ($permissions[2] == '3') $mode += 030;
if ($permissions[2] == '4') $mode += 040;
if ($permissions[2] == '5') $mode += 050;
if ($permissions[2] == '6') $mode += 060;
if ($permissions[2] == '7') $mode += 070;
if ($permissions[3] == '1') $mode += 01;
if ($permissions[3] == '2') $mode += 02;
if ($permissions[3] == '3') $mode += 03;
if ($permissions[3] == '4') $mode += 04;
if ($permissions[3] == '5') $mode += 05;
if ($permissions[3] == '6') $mode += 06;
if ($permissions[3] == '7') $mode += 07;
return($mode);
}
$a = "0777";
chmod("myFolder/", permtooct($a));
Восьмеричный не тип. Целое число — это тип.
Вы хотите преобразовать строку в int, и потому строка начинается с нуля, это будет восьмеричное целое число.
использование intval за это:
chmod('myFolder/', intval($perm));
Мне нужно было кормить компонент режима chmod()
как переменная внутри функции. Я потратил достаточно времени, пытаясь (и не смог) преобразовать строку в восьмеричное, сохраняя при этом значение 0777. В итоге я решил отказаться chmod()
/ftp_chmod()
и выбрал ftp_site()
который не душит коды режима строкового типа.
if(!ftp_site($connection,"chmod {$mode} {$path}/{$file}")){
// handle the error
}
Это сработало для меня. Если это как-то ошибочно или не лучшая практика, пожалуйста, объясните.
Изменить: Некоторые читатели могут отклонить это решение ftp_ как мошенничество, потому что это не решение функции файловой системы. Это было не проблема для меня, потому что я писал функцию в классе ftp.