Change '0777' string to 0777 octal LITERALLY

别来无恙 提交于 2019-12-01 03:59:47

问题


My code is like

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

but the value of $perm is not in octal, how can I change the data type of the variable to octal? even an alternative method will do


回答1:


As it was mentioned, there is no octal number type. And chmod function receive the second param as integer number. Implicit conversion of $perm does not assume that number is octal. So, you need convert your "octal string" to integer by using appropriate function.

Just use octdec function

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

Or intval

chmod("myFolder/", intval($perm, 8));

P.S.

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)



回答2:


Nothing seemed to work for me so i just created a very stupid solution and I'm just gonna post it here.

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



回答3:


Octal is not a type. Integer is the type.

You want to convert a string to an int, and because of that the string starts with a zero, it will be an octal integer.

Use intval for this:

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



回答4:


I needed to feed the mode component of chmod() as a variable inside a function. I spent sufficient time trying (and failing) to convert the string into an octal while maintaining the 0777 value. In the end, I decided to abandon chmod()/ftp_chmod() and opted for ftp_site() which doesn't choke on string-type mode codes.

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

This worked for me. If this is somehow flawed or not best practice, please explain.

Edit: Some readers may reject this ftp_ solution as cheating because it is not a filesystem function solution. It was a non-issue for me because I was writing a function in a ftp class.



来源:https://stackoverflow.com/questions/28672096/change-0777-string-to-0777-octal-literally

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!