Problema con isset() - php

v3sTi4

He realizado un formulario a través del cual se pueden subir archivos a la web.

Por tanto al darle a enviar se va directamente a "enviar.php" (por ejemplo).
En este "enviar.php" tengo, entre otras cosas, esto:

if (isset($_FILES['imagen'])) {
haz A...
}else{
haz B
}

Pues bien, no se porqué ni con isset($FILES[imagen']) ni con empty($FILES['imagen']) siempre me hace A, aunque no cargue ningún archivo.

En cambio, en otras ocasiones (no con archivos sino en campos de texto) hacía y hago isset($_POST['mensaje']) y ahí si me hacía una cosa u otra. Pero en este caso.

Aquí la instrucción isset no me hace nada.
Parece ser que $_FILES['archivo'] aunque no haya cargado ningún archivo ya "existe" o si hago empty "ya viene relleno".

Estaba consultando con un libro de php (cuya editorial no digo para no spam pero que es bastante bueno) y veo que en uno de los temás si trabaja con isset para $_FILES

¿Alguna ayuda?
Gracias

YavestruZ

yo creo que ahi te puede sobrar el isset : /. Un if mira que lo que esta dentro de la condicion sea 0 o 1, en:

if (.....)

será true si ..... se cumple, en tu caso, al haber algun archivo, sea cual sea en $_FILE[image] es TRUE, sin necesidad de usar isset

v3sTi4

Muchas gracias

Tienes razón no hace falta nada de isset ni empty para que me devuelva true o false en este caso.

Gracias

v3sTi4

Perdón me he equivocado.
De inicio me devuelve TRUE y yo quiero que me de FALSE de inicio si no esta definida.

O sino a malas doy la vuelta a las acciones y ya está.

v3sTi4

#2 Lo siento pero no me vale :-S
Creia que me valía pero nada.

Al poner sólo $_FILES['archivo']; sin nada de empty o isset me hace lo mismo.

Si pongo if ($_FILES['archivo']) {
a
}else{
b
}

Me da a

Si pongo if (isset($_FILES['archivo'])) {
a
}else{
b
}

Tb me da a

MATIZO, me da a suba o no archivo en el formulario. Algo está fallando porque siempre se cumple la condición y no hay manera de no hacer q se no se cumpla.

v3sTi4

Ya dí con la solución:
La expongo:

if (isset($FILES['archivo']) && $FILES['archivo']['size'] > 0) {
a
}else{
b
}

También bastaría sólo con $_FILES['archivo']['size'] > 0

De esta manera, es un tanto obvio, que más que existir el archivo, quiere decir que si pesa más que 0.
Al parecer, según mi problema, deduzco (pero no soy quien para deducir) que la variable $_FILES ya viene como definida, aunque en realidad no lo esté, y para comprobar que hemos utilizado el campo de subir un archivo, comprobamos que tenga un archivo que pese más de 0. Si pesa 0 es que no existe.

Tal vez sea un poco "bobada" pero ha sido mi solución.

elhamo

prueba strlen($_FILES['archivo']) > 0

De todas formas, lo miraré porque hace tiempo yo tenía el mismo problema.

v3sTi4

#7 lo que yo he expuesto al final, te aseguro que funciona. Le he dado mil vueltas pero así va ;-)

PiradoIV

Mejor échale un vistazo a empty($var); que, tal y como pone en la documentación, Devuelve FALSE si var tiene un valor no vacío y diferente de cero.

http://es.php.net/manual/es/function.empty.php

Saludotes,
Pirado IV estuvo akí ;)

SeiYa

Yo miro el contenido de la cadena que sino me equivoco tiene la ubicación del archivo, en caso de que esté vacía pista, yo creo que lo hacía con if ( X == "") pero ya ni me acuerdo.

YavestruZ

Yo creo que deberia de dejar de usar isset u_U

mcnach

_FILES nunca llega vacío, por eso no te salta a la otra opción, uno de los valores del array _FIILES tiene un código de error, según este valor puedes saber si te ha llegado archivo o no.

Mira en la referencia.

Y

el espacio en blanco es uno de los problemas por el cual isset no funciona. Yo lo soluciono usando trim, es asqueroso pero funciona.

if (isset(trim($loquesea)={
...
}

con esto consigues que trim suprima los espacios en blacno que existan al final o al principio de la cadena. En el caso de una cadena vacia pero con espacios en blanco, suprimirá todo el contenido.

Kaos

yo usaría:

if($_FILES['archivo']['name']!='') echo "TPM";
else echo "MC";

Si subes un archivo, forzosamente tiene un nombre. Eso te permitirá un control mejor :)

El isset es una basura.

Usuarios habituales