PHP Paso de datos con formularios
Revisión del 14:20 3 oct 2016 de Wiki (discusión | contribuciones) (→Función para validar / corrixir campos)
Sumario
Introdución
- Sabemos que a través da etiqueta <form> podemos enviar datos dunha páxina a outra.
- Dentro de esta etiqueta temos o atributo method que pode tomar os valores get ou post.
Método GET
- Neste caso os datos son enviados na URL e pasan a páxina indicada polo etiqueta action do formulario no seguinte formato: http://paxinadestino.php?param1=valor¶m2=valor&.....
- Se vos fixades cando facedes unha busca en google (por exemplo buscade 'php') na url aparecerá algo coma isto: https://www.google.es/search?q=php&ie=utf-8&oe=utf-8&client=firefox-b&gfe_rd=cr&ei=a1XgV4CmOu6s8wfuibOQAQ
- Os datos que aparecen despois do signo '?' son parámetros:?q=php&ie=utf-8&oe=utf-8
- Desvantaxes:
- Calquera persoa pode ver os valores das variables polo que dito método non é moi seguro.
- O usuario pode cambiar o valor de ditas variables polo que pode suceder que o sitio amose ou faga algo diferente do permitido.
- O usuario pode obter información non actual se usa unha URL con datos non actualizados.
- O tamaño do que podemos enviar na URL está limitado (depende de cada navegador, pero pode estar entre 2KB-8KB)
- Vantaxes:
- A través da URL podemos pasar datos dunha páxina a outra sen necesidade de ter un formulario por medio.
- As variables que se pasan desta forma poden ser referenciadas en PHP a través da matriz global $_GET['param'].
- Vexamos agora un exemplo utilizando un formulario:
Arquivo: UD2_Form_Ex1_eleccion_pelicula.php
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 3 <html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es"> 4 <head> 5 <meta charset="utf-8" /> 6 <title>Formulario</title> 7 <style> 8 .formularios{ 9 width: 30%; 10 margin: 0px auto; 11 } 12 .etiqueta{ 13 float: left; 14 width: 190px; 15 } 16 .botonesformularios{ 17 width: 50%; 18 margin: 30px auto; 19 text-align: center; 20 } 21 select { 22 width:50%; 23 } 24 </style> 25 </head> 26 <body> 27 <form id="frmPelicula" class="formularios" method="get" action="UD2_Form_Ex1_datos_pelicula.php"> 28 <div> 29 <div class='etiqueta'>Película preferida:</div> 30 <select name="lstPelicula"><option>E.T. El extraterrestre</option><option>Supermán</option></select> 31 </div> 32 <div> 33 <div class='etiqueta'>Xénero preferido:</div> 34 <select name="lstXenero"><option>Acción</option><option>Ciencia ficción</option></select> 35 </div> 36 <div class="botonesformularios"> 37 <input type='submit' value="ENVIAR" /> 38 </div> 39 </form> 40 41 </body> 42 </html> 43 </php>
- Fixarse que enviamos os datos utilizando o método get.
Arquivo: UD2_Form_Ex1_datos_pelicula.php
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 3 4 <html> 5 <head> 6 <meta charset="UTF-8"> 7 <title></title> 8 </head> 9 <body> 10 <?php 11 echo 'Os datos que escolliches son:<br/><br/>'; 12 13 $pelicula = $_GET['lstPelicula']; 14 $xenero = $_GET['lstXenero']; 15 16 printf("PELICULA:%s<br/>XÉNERO:%s",$pelicula,$xenero); 17 ?> 18 19 </body> 20 </html>
Método POST
- No método post de envío de datos, os mesmos van 'dentro' da páxina web e polo tanto non son visibles para o usuario.
- Tamén está limitado o tamaño do que se pode enviar (por exemplo se enviamos un arquivo adxunto) a un tamaño de 8MB.
- Podemos cambiar dito límite:
- Modificando a directiva post_max_size do arquivo php.ini de PHP.
- Modificando o arquivo .htaccess do noso sitio web e engadindo a directa: php_value post_max_size 20M (isto é necesario no caso de aloxamentos compartidos ou se non temos acceso ao arquivo php.ini).
- Nota: No caso de subir arquivos tamén pode ser necesario modificar a directiva upload_max_filesize do arquivo php.ini
- Podedes ver neste enlace como aumentar o tamaño dos arquivos subidos nun aloxamento compartido.
- As variables que se pasan desta forma poden ser referenciadas en PHP a través da matriz global $_POST['param'].
- Modificamos o exemplo anterior para que envíe os datos con POST:
Arquivo: UD2_Form_Ex2_eleccion_pelicula.php
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 3 <html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es"> 4 <head> 5 <meta charset="utf-8" /> 6 <title>Formulario</title> 7 <style> 8 .formularios{ 9 width: 30%; 10 margin: 0px auto; 11 } 12 .etiqueta{ 13 float: left; 14 width: 190px; 15 } 16 .botonesformularios{ 17 width: 50%; 18 margin: 30px auto; 19 text-align: center; 20 } 21 select { 22 width:50%; 23 } 24 </style> 25 </head> 26 <body> 27 <form id="frmPelicula" class="formularios" method="post" action="UD2_Form_Ex2_datos_pelicula.php"> 28 <div> 29 <div class='etiqueta'>Película preferida:</div> 30 <select name="lstPelicula"><option>E.T. El extraterrestre</option><option>Supermán</option></select> 31 </div> 32 <div> 33 <div class='etiqueta'>Xénero preferido:</div> 34 <select name="lstXenero"><option>Acción</option><option>Ciencia ficción</option></select> 35 </div> 36 <div class="botonesformularios"> 37 <input type='submit' value="ENVIAR" /> 38 </div> 39 </form> 40 41 </body> 42 </html> 43 </php>
- Fixarse que enviamos os datos utilizando o método post.
Arquivo: UD2_Form_Ex2_datos_pelicula.php
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 3 4 <html> 5 <head> 6 <meta charset="UTF-8"> 7 <title></title> 8 </head> 9 <body> 10 <?php 11 echo 'Os datos que escolliches son:<br/><br/>'; 12 13 $pelicula = $_POST['lstPelicula']; 14 $xenero = $_POST['lstXenero']; 15 16 printf("PELICULA:%s<br/>XÉNERO:%s",$pelicula,$xenero); 17 ?> 18 19 </body> 20 </html>
Comprobando se hai datos
- Normalmente a páxina que recibe os datos vai facer algún tipo de tratamento con eles (por exemplo, facer unha alta nunha táboa dunha base de datos, consultar en base aos criterios recibidos,...)
- Polo tanto será necesario realizar algún tipo de validación para comprobar se se envían os datos necesarios e estes teñen un formato correcto.
- Lembrar repasar as funcións que comproban se un campo ten datos e as funcións que comproban o tipo de dato dunha variable.
- O primeiro que teríamos que comprobar é se o formulario recibe datos. Para iso utilizaremos as funcións vistas nunha sección anterior da wiki.
1 if (empty($_POST)) die('Non se enviaron datos');
Nota: A función die ao igual que a función exit finaliza a páxina php.
- O tratamento que queiramos darlle á páxina cando non se envíen datos será decidido polo programador, pudendo enviarlle un aviso ao usuario en enviando de novo a páxina do formulario.
- Tede que ter en conta que aínda que fagades unha validación dos campos utilizando javascript, isto pódese saltar, xa que a páxina está no cliente. Ademais un usuario podería cargar a páxina de tratamento da información (a que está indicada no action do formulario) se pasar polo formulario.
- O segundo será verificar que os campos teñan algún valor (se é obrigatorio) e que o tipo de dato sexa o correcto.
1 if (empty($_POST['txtNome'])) echo('Campo nome non ten datos'); 2 if (!is_string($_POST['txtNome'])) echo('Campo nome non é unha cadea');
Función para validar / corrixir campos
http://web.ontuts.com/tutoriales/validar-y-sanear-datos-en-php/
- O proceso de validación-corrección de campos dun formulario soe ser dar bastante traballo.
- Para facernos a vida un pouco máis doada, temos unha extensión en PHP que permite a validación de campos dunha forma moi sinxela.
- A función que fai dita validación chámase función filter_var()
- A función filter_var permítenos filtrar unha variable segundo o filtro indicado.
- Parámetros:
- $var: Variable que se quere filtrar
- $filter: Filtro que se desexa aplicar. Será una constante numérica (indicadas a continuación)
- $options: Conxunto de opcións que modifican o funcionamento do filtro. Pode ser unha constante numérica ou un array
- Valor devolto:
- O dato filtrado ou false se o filtro faia.
Filtros para a validación
- FILTER_VALIDATE_BOOLEAN => Valida a variable coma un booleano.
- FILTER_VALIDATE_EMAIL => Valida a variable coma unha dirección de correo electrónico correcta.
- FILTER_VALIDATE_FLOAT => Valida que a variable sexa do tipo float.
- FILTER_VALIDATE_INT => Valida a variable coma un número enteiro.
- FILTER_VALIDATE_IP => Valida a variable coma unha dirección IP.
- FILTER_VALIDATE_REGEXP => Valida a variable contra unha expresión regular enviada na variable de opcións.
- FILTER_VALIDATE_URL => Valida o valor coma unha URL de acordo coa RFC 2396.
Filtros para a corrección
- FILTER_SANITIZE_EMAIL => Elimina tódolos caracteres execepto letras, números e !#$%&’*+-/=?^_`{|}~@.[].
- FILTER_SANITIZE_ENCODED => Codifica a cadea coma unha URL válida.
- FILTER_SANITIZE_MAGIC_QUOTES => Aplica a función addslashes.
- FILTER_SANITIZE_NUMBER_FLOAT => Elimina tódolos caracteres excepto números, +- e opcionalmente ,.eE
- FILTER_SANITIZE_NUMBER_INT => Elimina tódolos caracteres excepto números e los signos + -
- FILTER_SANITIZE_SPECIAL_CHARS => Escapa caracteres HTML e caracteres con ASCII menor a 32.
- FILTER_SANITIZE_STRING => Elimina etiquetas, opcionalmente elimina ou codifica caracteres especiais.
- FILTER_SANITIZE_STRIPPED => Alias do filtro anterior.
- FILTER_SANITIZE_URL => Elimina tódolos caracteres excepto números, letras y $-_.+!*’(),{}|\\^~[]`<>#%”;/?:@&=
Exemplos
- Validando un número enteiro ==
1 <?php 2 $var = 123; 3 echo filter_var($var, FILTER_VALIDATE_INT); 4 5 6 :: Devolve o número xa que é un enteiro. 7 8 == Seguridade no uso dos formularios == 9 10 == Redireccionamento de páxinas == 11 12 * Pode ser interesante cando realizamos un tratamento cos datos que veñen dun formulario ter a posibilidade de mandar ao usuario a unha páxina concreta. 13 14 : Imaxinemos o caso de que intentamos cargar a páxina de tratamento dun formulario previo ou que enviamos datos que non están completos. Neses casos queremos volver a enviar ao usuario á páxina de entrada de datos. 15 16 * Para facelo podemos usar a [http://php.net/manual/es/function.header.php función header] de PHP. 17 18 : Dita función serve para enviar encabezados ao navegador do cliente. Uns destes encabezados serve para redireccionar a páxina do clienta. A forma de facelo é: 19 20 ::<syntaxhighlight lang="php" line enclose="div" highlight="" > 21 <?php 22 header('Location: http://www.nova_paxina.es/'); 23 exit; 24 ?>
Importante: É NECESARIO QUE A CHAMADA Á FUNCIÓN header SE FAGA ANTES DE ENVIAR NINGÚN DATO AO CLIENTE.
-- Ángel D. Fernández González -- (2016).