Измените строку ‘0777’ на 0777 восьмерично ВСЕГДА

Мой код похож

$perm = "0777"; //this is fetch from the database
chmod("myFolder/", $perm);

но значение $ perm не в восьмеричном виде, как я могу изменить тип данных переменной на восьмеричное? даже альтернативный метод подойдет

5

Решение

Как уже упоминалось, восьмеричного числа не существует. И функция 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)
7

Другие решения

Казалось, ничего не работает для меня, поэтому я просто создал очень глупое решение, и я просто опубликую его здесь.

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));
1

Восьмеричный не тип. Целое число — это тип.

Вы хотите преобразовать строку в int, и потому строка начинается с нуля, это будет восьмеричное целое число.

использование intval за это:

chmod('myFolder/', intval($perm));
0

Мне нужно было кормить компонент режима chmod() как переменная внутри функции. Я потратил достаточно времени, пытаясь (и не смог) преобразовать строку в восьмеричное, сохраняя при этом значение 0777. В итоге я решил отказаться chmod()/ftp_chmod() и выбрал ftp_site() который не душит коды режима строкового типа.

if(!ftp_site($connection,"chmod {$mode} {$path}/{$file}")){
// handle the error
}

Это сработало для меня. Если это как-то ошибочно или не лучшая практика, пожалуйста, объясните.

Изменить: Некоторые читатели могут отклонить это решение ftp_ как мошенничество, потому что это не решение функции файловой системы. Это было не проблема для меня, потому что я писал функцию в классе ftp.

0