0% encontró este documento útil (0 votos)
14 vistas11 páginas

Formularios en PHP

copdigo PHP Formularios en PHP codigo

Cargado por

vilmajesus56cr
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
14 vistas11 páginas

Formularios en PHP

copdigo PHP Formularios en PHP codigo

Cargado por

vilmajesus56cr
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 11

Formularios en PHP

Tutorial para crear formularios con los principios básicos,


validación y campos requeridos y subida múltiple de
archivos
Contenido modificable
Si ves errores o quieres modificar/añadir contenidos, puedes crear un pull request.
Graciasp

Indice de contenido

1. Introducción 4. Validación

2. GET y POST 5. Subida de archivos

3. Tipos de elementos 6. Subida múltiple de archivos

1. Introducción

Un formulario sencillo con dos campos a rellenar y un botón para enviar


en HTML es de la siguiente forma:

<html>
<body>
<form action="formpost.php" method="post">
Nombre: <input type="text" name="nombre"><br>
Email: <input type="text" name="email"><br>
<input type="submit" value="Enviar">
</form>
</body>
</html>

Cuando un usuario rellena los datos y hace click en enviar, los datos del formulario
se envían para ser procesados al archivo formpost.php. Los datos se envían a través
de HTTP con el método HTTP Post.

Una vez los datos están en formpost.php pueden mostrarse, guardarse en una base
de datos o lo que se necesite. En formpost.php vamos a mostrarlos con echo:
<html>
<body>
Hola <?php echo $_POST["nombre"]; ?><br>
Tu email es: <?php echo $_POST["email"]; ?>
</body>
</html>
Lo mismo se puede conseguir con el método HTTP GET:

<html>
<body>
<form action="formget.php" method="get">
Nombre: <input type="text" name="nombre"><br>
Email: <input type="text" name="email"><br>
<input type="submit" value="Enviar">
</form>
</body>
</html>
Ahora el archivo donde recibimos los datos es formget.php:

<html>
<body>
Hola <?php echo $_GET["nombre"]; ?><br>
Tu email es: <?php echo $_GET["email"]; ?>
</body>
</html>
Estos han sido dos ejemplos muy sencillos para ver el funcionamiento básico de
un formulario. Siempre que se crean formularios hay que tener muy en cuenta
la seguridad, y para ello se utiliza la validación de formularios.

Las superglobals $_GET y $_POST sirven para coleccionar datos de formularios, y


vamos a ver las diferencias a continuación.

2. GET y POST

$_GET y $_POST son variables superglobales que forman arrays de keys y values,
donde los keys son los nombres del formulario (atributo "name") y los values son los
datos de entrada de los usuarios. El hecho de que sean superglobals hace que
sean accesibles desde el script independientemente del ámbito.

$_GET es un array de variables que se pasan al script a través de los parámetros


de URL. La información que se envía es visible para todo el mundo y tiene limitada
la cantidad de información que se puede enviar a 2000 caracteres. Las URLs con los
datos enviados pueden guardarse en marcadores, lo que puede ser útil en ciertos
casos. $_GET sólo se emplea para el envío de información reducida y no sensible.
$_POST es un array de variables que se pasan al script a través del método HTTP
POST. La información que se envía no es visible para los demás ya que los nombres
y variables van embebidas en el body del HTTP request. No tiene límites en la
cantidad de información a enviar. Soporta datos de entrada multi-part binary a la
hora se subir archivos al servidor (lo que permite subir múltiples archivos a la vez).

3. Tipos de elementos

Elemento Descripción

input type="text" Caja de texto

input
Caja de texto donde se muestran asteriscos en lugar de los caracteres escritos
type="password"

input
Cajas seleccionables que permite escoger múltiples opciones
type="checkbox"

input type="radio" Cajas seleccionables en grupos que sólo permiten escoger una opción

input type="submit" Botón para enviar el formulario

input type="file" Cajas de texto y botón que permite subir archivos

input type="hidden" Elemento escondido. Especialmente útil para tokens de seguridad

option Una opción posible dentro de un elemento element

select Lista de opciones de elementos option

textarea Texto multilínea

Los 10 tipos de elementos más importantes para los formularios HTML con
PHP son:

4. Validación

