This version of the page http://www.php.net/function.chmod.php (0.0.0.0) stored by archive.org.ua. It represents a snapshot of the page as of 2015-08-17. The original page over time could change.
PHP: chmod - Manual
Edit Report a Bug

chmod

(PHP 4, PHP 5, PHP 7)

chmodChanges file mode

Description

bool chmod ( string $filename , int $mode )

Attempts to change the mode of the specified file to that given in mode.

Parameters

filename

Path to the file.

mode

Note that mode is not automatically assumed to be an octal value, so to ensure the expected operation, you need to prefix mode with a zero (0). Strings such as "g+w" will not work properly.

<?php
chmod
("/somedir/somefile"755);   // decimal; probably incorrect
chmod("/somedir/somefile""u+rwx,go+rx"); // string; incorrect
chmod("/somedir/somefile"0755);  // octal; correct value of mode
?>

The mode parameter consists of three octal number components specifying access restrictions for the owner, the user group in which the owner is in, and to everybody else in this order. One component can be computed by adding up the needed permissions for that target user base. Number 1 means that you grant execute rights, number 2 means that you make the file writeable, number 4 means that you make the file readable. Add up these numbers to specify needed rights. You can also read more about modes on Unix systems with 'man 1 chmod' and 'man 2 chmod'.

<?php
// Read and write for owner, nothing for everybody else
chmod("/somedir/somefile"0600);

// Read and write for owner, read for everybody else
chmod("/somedir/somefile"0644);

// Everything for owner, read and execute for others
chmod("/somedir/somefile"0755);

// Everything for owner, read and execute for owner's group
chmod("/somedir/somefile"0750);
?>

Return Values

Returns TRUE on success or FALSE on failure.

Notes

Note:

The current user is the user under which PHP runs. It is probably not the same user you use for normal shell or FTP access. The mode can be changed only by user who owns the file on most systems.

Note: This function will not work on remote files as the file to be examined must be accessible via the server's filesystem.

Note:

When safe mode is enabled, PHP checks whether the files or directories you are about to operate on have the same UID (owner) as the script that is being executed. In addition, you cannot set the SUID, SGID and sticky bits.

See Also

  • chown() - Changes file owner
  • chgrp() - Changes file group
  • fileperms() - Gets file permissions
  • stat() - Gives information about a file

add a note

User Contributed Notes 28 notes

up
down
11
Anonymous
6 years ago
Changes file mode recursive in $pathname to $filemode

<?php

$iterator
= new RecursiveIteratorIterator(new RecursiveDirectoryIterator($pathname));

foreach(
$iterator as $item) {
   
chmod($item, $filemode);
}

?>
up
down
14
Geoff W
5 years ago
BEWARE using quotes around the second parameter...

If you use quotes eg

chmod (file, "0644");

php will not complain but will do an implicit conversion to an int before running chmod. Unfortunately the implicit conversion doesn't take into account the octal string so you end up with an integer version 644, which is 1204 octal
up
down
13
MethodicalFool
4 years ago
BEWARE, a couple of the examples in the comments suggest doing something like this:

chmod(file_or_dir_name, intval($mode, 8));

However, if $mode is an integer then intval( ) won't modify it.  So, this code...

$mode = 644;
chmod('/tmp/test', intval($mode, 8));

...produces permissions that look like this:

1--w----r-T

Instead, use octdec( ), like this:

chmod(file_or_dir_name, octdec($mode));

See also: http://www.php.net/manual/en/function.octdec.php
up
down
10
masha at mail dot ru
10 years ago
Usefull reference:

Value    Permission Level
400    Owner Read
200    Owner Write
100    Owner Execute
40    Group Read
20    Group Write
10    Group Execute
4    Global Read
2    Global Write
1    Global Execute

