miércoles, 17 de agosto de 2016

Formularios con PHP + Html (III). Creación del PHP.


Bueno, por fin tras plantear el script y hacer el Hmtl, pasamos a escribir el código PHP para nuestro formulario, podéis verlo completo en este enlace de Pastebin. Os recomiendo que empecéis la serie desde el primer post para que podáis ver el proceso de creación de mi web de prueba, al final de este post os dejaré los enlaces. Voy a ir presentándolo por secciones numeradas para coincida con el esquema que vimos en el capítulo anterior de esta serie.

Probando el formulario


(1.-)

if (($_FILES['adjunto']['size'] > 0) AND ($_FILES['adjunto']['size'] <= $_POST['tamanomaximo'])) {

Con un condicional if y la variable $_FILES* comprobamos que la variable “adjunto” es mayor que cero, o sea, que la variable tiene contenido, y que es menor que el tamaño máximo permitido, que hemos definido con la variable “tamanomaximo” en el formulario. Al usar el operador AND establecemos que se tienen que cumplir las dos condiciones para obtener TRUE, en caso de que alguna de las dos (o las dos) sean falsas obtendremos FALSE. * la variable $_FILES es un array asociativo de elementos subidos al script en curso a través del método POST, podéis ver mas detalles sobre $_FILES en este enlace.

(2.-)

$tamano = $_FILES['adjunto']['size'];
$tipo = $_FILES['adjunto']['type'];
$archivo = $_FILES['adjunto']['name']; echo "Nombre de archivo: " , $archivo , "
";
echo "Tipo de archivo: " , $tipo , " ";
echo "Tamaño del archivo: ", $tamano , " ";

$prefijo = substr(md5(uniqid(rand())),0,8);
$destino = "adjuntos" . "/" . $prefijo .'_'. $archivo;
echo "Ruta de copiado: " , $destino , " ";

 
Este bloque corresponde al punto dos del diagrama, aquí procesamos el archivo adjunto si el condicional if del punto 1 ha resultado TRUE. Primero creamos tres variables $tamano (tamaño del archivo) $tipo (tipo de archivo) $archivo (nombre del archivo); luego mostramos el contenido de estas variables que se extrae del array $_FILES y por ultimo creamos un nombre para el archivo y establecemos una ruta para subirlo a nuestro server. ¿Para que ponerle un nombre? Imaginaros que dos usuarios diferentes suben un archivo que con el nombre igual, entonces se sobreescribirian. ¿Archivos diferentes que se llamen igual? Imaginaros que estos dos usuarios diferentes descargan un archivo de internet con nombre download.pdf por ejemplo y luego intentan subirlo a la web...

Resultado del proceso y envio de un mensaje con adjunto


Para crear un nombre aleatorio usamos las funciones rand() y md5() concatenadas para obtener una cadena de caracteres aleatoria y con unas probabilidades mínimas de que se repitan los caracteres, quizá en otro post os hable de esta cuestión que para mi ha sido muy apasionante de investigar estas últimas semanas.

Después le aplicamos la función substr() para obtener una cadena de N caracteres, en este caso 8. Al final mostramos al usuario el directorio donde vamos a guardar el archivo. Esto último quizá no sea necesario, no se hasta que punto podría ser inseguro mostrar carpetas de nuestro servidor, supongo que dependerá del uso que le demos al formulario. Sin embargo puede ser interesante que mientras probamos nuestro código PHP, este nos vaya mostrando mensajes de este tipo como mensajes de control, útiles para saber que el proceso se esta ejecutando de forma correcta.

(3.-)

if (move_uploaded_file($_FILES['adjunto']['tmp_name'] , $destino)) {

En este punto con otra condicional if comprobamos si se ha cargado el archivo correctamente al servidor, si hubiera algún problema en la subida resultara FALSE y mostraremos un mensaje de error, y si todo va bien un mensaje confirmando la subida.

Vista de la carpeta de adjuntos y podéis ver que efectivamente ha llegado



(4.-)

elseif ($_FILES['adjunto']['size'] == 0 ) {

En este bloque analizamos si el tamaño del adjunto es igual a 0. Fijaros que en vez de if he usado elseif, así que este condicional se ejecutara en caso de que alguna condición anterior* sea FALSE (ver enlace); o lo que es lo mismo comprobamos si realmente el usuario ha añadido algún adjunto. Por simple lógica, si no es mayor que cero pero es menor que el tamaño máximo permitido tiene que ser igual a 0. En caso afirmativo mostraremos un mensaje “no hay adjuntos” antes de pasar a enviar el mensaje. En el caso contrario mostramos el mensaje “tamaño de adjunto no permitido”.

*(recordamos que para que 1 sea TRUE se tienen que cumplir las dos condiciones unidas por AND) 

Mensaje obtenido con un adjunto mayor que el límite



(5.-) Y bien, por fin tras todo el proceso del adjunto, por fin llegamos a los que es el correo propiamente dicho, para esto usamos la función mail, esto será mas fácil pues simplemente con otro condicional if compruebo que las variables “nombre” y “email” del formulario Html tienen algún contenido, en caso afirmativo enviamos el mensaje en caso negativo, mostramos un mensaje con la incidencia al usuario y le damos la opción de volver al formulario. Vamos a ver este bloque de código mas al detalle:

if (!empty($_POST['nombre']) AND !empty($_POST['email'])) {

/* comprobamos que los campos nombre y email NO estan vacios */

$destino ="info@probandohtml.esy.es";

/* el mail al que enviaremos el mensaje, que es el que tenemos alojado en nuestro servidor */

$remitente = "Content-Type: text/html; charset=utf-8";
$remitente .= "From:".$_POST['nombre']."\r\n";

/* Aqui lo que hacemos es darle a la variable $remitente el valor “Content-Type: text/html; charset=utf-8” . From:".$_POST['nombre']."\r\n" con el operador . juntamos los dos valores en uno solo */

$tema="Contacto desde tu Sitio Web";             // asunto del mensaje

$mensaje=$_POST['nombre']." ".$_POST['email']." ".$_POST['comentario'];

@mail($destino,$tema,$mensaje,$remitente);      // enviamos el mensaje


Mensaje recibido en la bandeja de entrada

Y ahora para terminar, unas consideraciones finales:

  • Para guardar los ficheros adjuntos he creado en el servidor una carpeta "adjuntos" donde almacenar los ficheros que vayan enviando los usuarios. 
  • Como podéis comprobar los mensajes presentados por el script no respetan el estilo de la web y quedan bastante "sosos"; haría falta aplicarles un formato igual o similar y "adornarlo" un poco. No hay problema, en PHP se pueden  aplicar estilos a los textos, crear tablas y usar Html en general como veremos en un próximo post. También se puede aplicar formato Html al mensaje que recibimos en la bandeja de entrada de nuestro mail.
  • Cuando hagáis un script en PHP, ojo con las comillas dobles y simples.
  • Otra comprobación que se podría añadir es que en los campos de texto solo haya caracteres "permitidos", letras mayúsculas y minúsculas números, espacios en blanco, arrobas, y/o paréntesis, para evitar alguien intente pasar un código malintencionado dentro del texto.
  • Os vuelvo a recordar que depende de el servicio de host que estéis utilizando, tendréis ciertas limitaciones con el tema de los adjuntos y con el uso de ancho de banda disponible; cuando vosotros o algún usuario se pase de esos límites probablemente obtendrá un lacónico "access denied"

Y por fin termino, me ha quedado un poco largo para mi gusto, pero el tema es complejo y no quería dejaros a medias; Saludos y hasta la próxima. 

La serie completa:

  1. Creando una web con HTML(IV): Formularios con mailto.
  2. Formularios simpáticos con HTML
  3. Formularios con PHP + Html. Introducción al lenguaje.
  4. Formularios con PHP + Html(II). Planteamiento y código Html. 
  5. Formularios con PHP + Html (III). Creación del PHP.


No hay comentarios:

Publicar un comentario