Foros del Web » Programando para Internet » PHP »

unlink() arroja error... pero no hay error, y funciona... :P

Estas en el tema de unlink() arroja error... pero no hay error, y funciona... :P en el foro de PHP en Foros del Web. Esto es curiosísimo, y francamente he optado por evitar el mensaje de error transitoriamente hasta que descubra qué es lo que está pasando. Se trata ...
  #1 (permalink)  
Antiguo 22/11/2009, 12:46
 
Fecha de Ingreso: noviembre-2009
Ubicación: Illes Balears
Mensajes: 3
Antigüedad: 14 años, 5 meses
Puntos: 0
Exclamación unlink() arroja error... pero no hay error, y funciona... :P

Esto es curiosísimo, y francamente he optado por evitar el mensaje de error transitoriamente hasta que descubra qué es lo que está pasando.

Se trata de borrar un archivo, ubicado en un directorio que está un nivel por encima del directorio actual (../pics/).

Ahora bien, el código es archisimple:

Código PHP:
<?php
$DefaultDir 
"../pics/";
$PicNum $_GET['Nro'];
$ref $_GET['nom'];
$CodVerif $_GET['cod'];
$DelFile $ref "_" $PicNum ".jpg";
$Borrar $DefaultDir $DelFile;
if(
$VeriCode == $CodVerif)
{
    
$Resultado unlink($Borrar);
}
else
{
    die(
"ERROR: Código de Verificación Incorrecto.");
}
if(
$Resultado)
{
    
$msg "<b>Resultado:</b> OK";
}
else
{
    
$msg "<b>Resultado:</b> ERROR";
}
?>
Simple, muy simple.

Si el código de verificación coincide con la evaluación, se ejecuta el unlink().

Este código devuelve un Warning:

Warning: unlink(../pics/foto.jpg) [function.unlink]: No such file or directory in...

Lo divertido de esto es que el archivo sí existe, y lo que me deja pasmado es que no sólo existe el archivo, sino que además UNLINK() lo está BORRANDO realmente.

Es decir, que unlink() VE el archivo, lo ENCUENTRA, lo BORRA, pero informa que no lo encuentra, y por supuesto también devuelve FALSE... como si no lo hubiera borrado...

Es como si esa línea particular se estuviera ejecutando DOS VECES, que estuviera borrando el archivo, y luego -inmediatamente- volviendo a borrarlo.

Esto viene de una validación en javascript, también hiper simple, que pide confirmación de borrado, y si se confirma el borrado, llama a un window.location con la dirección donde está el código que realmente borra el arcihivo, si no se confirma, no se ejecuta el window.location y por lo tanto no se carga el código, y no se borra nada...

Lo que hice fue poner un if(file_exists($Borrar)){unlink($Borrar)} para que simplemente no aparezca el error... y ahora sí está borrando el archivo, no aparece el WARNING pero sigue retornando FALSE.

No sé... no acabo de entender qué es lo que está pasando, y como no hay watchdog que sirva en este código, porque no hay mucho por monitorear, no sé ya qué vuelta más dar... ¿alguna idea?

Aquí creo que necesito algún super gurú, porque en teoría no es técnicamente posible que el unlink() se esté ejecutando dos veces... ¿o sí es posible? daría esa impresión... ¿no?
  #2 (permalink)  
Antiguo 22/11/2009, 13:07
 
Fecha de Ingreso: noviembre-2009
Ubicación: Illes Balears
Mensajes: 3
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: unlink() arroja error... pero no hay error, y funciona... :P

Workaround provisorio para que no aparezca el Warning:

Código PHP:
if($VeriCode == $CodVerif)
{
    if(
file_exists($Borrar)){$Resultado unlink($Borrar);}

De esta forma funciona. ¿Por qué? No lo sé, pero SUPONGO:

Efectivamente está ejecutando esa línea dos veces. La primera vez ve el archivo, y lo borra. Pero vuelve sobre sí misma, pero la segunda vez no lo ve. Como no lo ve (porque lo borró en la primera pasada), tira el error de archivo o directorio inexistente.

Con este código, la segunda vez el IF va a ver si existe o no, y si no existe no va a intentar volver a ejecutar el unlink(). Y no va a haber error.

Obviamente no se puede confiar así como están las cosas en la verificación de PHP, así que hay que verificar si el archivo se borró o no.

Para eso agregamos el siguiente código:

Código PHP:
if(!file_exists($Borrar))
{
    
$msg "Archivo $Borrar eliminado OK.";
}
else
{
    
$msg "ERROR: El archivo no se ha eliminado.<br>
    Llame a su soporte técnico."
;

De esta forma hacemos una verificación propia del funcionamiento del unlink() o no, y mostramos un mensaje apropiado en el caso de que hubiera fallado.

Lo he probado en mi servidor de desarrollo (local) que es un LAMP, y funciona. Y en un host contratado tambén funciona.

:)

Ahora bien... si tenemos en cuenta que en mi servidor local se presenta este tema, y en el host también, me inclino a pensar que he metido las de andar en alguna parte, pero sinceramente no encuentro dónde.

Sí que es un comportamiento interesante este.
  #3 (permalink)  
Antiguo 22/11/2009, 13:53
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: unlink() arroja error... pero no hay error, y funciona... :P

lo mejor es que uses rutas absolutas en lugar de relativas...

para ello puedes utilizar getcwd() y dirname(), incluso la constante __FILE__

Código PHP:
$path dirname(dirname(__FILE__)); // igual a ../
echo $path DIRECTORY_SEPARATOR 'foo.bar'
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #4 (permalink)  
Antiguo 04/12/2009, 04:44
 
Fecha de Ingreso: noviembre-2009
Ubicación: Illes Balears
Mensajes: 3
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: unlink() arroja error... pero no hay error, y funciona... :P

Ya. Pues en realidad también lo he probado con ruta absoluta, y es igual. Sigue dando ese error, lo cual reafirma mi sospecha de que por alguna razón está intentando borrar el archivo dos veces...
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:11.