(taken from http://www.onlamp.com/pub/a/php/2003/02/06/php_foundations.html)
up
down
6
pmichaud at pobox dot com
12 years ago
In the previous post, stickybit avenger writes:
    Just a little hint. I was once adwised to set the 'sticky bit', i.e. use 1777 as chmod-value...

Note that in order to set the sticky bit on a file one must use '01777' (oct) and not '1777' (dec) as the parameter to chmod:

<?php
    chmod
("file",01777);   // correct
    
chmod("file",1777);    // incorrect, same as chmod("file",01023), causing no owner permissions!
?>

Rule of thumb: always prefix octal mode values with a zero.
up
down
3
paul maybe at squirrel mail org
7 years ago
Note that info at rvgate dot nl's chmodnum function produces INCORRECT results.  The resutls are base-10 numbers that only LOOK like they are octal numbers.  The function also ignores setuid, setgid and sticky bits, and will produce incorrect numbers if such a file is encountered.  Instead, this brute-force code works.  Maybe there is something more slick, but this isn't too CPU-intensive (note that it assumes you've error-checked that you indeed have a 10-character string!):

<?php
      $permissions
= 'drwxr-xr-x'// or whatever
     
$mode = 0;

      if (
$permissions[1] == 'r') $mode += 0400;
      if (
$permissions[2] == 'w') $mode += 0200;
      if (
$permissions[3] == 'x') $mode += 0100;
      else if (
$permissions[3] == 's') $mode += 04100;
      else if (
$permissions[3] == 'S') $mode += 04000;

      if (
$permissions[4] == 'r') $mode += 040;
      if (
$permissions[5] == 'w') $mode += 020;
      if (
$permissions[6] == 'x') $mode += 010;
      else if (
$permissions[6] == 's') $mode += 02010;
      else if (
$permissions[6] == 'S') $mode += 02000;

      if (
$permissions[7] == 'r') $mode += 04;
      if (
$permissions[8] == 'w') $mode += 02;
      if (
$permissions[9] == 'x') $mode += 01;
      else if (
$permissions[9] == 't') $mode += 01001;
      else if (
$permissions[9] == 'T') $mode += 01000;

     
printf('Mode is %d decimal and %o octal', $mode, $mode);
?>
up
down
2
sander
6 years ago
if you want to chmod directories too, use this

<?php
$iterator
= new RecursiveIteratorIterator(new RecursiveDirectoryIterator($pathname), RecursiveIteratorIterator::SELF_FIRST);

foreach(
$iterator as $item) {
   
chmod($item, $filemode);
}
?>
up
down
2
memp
9 years ago
If you are storing your mode in a variable like

$mode = 0755;

you will run into the inevitable octal mode problem.  An easy way around that is to use the octdec() function.

chmod("some_filename.ext", octdec($mode));
up
down
1
jon at zend dot com
13 years ago
if 'mode' is held in a variable and is and octal value you need to convert it to decimal before passing it to the function:
chmod ($filename, octdec($mode))
up
down
1
gnettles2 at home dot com
13 years ago
Usually when you're trying to write to af file, you'll need to chmod the file to something like 666 or 755. You can use a command to chmod the file for you, which is especially useful when you're making a script where you're setting it up so that your users don't have to peform a bunch of actions to setup the script. When i wrote my news program script, I only had two files. install.php and config.php. All you had to do was chmod install.php to 666 and open it up in a web browser and answer a few questions. The script itself setup the rest of the files and chmodded them for you.
up
down
2
webmaster at danopia dot 5gigs dot com
8 years ago
Thanks for your code, "imoldgreg at o2 dot co dot uk". I am using it for an instalation script that has to CHMOD a bunch of files. I have found it faster to use the same connectino for each, as shown below.

<?php

// Thanks to "imoldgreg at o2 dot co dot uk" for the base 'CHMOD via FTP' script.

function chmod_open()
{
   
// Use your own FTP info
   
$ftp_user_name = 'chmod@XXXXXXXXX.com';
   
$ftp_user_pass = 'XXXXXXXXXX';
   
$ftp_root = '/';
   
$ftp_server = 'localhost';
   
$conn_id = ftp_connect($ftp_server);
   
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
    return
$conn_id;
}

function
chmod_file($conn_id, $permissions, $path)
{
    if (
ftp_site($conn_id, 'CHMOD ' . $permissions . ' ' . $ftp_root . $path) !== false)
    {
        return
TRUE;
    }
    else
    {
        return
FALSE;
    }
}

function
chmod_close($conn_id)
{
   
ftp_close($conn_id);
}

// CHMOD the required setup files

// Connect to the FTP
$conn_id = chmod_open();

// CHMOD each file and echo the results
echo chmod_file($conn_id, 777, 'master/cache/') ? 'CHMODed successfully!' : 'Error';
echo
chmod_file($conn_id, 777, 'master/files/') ? 'CHMODed successfully!' : 'Error';
echo
chmod_file($conn_id, 777, 'master/store/') ? 'CHMODed successfully!' : 'Error';
echo
chmod_file($conn_id, 766, 'master/config.php') ? 'CHMODed successfully!' : 'Error';
echo
chmod_file($conn_id, 777, 'master/images/avatars/upload/') ? 'CHMODed successfully!' : 'Error';

// Close the connection
chmod_close($conn_id);

?>

Here, the same FTP connection is used for each CHMOD command, making the execute time lower. This is essential for me, since my script is also copying a bunch of files.
up
down
2
PerfectWeb
10 years ago
As noted by others below... 1) you cannot pass a string to chmod() as the mode, and 2) decimals work as well as octals for the mode.

