Modificar permisos de archivo (chmod)

Hola!!

Tengo un problema al utilizar chmod para cambiar los permisos de los archivos, y es que se cambian sí, y los parámetros los recibe bien (nombre del archivo y nuevos permisos) pero lo que hace es modificar los permisos del archivo por los que le da la gana jajajaja.
Tengo este código:
if($_GET["cambiarpermisos"]){
  if(!$_GET["cambiarpermisos"] OR !$_GET["permisos"]) exit("0");
  if(chmod("".$_GET['cambiarpermisos']."", $_GET['permisos'])){
    exit("1");
  } else {
    exit("0");
  }
}
Imprime en la pantalla 1 si modificó los permisos o 0 si no se pudieron modificar.
Entro en la URL para probar el código: http://pagina.com/?cambiarpermisos=archivo.html&permisos=0755
y le cambia a archivo.html los permisos a 1363
Si pruebo entrando en http://pagina.com/?cambiarpermisos=archivo.html&permisos=0644
le cambia a archivo.html los permisos a 1204

Cuál es el problema? :confused:
Saludos!!
Hola:

¿Qué valor te llega en $_GET['permisos']? En este momento, PHP esta convirtiendo 'permisos' en un int, por lo que el cero de la izquierda se omite y termina siendo 1204 o 1363.

Asegúrate de que $_GET['permisos'] sea un número octal (0NNN).
Hola, primero de todo gracias por responder como siempre skaparate, la verdad no dudé que me intentarías ayudar [:D]

En $_GET['permisos'] recibo correctamente el valor de la URL, si pongo 0777 recibe 0777 y si pongo 0644 recibe 0644, así que efectivamente le estoy pasando un número octal, no?
Hmmmm, sí, llega un número octal, pero es raro... según la documentación, chmod espera que mode (el segundo parámetro) sea un entero, así que, intenta con esto:

if( chmod( "".$_GET['cambiarpermisos']."", [COLOR="#FF0000"]octdec[/COLOR]( $_GET['permisos'] ) ) ) {

octdec convierte un número octal en decimal.
Sí, lo sé... igualmente puede ser que sus ejemplos no funcionen si se les pasan variables como parámetros en lugar de un número octal directamente. Creo que tiene que ver con que, al pasarlo por GET, el parámetro es un string y no un número (echo gettype( $_GET['permisos'] ) = 'string') y chmod lo transforma en un entero (cosa que no hace si se pasa un octal o int).
Pues va a ser que diste en el clavo! jajaja, ya que estamos otra duda: Por qué el parámetro es un string? Es decir yo por el GET simplemente le paso números y ninguna letra, además en el chmod no le pongo comillas a $_GET['permisos']; para indicar que hay un string y funciona correctamente sin dar error (bueno aunque cambia los permisos por los que quiere XD)... no sé si me explico jajaja.

Saludos y gracias!!
simplemente le paso números y ninguna letra

Eso se debe a la forma que funciona PHP y no hay nada que hacer, es la forma en que esta hecho :P. Por lo demás, el que todo sea o se pueda tratar como un string hace que todo sea más fácil. No sé si has programado en un lenguaje estricto, donde debas respetar los tipos de dato, te darás cuenta que el obviar el tipo (string, int, double, etc.) hace nuestro trabajo mucho más simple, pues una variable puede contener cualquier tipo de dato u objeto.

además en el chmod no le pongo comillas a $_GET['permisos']; para indicar que hay un string

Me imagino que la función chmod utiliza algo así:

if( !is_int( $mode ) )
  $mode = (int)$mode;

De esta forma, lo que sea que se le pase, quedará convertido en un número. El problema es que los octales pierden el 0 y, por ende, dejan de ser octales XD. Podrías pasarle un string ('una cadena') y PHP convertiría cada letra en un número y los permisos serían inexistentes XD.

Espero que te ayude :).
Ajá, comprendo, gracias por la explicación, me has ayudado en el problema y además solucionado mis dudas! jajaja
Programar en un lenguaje estricto como has dicho no mucho... probé Java hace mucho tiempo y sí sé a lo que te refieres (o eso creo XD), por ejemplo para declarar un int:
int numero = 1;
A eso te refieres no?
Claro, pero más allá de eso, en PHP puedes hacer esto:

$numero = 10;
echo $numero;
// Haces otras cosas

$numero = "Una cadena";
echo $numero;

En Java no podrías hacer eso:

int numero = 10;
numero = "10"; // Error!
string num = 10; // Error!
string num = "10";
string num = 0; // Error!