La validación de formularios es algo fundamental ya que previene posibles


ataques de intrusos, además de asegurar que los datos que se reciben son
realmente del tipo deseado.

Existen dos formas de validación de formularios: en el lado del cliente y en el


lado del servidor. En el lado del cliente la validación suele ser mediante JavaScript,
es más rápida y evita enviar más trabajo al servidor. En el lado del servidor se
emplea PHP para verificar que se envían valores correctos, es más seguro pero es
más lento y da un poco de trabajo al servidor. En este artículo vamos a ver algún
ejemplo de esta segunda forma.

El siguiente es un sencillo formulario algo más complejo con los siguiente datos:
Nombre, Contraseña, Educacion, Nacionalidad, Idiomas, Email y Sitio web:

<h2>Formulario:</h2>
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">
Nombre:
<input type="text" name="nombre" maxlength="50"><br>
Contraseña:
<input type="password" name="password"><br>
Educacion:
<select name="educacion">
<option value="sin-estudios">Sin estudios</option>
<option value="educacion-obligatoria" selected="selected">Educación
Obligatoria</option>
<option value="formacion-profesional">Formación profesional</option>
<option value="universidad">Universidad</option>
</select> <br>
Nacionalidad:
<input type="radio" name="nacionalidad" value="hispana">Hispana</input>
<input type="radio" name="nacionalidad" value="otra">Otra</input><br>
Idiomas:
<input type="checkbox" name="idiomas[]" value="español"
checked="checked">Español</input>
<input type="checkbox" name="idiomas[]" value="inglés">Inglés</input>
<input type="checkbox" name="idiomas[]" value="francés">Francés</input>
<input type="checkbox" name="idiomas[]" value="aleman">Alemán</input><br>
Email:
<input type="text" name="email"><br>
Sitio Web:
<input type="text" name="sitioweb"><br>
// Botón de enviar
<input type="submit" name="submit" value="Enviar">
</form>
</body>
</html>

Vamos a ver los aspectos más característicos:

 El atributo maxlength limita el número de caracteres para una caja de


texto.
 Contraseña es del tipo password, lo que permite ocultar los caracteres con
* cuando se escribe.
 Educación es un elemento select, que permite seleccionar options en una
lista. El texto en el atributo value es el que se enviará a través del
formulario. El atributo selected permite mostrar el seleccionado por
defecto.
 Nacionalidad es del tipo radio, los elementos radio del mismo grupo han de
tener un único atributo name y sólo se puede seleccionar uno.
 Los idiomas están en un elemento checkbox, que permite enviar varios
datos en forma de array si se indica en el atributo name con corchetes. Se
puede añadir un atributo checked como seleccionado por defecto.
 En action se ha puesto _<?php echo
htmlespecialchars($_SERVER["PHPSELF"]); ?>. $_SERVER["PHP_SELF"] es
una superglobal que devuelve el nombre del archivo en el que se encuentra
el formulario, lo que hace que los datos se envíen al mismo archivo, en lugar
de llevarlos a otro archivo para tratarlos. Si se emplea esta forma de indicar
el archivo para action, es necesario usar la función htmlespecialchars(), que
convierte caracteres especiales en entidades HTML previniendo
posibles ataques Cross-site Scripting.

En este ejemplo todas las acciones de validar, enviar y recibir datos se hacen en el
mismo archivo form.php.

Primero vamos a crear un filtrado común para todos los campos con la
función filtrado():

FUNCTION FILTRADO ($ DATOS ){


$DATOS = TRIM($DATOS); // E LIMINA ESPACIOS ANTES Y DESPUÉS DE LOS DATOS
$DATOS = STRIPSLASHES ($DATOS); // E LIMINA BACKSLASHES \
$DATOS = HTMLSPECIALCHARS ($DATOS); // T RADUCE CARACTERES ESPECIALES EN ENTIDADES HTML
RETURN $ DATOS ;
}
Esta función se aplicaría a cada campo a la hora de recibir los datos:

IF ( ISSET ($_POST[" SUBMIT "]) && $_SERVER["REQUEST_METHOD"] == "POST"){


$NOMBRE = FILTRADO($_POST[" NOMBRE"]);
$PASSWORD = FILTRADO($_POST[" PASSWORD"]);
$EDUCACION = FILTRADO($_POST[" EDUCACION "]);
$NACIONALIDAD = FILTRADO($_POST[" NACIONALIDAD "]);
// U TILIZAMOS IMPLODE PARA PASAR EL ARRAY A STRING
$IDIOMAS = FILTRADO(IMPLODE(", ", $_POST[" IDIOMAS "]));
$EMAIL = FILTRADO($_POST[" EMAIL"]);
$SITIOWEB = FILTRADO($_POST[" SITIOWEB"]);
}

Para aceptar los datos se ha puesto _isset($POST["submit"]), que crea


la key submit cuando se hace click en el botón, y _$_SERVER["REQUESTMETHOD"]
== "post", que especifica que el método request ha de ser POST. Se puede usar
una de las dos formas o las dos a la vez.

Para mostrar los datos:

<?PHP IF(ISSET($_POST[" SUBMIT"])): ?>


<H2>MOSTRAR DATOS ENVIADOS </H2>
NOMBRE : <? PHP ISSET($NOMBRE) ? PRINT $NOMBRE : ""; ?> < BR>
CONTRASEÑA : <? PHP ISSET($PASSWORD) ? PRINT $PASSWORD : ""; ?> < BR>
EDUCACIÓN : <? PHP ISSET($EDUCACION ) ? PRINT $EDUCACION : ""; ?> < BR>
NACIONALIDAD : <? PHP ISSET($NACIONALIDAD ) ? PRINT $NACIONALIDAD : "";?> < BR>
IDIOMAS : <? PHP ISSET($IDIOMAS ) ? PRINT $IDIOMAS : ""; ?> < BR>
EMAIL : <? PHP ISSET($EMAIL) ? PRINT $EMAIL : ""; ?> < BR>
SITIO WEB : <? PHP ISSET($SITIOWEB) ? PRINT $SITIOWEB : ""; ?> < BR>
<?PHP ENDIF; ?>

Todos los campos anteriores son opcionales. La validación más básica consiste
en exigir que se rellene un campo, y comprobaremos también que el email tiene
un formato de email, que el sitio web es una URL correcta y
que password tiene un mínimo de 5 caracteres. Las validaciones de
formatos pueden realizarse mediante expresiones regulares o con filtros. Siempre
que sea posible, es mejor utilizar los filtros de PHP.

IF ( ISSET ($_POST[" SUBMIT "]) && $_SERVER["REQUEST_METHOD"] == "POST"){


// E L NOMBRE Y CONTRASEÑA SON CAMPOS OBLIGATORIOS
IF ( EMPTY ($_POST[" NOMBRE "])){

$ ERRORES[] = "E L NOMBRE ES REQUERIDO ";


}
IF ( EMPTY ($_POST[" PASSWORD "]) || STRLEN($_POST[" PASSWORD"]) < 5){
$ ERRORES[] = "LA CONTRASEÑA ES REQUERIDA Y HA DE SER MAYOR A 5 CARACTERES ";
}
// E L EMAIL ES OBLIGATORIO Y HA DE TENER FORMATO ADECUADO
IF (!FILTER _ VAR ($_POST[" EMAIL "], FILTER_VALIDATE_EMAIL) || EMPTY($_POST[" EMAIL"])){
$ ERRORES[] = "NO SE HA INDICADO EMAIL O EL FORMATO NO ES CORRECTO";
}
// E L SITIO WEB ES OBLIGATORIO Y HA DE TENER FORMATO ADECUADO
IF (!FILTER _ VAR ($_POST[" SITIOWEB "], FILTER_VALIDATE_URL) ||
EMPTY ($_POST[" SITIOWEB "])){

$ ERRORES[] = "NO SE HA INDICADO SITIO WEB O EL FORMATO NO ES CORRECTO";


}
// S I EL ARRAY $ERRORES ESTÁ VACÍO, SE ACEPTAN LOS DATOS Y SE ASIGNAN A VARIABLES
IF ( EMPTY ($ ERRORES )) {
$ NOMBRE = FILTRADO($_POST[" NOMBRE"]);
$ PASSWORD = FILTRADO($_POST[" PASSWORD"]);
$ EDUCACION = FILTRADO($_POST[" EDUCACION "]);
$ NACIONALIDAD = FILTRADO($_POST[" NACIONALIDAD "]);
// U TILIZAMOS IMPLODE PARA PASAR EL ARRAY A STRING
$ IDIOMAS = FILTRADO(IMPLODE(", ", $_POST[" IDIOMAS "]));
$ EMAIL = FILTRADO($_POST[" EMAIL"]);
$ SITIOWEB = FILTRADO($_POST[" SITIOWEB"]);
}
}
El array de errores $errores guarda cada uno de los errores que se registran para
luego mostrarlos. Si el array tiene algún elemento, el formulario no será aceptado.
Para mostrarlos podemos hacerlo así:

<UL>
<?PHP IF(ISSET($ERRORES)){
FOREACH ($ ERRORES AS $ ERROR ){
ECHO "< LI > $ ERROR </ LI >";
}
}
?>
</UL>

5. Subida de archivos

Lo más laborioso a la hora de hacer un formulario que permita la subida de archivos


es manejarlos y organizarlos una vez están en el servidor. Inicialmente los
archivos se suben a un directorio temporal y luego se relocalizan.

Configuración en PHP para la subida de archivos:

 Debe estar On la variable file_uploads en php.ini.


 En php.ini también se encuentra la variable upload_tmp_dir, que indica el
directorio donde se dirigirán los archivos cuando se suban. El tamaño
máximo viene indicado en el mismo archivo de configuración
por upload_max_filesize.

Para ver estos valores se puede


utilizar ini_get('upload_tmp_dir') e ini_get('upload_max_filesize'). upload_tmp
_dir sólo es manipulable desde el php.ini o
httpf.conf, upload_max_filesize puede también desde .htaccess o un user.ini
(tienen modo PHP_INI_SYSTEM y PHP_INI_PERDIR respectivamente).

 Es necesario que los permisos tanto del directorio temporal como


del directorio final sean de escritura.
 Para que un formulario tenga la capacidad de aceptar archivos se añade el
atributo enctype="multipart/form-data" al elemento form.

De nuevo en este ejemplo pondremos todo el contenido en un archivo form2.php:

<H2>FORMULARIO SUBIDA DE ARCHIVOS</H2>


<HTML>
<BODY>
<FORM ACTION ="<? PHP ECHO HTMLSPECIALCHARS ($_SERVER["PHP_SELF"]); ?>"
METHOD ="POST" ENCTYPE =" MULTIPART / FORM -DATA ">
<INPUT TYPE="HIDDEN" NAME="MAX_FILE_SIZE" VALUE="<?PHP ECHO $MAX_FILE_SIZE; ?>" />
<INPUT TYPE="FILE" NAME="IMAGEN " />
<INPUT TYPE="SUBMIT" NAME="SUBMIT" />
</FORM>
</BODY>
</HTML>
Se incluye un input del tipo hidden que limita el tamaño máximo del archivo que
se puede subir (en bytes).

La información sobre un archivo subido la proporciona el array


multidimensional $_FILES. Este array se crea con el key que se indique en el input
del formulario, en este caso "imagen":

 $_FILES["imagen"]["name"]. Guarda el nombre original del archivo del


cliente.
 $_FILES["imagen"]["type"]. Guarda el MIME type del archivo.
 $_FILES["imagen"]["size"]. Guarda el tamaño del archivo en bytes.
 $_FILES["imagen"]["tmp_name"]. Guarda el nombre del archivo temporal.
 $_FILES["imagen"]["error"]. Guarda cualquier código de error que pueda
provocar la subida del archivo.

La función move_uploaded_file() mueve un archivo subido del directorio temporal al


directorio que se indique.

$DIRECTORIO SUBIDA = "UPLOADS/";