If you need to come up with the mode on the fly (maybe based on user input) and want to use something like:

$mode = '0'.$owner.$group.$public;

you can use your $mode (which is a string) with chmod like this:

<?php
// octal mode in a string i.e. '0755'
$mode = '0'.$owner.$group.$public;

$mode_dec = octdec($mode);    // convert octal mode to decimal
chmod($filename, $mode_dec);
?>
up
down
2
Andrey P.
4 years ago
I was trying to change permissions of a folder with chmod command with FTP connection. (I needed a writable folder to upload pictures with php)

I got the following respond:
"SITE CHMOD 777 uploads: command not understood"

The reason: Server is running under Windows system that does not allow to set file permissions via FTP. Conversely, the UNIX-running servers allow that.

Solutions:

1. If your web hosting provider has a web-based control panel that lets you set file permissions, then you need to login there and make changes.

2. It is possible to contact the hosting provider and ask them about this issue; maybe they can make the changes.

3. It is possible to change the hosting provider that has servers run on UNIX, and keep the site there.
up
down
2
h dot kuppens at cs dot ru dot nl
3 years ago
For recursive chmod'ing both files and directories in one step you can use the function below. Note that this function has one argument for directory permissions and one for file permissions.
In this way you can apply the 'x' permission on directories, and skip it on directories. This function also skips links.

Example usage :

   chmod_R( 'mydir', 0666, 0777);

Makes all files and directories within mydir/ directory accessible for everyone, but doesn't make the files executable.

I guess for very deeply nested directories the recursion with php can become problematic, but I can be wrong because I never investigated this.

