2015-02-23 16 views
5

Il mio codice è comeChange '0777' stringa da 0777 ottale LETTERALMENTE

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

ma il valore di $ perm non è in ottale, come posso cambiare il tipo di dati della variabile a ottale? anche un metodo alternativo lo farà

risposta

0

Octal non è un tipo. Integer è il tipo.

Si desidera convertire una stringa in un int, e per questo la stringa inizia con uno zero, sarà un numero intero ottale.

Usa intval per questo:

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

Questo non funzionerà, perché questa stringa verrebbe convertita in 'int (777)' e lo zero iniziale sarebbe andato! – Rizier123

+0

Leggi la documentazione, ho aggiunto appositamente il link ... "se la stringa inizia con" 0 ", la base viene considerata come 8 (ottale);" – Blaatpraat

+0

Ti darò semplicemente lo script: 'echo $ perm = intval (" 0777 "); \t chmod ("test /", $ perm); \t echo "
". substr (sprintf ('% o', fileperms ('test /')), -4); 'Crea una cartella di prova e provala! Vedi se emette 0777 come permesso! – Rizier123

4

Come è stato detto, non v'è alcun tipo di numero ottale. E la funzione chmod riceve il secondo parametro come numero intero. La conversione implicita di $perm non presuppone che il numero sia ottale. Quindi, è necessario convertire la stringa "ottale" in numero intero utilizzando la funzione appropriata.

Basta usare octdec funzione

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

O 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) 
0

Nulla sembrava funzionare per me così ho appena creato una soluzione molto stupido e io sono solo andando post it qui.

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

ho necessaria per alimentare il componente modalità di chmod() come variabile all'interno di una funzione. Ho passato abbastanza tempo a provare (e fallendo) a convertire la stringa in un ottale mantenendo il valore 0777. Alla fine, ho deciso di abbandonare chmod()/ftp_chmod() e ho optato per ftp_site() che non soffoca sui codici di modalità stringa.

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

Questo ha funzionato per me. Se questo è in qualche modo imperfetto o non corretto, per favore spiega.

Modifica: alcuni lettori possono rifiutare questa soluzione ftp_ come soluzione perché non è una soluzione di funzione del filesystem. È stato un problema per me perché stavo scrivendo una funzione in una classe ftp.