$MAX_FILE_SIZE = "51200";
$EXTENSIONESVALIDAS = ARRAY("JPG", "PNG", "GIF");
IF ( ISSET ($_POST[" SUBMIT "]) && ISSET ($_FILES[' IMAGEN '])){
$ERRORES = ARRAY();
$NOMBREARCHIVO = $_FILES[' IMAGEN ']['NAME'];
$FILESIZE = $_FILES[' IMAGEN ']['SIZE'];
$DIRECTORIO TEMP = $_FILES[' IMAGEN ']['TMP_NAME'];
$TIPOARCHIVO = $_FILES[' IMAGEN ']['TYPE'];
$ARRAYARCHIVO = PATHINFO($NOMBREARCHIVO);
$EXTENSION = $ARRAYARCHIVO['EXTENSION'];
// C OMPROBAMOS LA EXTENSIÓN DEL ARCHIVO
IF (!IN _ ARRAY ($ EXTENSION , $ EXTENSIONES VALIDAS )){
$ ERRORES[] = "LA EXTENSIÓN DEL ARCHIVO NO ES VÁLIDA O NO SE HA SUBIDO NINGÚN ARCHIVO";
}
// C OMPROBAMOS EL TAMAÑO DEL ARCHIVO
IF ($ FILESIZE > $ MAX _ FILE _ SIZE ){
$ ERRORES[] = "LA IMAGEN DEBE DE TENER UN TAMAÑO INFERIOR A 50 KB";
}
// C OMPROBAMOS Y RENOMBRAMOS EL NOMBRE DEL ARCHIVO
$NOMBREARCHIVO = $ARRAYARCHIVO['FILENAME '];
$NOMBREARCHIVO = PREG_REPLACE("/[^A-Z0-9._-]/ I", "_", $ NOMBREARCHIVO);
$NOMBREARCHIVO = $NOMBREARCHIVO . RAND(1, 100);
// D ESPLAZAMOS EL ARCHIVO SI NO HAY ERRORES
IF ( EMPTY ($ ERRORES )){
$ NOMBRECOMPLETO = $DIRECTORIO SUBIDA.$NOMBREARCHIVO.".".$EXTENSION;
MOVE _ UPLOADED _ FILE ($ DIRECTORIO TEMP, $ NOMBRE C OMPLETO );
PRINT "E L ARCHIVO SE HA SUBIDO CORRECTAMENTE ";
}
}
El array $_FILES['imagen']['error'] especifica por qué no se ha podido subir el
archivo, lo que permite especificar un mensaje de vuelta para cada tipo de error.
Devuelve un integer con el número de error:

Valo
Error Significado
r

UPLOAD_ERR_OK 0 No hay errores

UPLOAD_ERR_INI_SIZE 1 Supera el tamaño máximo indicado en php.ini

Supera el tamaño máximo indicado en


UPLOAD_ERR_FORM_SIZE 2
MAX_FILE_SIZE de html

UPLOAD_ERR_PARTIAL 3 Sólo se ha subido el archivo parcialmente

UPLOAD_ERR_NO_FILE 4 No se ha subido ningún archivo

UPLOAD_ERR_NO_TMP_DI
6 Falta la carpeta temporal
R

UPLOAD_ERR_CANT_WRIT No se puede escribir en el directorio


7
E especificado

UPLOAD_ERR_EXTENSION 8 Una extensión de PHP ha detenido la subida

6. Subida múltiple de archivos

Una subida múltiple de archivos en PHP en la práctica se hace normalmente con


ayuda de JavaScript. Una buena librería para subir archivos es DropzoneJS.

En el formulario HTML lo único que cambia es que se añade un atributo multiple y


que en el atributo name del input file se añade corchetes para indicar que es un
array:

<input type="file" name="imagenes[]" multiple="multiple" />


En cuanto al backend, omitiendo validaciones esta puede ser una forma de hacerlo:

$directorioSubida = "uploads/";
$max_file_size = "51200";
if(isset($_POST["submit"]) && isset($_FILES['imagenes'])){
$nombres = $_FILES['imagenes']['name'];
$temporales = $_FILES['imagenes']['tmp_name'];
$tipos = $_FILES['imagenes']['type'];
$errores = $_FILES['imagenes']['error'];
// Iteramos sobre los arrays creados
for ($i = 0; $i < count($temporales); $i++){
if(move_uploaded_file($temporales[$i], $directorioSubida.$nombres[$i])){
echo "Se ha subido {$nombres[$i]} correctamente <br>";
} else {
echo "Ha habido algún error al subir algún archivo";
}
}
}

Copyright © Diego Lázaro 2018

También podría gustarte