<?php
function chmod_R($path, $filemode, $dirmode) {
    if (
is_dir($path) ) {
        if (!
chmod($path, $dirmode)) {
           
$dirmode_str=decoct($dirmode);
            print
"Failed applying filemode '$dirmode_str' on directory '$path'\n";
            print
"  `-> the directory '$path' will be skipped from recursive chmod\n";
            return;
        }
       
$dh = opendir($path);
        while ((
$file = readdir($dh)) !== false) {
            if(
$file != '.' && $file != '..') {  // skip self and parent pointing directories
               
$fullpath = $path.'/'.$file;
               
chmod_R($fullpath, $filemode,$dirmode);
            }
        }
       
closedir($dh);
    } else {
        if (
is_link($path)) {
            print
"link '$path' is skipped\n";
            return;
        }
        if (!
chmod($path, $filemode)) {
           
$filemode_str=decoct($filemode);
            print
"Failed applying filemode '$filemode_str' on file '$path'\n";
            return;
        }
    }
}
?>
up
down
1
Ambriel_Angel at www dot ambriels dot net/entry
8 years ago
<?php
error_reporting
(E_ERROR | E_PARSE);
/* Makes is so Directories are not browseable to the public,
removing only the Public = Read permission, while leaving
the other chmod permissions for the file in tact.

If you have exectue already on, and read off, public viewers will only
be able to view files through links, but not browse
around to see what's inside of directories and see what
you've got laying around. */
//-------------------------------------------------------
// Get file mode
// Get file permissions supported by chmod
function getmod($filename) {
  
$val = 0;
  
$perms = fileperms($filename);
  
// Owner; User
  
$val += (($perms & 0x0100) ? 0x0100 : 0x0000); //Read
  
$val += (($perms & 0x0080) ? 0x0080 : 0x0000); //Write
  
$val += (($perms & 0x0040) ? 0x0040 : 0x0000); //Execute

   // Group
  
$val += (($perms & 0x0020) ? 0x0020 : 0x0000); //Read
  
$val += (($perms & 0x0010) ? 0x0010 : 0x0000); //Write
  
$val += (($perms & 0x0008) ? 0x0008 : 0x0000); //Execute

   // Global; World
  
$val += (($perms & 0x0004) ? 0x0004 : 0x0000); //Read
  
$val += (($perms & 0x0002) ? 0x0002 : 0x0000); //Write
  
$val += (($perms & 0x0001) ? 0x0001 : 0x0000); //Execute

   // Misc
  
$val += (($perms & 0x40000) ? 0x40000 : 0x0000); //temporary file (01000000)
  
$val += (($perms & 0x80000) ? 0x80000 : 0x0000); //compressed file (02000000)
  
$val += (($perms & 0x100000) ? 0x100000 : 0x0000); //sparse file (04000000)
  
$val += (($perms & 0x0800) ? 0x0800 : 0x0000); //Hidden file (setuid bit) (04000)
  
$val += (($perms & 0x0400) ? 0x0400 : 0x0000); //System file (setgid bit) (02000)
  
$val += (($perms & 0x0200) ? 0x0200 : 0x0000); //Archive bit (sticky bit) (01000)

  
return $val;
}

//-------------------------------------------------------
// Find out if file has mode
function hasmod($perms, $permission) {

# User Read = 0400 (256), Write = 0200 (128), Execute = 0100 (64)
# Group Read = 0040 (32), Write = 0020 (16), Execute = 0010 (8)
# Public Read = 0004 (4), Write = 0002 (2), Execute = 0001 (1)

   
return (($perms & $permission) == $permission);
}

//-------------------------------------------------------
// Take the read option off of all the subdirectories of the included path
function pathlock($dir, $listall = false, $testrun = true) {
   echo
"START @ " . date("F j, Y, h:i:s A") . "<br><br>";
   echo (
$testrun ? '**Test Run Activated (no changes will be made).**<br><br>' : '**Live Run Activated.**<br><br>');
   echo
$dir . " is our directory.<br><br>\n";
   echo
"[...IN PROGRESS...]<br><br>";

  
$file_list = '';
  
$stack[] = $dir;
 
   while (
$stack) {
     
$current_dir = array_pop($stack);
      if (
$dh = opendir($current_dir)) {
          while ((
$file = readdir($dh)) !== false) {
              if (
$file !== '.' AND $file !== '..') {
                 
$current_file = "{$current_dir}/{$file}";
               if (
is_dir($current_file)) {
                     
// BEG ADD PATH   
                  
$mode = getmod($current_file);    //Get the mode
                     
$HasPubRead = hasmod($mode,4);
                   if (
$HasPubRead || $listall) {    // Can the public read this dir?
                  //======================================
                   
$ch = true;
                 
$take = 0;
                      
// Change the mode:
                    
if ($HasPubRead) {
                         
$take = 4;         // Value for Public Read. 4 is the same in octal and decimal.
                         
if (!$testrun) {
                             
$ch = chmod($current_file, $mode-$take);
                          }
                      }

                    echo
$current_file . ",current=" . decoct($mode) .
                        ((
$mode!==$mode-$take) ? ",new=" . decoct($mode-$take) : '') .
                        (
$ch ? '' : ',FAILED') . "<br>\n";
                   }
// end if hasmod
                   // END ADD PATH                          
                     
$stack[] = $current_file;
                  }
// if if_dir
             
} //if ($file !== '.' AND $file !== '..')
         
} //while (($file = readdir($dh)) !== false)
     
} //if ($dh = opendir($current_dir))
} // while ($stack)

   
echo "<br>COMPLETE @ " . date("F j, Y, h:i:s A") . "<br>\n";
return;
  
//return $path_list;
} // end function

//-------------------------------------------------------
    //listall Show all folders, even one's we're not going to process?
    //testrun Do a test run without making any changes
   
pathlock($_SERVER["DOCUMENT_ROOT"],false,true); // listall?=false, testrun?=true

?>
up
down
0
nicolas at infosoft dot inf dot br
7 years ago
I use the code of haasje@welmers.net, but have a lite alteration. (linux symlink)

<?php
function chmod_R($path, $filemode) {
    if (!
is_dir($path))
        return
chmod($path, $filemode);

   
$dh = opendir($path);
    while ((
$file = readdir($dh)) !== false) {
        if(
$file != '.' && $file != '..') {
           
$fullpath = $path.'/'.$file;
            if(
is_link($fullpath))
                return
FALSE;
            elseif(!
is_dir($fullpath))
                if (!
chmod($fullpath, $filemode))
                    return
FALSE;
            elseif(!
chmod_R($fullpath, $filemode))
                return
FALSE;
        }
    }

   
closedir($dh);

    if(
chmod($path, $filemode))
        return
TRUE;
    else
        return
FALSE;
}
?>
thanks alls
up
down
0
imoldgreg at o2 dot co dot uk
8 years ago
an update to 'neil at 11 out of 10's code for changing mode using FTP.

changes: proper array added within the function (better for those of us who only need to connect to one ftp server) so only the mode and directory name need to be passed.

the octal added, for completeness and predictable stability.

<?php
function changemode($xcite)
{
$ftp_details = array(
ftp_user_name => 'username',
ftp_user_pass => 'password',
ftp_user_root => '/public_html/',
ftp_server => 'ftp.something.org'
);

$path = "public";
$mod = intval($xcite, 8);

  
// extract ftp details (array keys as variable names)
  
extract ($ftp_details);
  
  
// set up basic connection
  
$conn_id = ftp_connect($ftp_server);
  
  
// login with username and password
  
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
  
  
// try to chmod $path directory
  
if (ftp_site($conn_id, 'CHMOD '.$mod.' '.$ftp_root.$path) !== false) {
      
$success=TRUE;
   }
   else {
      
$success=FALSE;
   }

  
// close the connection
  
ftp_close($conn_id);
    return
$success;
}

?>

for those of you, like me, who were looking for a way to make an 'un-hackable' uploader, here's the closest i got, now for a field test, good luck!
up
down
0
alex at feidesign dot com
10 years ago
If you cannot chmod files/directories with PHP because of safe_mode restrictions, but you can use FTP to chmod them, simply use PHP's FTP-functions (eg. ftp_chmod or ftp_site) instead. Not as efficient, but works.
up
down
0
fernando at gym-group dot com
10 years ago
about chmod,
Problably you have a local server to simulate your scripts before upload them to the server. No matter if you use Apache under windows or IIS ,  a chmod instruction like chmod($filename,O777) may not work because windows does not handle that kind of permission's format.
So being in your local server, if you have a only read file and you try to erase, it will show that you dont have permissions even when you have already executed your chmod instrucction correctly. Just up the script it must work well in your internet server if it is a linux machine

sobre chmod,
Probablemente usas un servidor local para probar tus scripts antes de subirlos al servidor en internet. No importa si usas Apache bajo windows o IIS, una instruccion como chmod(nombre_archivo,O777) podr no trabajar por que windows no maneja esa estructura para definir los permisos.
Estando en tu servidor local, si tienes un archivo de solo lectura y tratas de borrarlo,  se mostrar un error diciendo que no tienes permisos an despes de haber ejecutado chmod correctamente. Sube tu script, si tu servidor es una mquina linux, el script trabajar sin problemas en internet.

Fernando Yepes C.
up
down
-2
pinetree822 at nate dot com
5 months ago
function checkPermission($userPerm,$servicePerm)
    {
        if( !$userPerm || !$servicePerm ) return false;
        if(!preg_match("/^[0-9]+$/",(string) $userPerm) || !preg_match("/^[0-9]+$/",(string) $servicePerm)) return false;
        if( $userPerm==$servicePerm ) return true;

        $i=0;
        $tempPerm=0;
        do {
            $tempPerm= pow(2, $i++);                                    // permission 값 임시 저장 1,2,4,8,16
            $sumPerm += $tempPerm;                                        // permission 합계 1,3,7,25
            if( $sumPerm <= $userPerm ) $arrayPerm[$tempPerm] = true;    // permission 검증값
            else break;
        } while (true);
        return @$arrayPerm[$servicePerm];
    }
    function makePlusPermission($arrayPerm=array(),$perm=0)
    {
        if( $arrayPerm ) {
            $add=@array_shift($arrayPerm);
            if(!preg_match("/^[0-9]+$/",(string)$add)) $add=0;
            $perm+=$add;
            return makePlusPermission($arrayPerm,$perm);
        }
        $retVal = ((int)$arrayPerm+(int)$perm);//PHP_INT_MAX
        return ($retVal < 0 ? 0 : $retVal);
    }
    function makeRejectPermission($rejectPerm=array(), $perm=0)
    {
        if( $rejectPerm ) {
            $minus=@array_shift($rejectPerm);
            if(!preg_match("/^[0-9]+$/",(string)$minus)) $minus=0;
            $perm-=$minus;
            echo '$perm = '.$perm. ',$minus = ' .$minus. '<br/>';
            return makeRejectPermission($rejectPerm,$perm);
        }
        $retVal = ((int)$rejectPerm+(int)$perm);//PHP_INT_MAX
        return ($retVal < 0 ? 0 : $retVal);
    }

    // 퍼미션 변수
    $writePost = 1;
    $readPost = 2;
    $deletePost = 4;
    $addUser = 8;
    $deleteUser = 16;

    $perm["access"] = 1;
    $perm["list"] = 2;
    $perm["list_more"] = 4;
    $perm["read"] = 8;
    $perm["read_more"] = 16;
    $perm["delete"] = 32;
    $perm["delete_more"] = 64;
    $perm["modify"] = 128;
    $perm["modify_more"] = 256;
    $perm["upload"] = 512;
    $perm["upload_more"] = 1024;
    $perm["down"] = 2048;
    $perm["down_more"] = 4096;
    $perm["write"] = 8192;
    $perm["write_more"] = 16384;
    $perm["find"] = 32768;
    $perm["find_more"] = 65536;
    // 131072,262144,524288,1048576,2097152,4194304,8388608

    //조직도.권한 <1,2,4,8,16,32,64,128,256,512>
    //org_chart_user_access,org_chart_group_acces
    // 그룹 퍼미션 갱신
    $administrator = makePlusPermission( array( $writePost, $readPost, $deletePost, $addUser, $deleteUser ) );
    $administrator_modify = makeRejectPermission( array( $deleteUser ),$administrator );

    $moderator = makePlusPermission( array( $readPost, $deletePost, $deleteUser ) );
    $writer = makePlusPermission( array( $writePost , $readPost ) );
    $guest = makePlusPermission( array( $readPost ) );

    if( checkPermission($administrator, $deleteUser) ) {
        echo '<br/>';
        echo("Login administrator - Access organization Listen Function". '<br>');
    }

    if( checkPermission($administrators, $deleteUser) ) {
        echo '<br/>';
        echo("Login administrator - Access organization Listen Function". '<br>');
    }else {
        echo '<br/>';
        echo("Login administrator - Error Access organization Listen Function". '<br>');
    }

    echo '$administrator = ' . $administrator. '<br>' ;
    echo '$administrator_modify = ' . $administrator_modify ;

//printing
$perm = 15,
$minus = 16
Login administrator - Access organization Listen Function
Login administrator - Error Access organization Listen Function
$administrator = 31
$administrator_modify = 15

// Good luck, lock.......
up
down
-2
pinetree822 at nate dot com
5 months ago
// 퍼미션 변수
    $writePost = 1;
    $readPost = 2;
    $deletePost = 4;
    $addUser = 8;
    $deleteUser = 16;

    $perm["access"] = 1;
    $perm["list"] = 2;
    $perm["list_more"] = 4;
    $perm["read"] = 8;
    $perm["read_more"] = 16;
    $perm["delete"] = 32;
    $perm["delete_more"] = 64;
    $perm["modify"] = 128;
    $perm["modify_more"] = 256;
    $perm["upload"] = 512;
    $perm["upload_more"] = 1024;
    $perm["down"] = 2048;
    $perm["down_more"] = 4096;
    $perm["write"] = 8192;
    $perm["write_more"] = 16384;
    $perm["find"] = 32768;
    $perm["find_more"] = 65536;
    // 131072,262144,524288,1048576,2097152,4194304,8388608

    //조직도.권한 <1,2,4,8,16,32,64,128,256,512>
    //org_chart_user_access,org_chart_group_acces
    // 그룹 퍼미션 갱신
    $administrator = makePlusPermission( array( $writePost, $readPost, $deletePost, $addUser, $deleteUser ) );
    $administrator_modify = makeRejectPermission( array( $deleteUser ),$administrator );

    $moderator = makePlusPermission( array( $readPost, $deletePost, $deleteUser ) );
    $writer = makePlusPermission( array( $writePost , $readPost ) );
    $guest = makePlusPermission( array( $readPost ) );

    if( checkPermission($administrator, $deleteUser) ) {
        echo '<br/>';
        echo("Login administrator - Access organization Listen Function". '<br>');
    }

    if( checkPermission($administrators, $deleteUser) ) {
        echo '<br/>';
        echo("Login administrator - Access organization Listen Function". '<br>');
    }else {
        echo '<br/>';
        echo("Login administrator - Error Access organization Listen Function". '<br>');
    }

    echo '$administrator = ' . $administrator. '<br>' ;
    echo '$administrator_modify = ' . $administrator_modify ;

//printing
$perm = 15,$minus = 16

Login administrator - Access organization Listen Function

Login administrator - Error Access organization Listen Function
$administrator = 31
$administrator_modify = 15

// Good luck, lock.......
up
down
-2
roger at imovelavenda dot com dot br
1 year ago
function chmod777($f) { chmod($f, 0777); }
array_map('chmod777', glob('/home/user/public_html/pdf/*/*/*/*'));
up
down
-1
sticky bit avenger
12 years ago
Just a little hint. I was once adwised to set the 'sticky bit', i.e. use 1777 as chmod-value. Do NOT do this if you don't have root privileges. When 'sticky bit' is set ONLY the fileuser can delete it afterwards, typically 'httpd' or something like that in case of an upload-script for example. I was unaware of this and actually had to make a script for deleting these files as I could not do this from ftp/ssh even though I did have read/write/execute access to both files and folders. Use simply '0777' or similiar.
up
down
-1
info at web-in-time dot eu
8 years ago
As you might have noticed there is a minor bug in webmaster at danopia dot 5gigs dot com's code:

You have to set $ftp_root variable outside the function chmod_open() and have to set it as global within the chmod_file() function.

With these patches the code really works fine. THX!

Ben
up
down
-1
Oliver Hankeln
11 years ago
Well, you don't need octals.
You need a value that can easily computed and remembered if printed in octal.
511 (decimal) is the same as 777 (octal).
So it's the same wether you write
chmod("foo",511)
or
chmod("foo",0777)

The latter is just better readable.
up
down
-1
Half-Dead at nospam dot com
12 years ago
[Editor's note:
That is due the fact Win32 systems treat premissions. You do not really have any other levels but read-only.

Maxim]


On WinME with apache chmod also works to a certain limit.

What happens is that apparently only the first number is counted, so 0666 (read-write) is the same as 0777, 0644, 0600, etc, and 0444 (read-only) is the same as 477, 400, etc.

..didn't test 0500 series
up
down
-6
agrenier at assertex dot com
11 years ago
This function will chmod a $filename before writing to it if:

1 - It exists
2 - It is not writeable
3 - PHP has permission to chmod files

If PHP can't chmod, then the script will end. Otherwise it will attempt to write to a new file.

<?php

   
function file_write($filename, $flag, &$content) {
        if (
file_exists($filename)) {
            if (!
is_writable($filename)) {
                if (!
chmod($filename, 0666)) {
                     echo
"Cannot change the mode of file ($filename)";
                     exit;
                };
            }
        }
        if (!
$fp = @fopen($filename, $flag)) {
            echo
"Cannot open file ($filename)";
            exit;
        }
        if (
fwrite($fp, $content) === FALSE) {
            echo
"Cannot write to file ($filename)";
            exit;
        }
        if (!
fclose($fp)) {
            echo
"Cannot close file ($filename)";
            exit;
        }
    }

?>
up
down
-3
pinetree822
5 months ago
new Think!
access mod

    // 퍼미션 변수
    $writePost = 1;
    $readPost = 2;
    $deletePost = 4;
    $addUser = 8;
    $deleteUser = 16;

    $perm["access"] = 1;
    $perm["list"] = 2;
    $perm["list_more"] = 4;
    $perm["read"] = 8;
    $perm["read_more"] = 16;
    $perm["delete"] = 32;
    $perm["delete_more"] = 64;
    $perm["modify"] = 128;
    $perm["modify_more"] = 256;
    $perm["upload"] = 512;
    $perm["upload_more"] = 1024;
    $perm["down"] = 2048;
    $perm["down_more"] = 4096;
    $perm["write"] = 8192;
    $perm["write_more"] = 16384;
    $perm["find"] = 32768;
    $perm["find_more"] = 65536;
    // 131072,262144,524288,1048576,2097152,4194304,8388608

    //조직도.권한 <1,2,4,8,16,32,64,128,256,512>
    //org_chart_user_access,org_chart_group_acces
    // 그룹 퍼미션 갱신
    $administrator = makePlusPermission( array( $writePost, $readPost, $deletePost, $addUser, $deleteUser ) );
    $administrator_modify = makeRejectPermission( array( $deleteUser ),$administrator );

    $moderator = makePlusPermission( array( $readPost, $deletePost, $deleteUser ) );
    $writer = makePlusPermission( array( $writePost , $readPost ) );
    $guest = makePlusPermission( array( $readPost ) );

    if( checkPermission($administrator, $deleteUser) ) {
        echo '<br/>';
        echo("Login administrator - Access organization Listen Function". '<br>');
    }

    if( checkPermission($administrators, $deleteUser) ) {
        echo '<br/>';
        echo("Login administrator - Access organization Listen Function". '<br>');
    }else {
        echo '<br/>';
        echo("Login administrator - Error Access organization Listen Function". '<br>');
    }

    echo '$administrator = ' . $administrator. '<br>' ;
    echo '$administrator_modify = ' . $administrator_modify ;

// printing
$perm = 15,$minus = 16

Login administrator - Access organization Listen Function

Login administrator - Error Access organization Listen Function
$administrator = 31
$administrator_modify = 15

// Good Luck,, lock,,^^
add a note