Diferencia entre revisiones de «Plantilla:PHP/FormulariosConceptosGenerales»
De WikiEducator
(→Obtener datos de un formulario) |
(→Cómo leer datos de usuario) |
||
(34 revisiones intermedias por el mismo usuario no mostrado) | |||
Línea 1: | Línea 1: | ||
+ | <div id=parrafo> | ||
<div class="slide"> | <div class="slide"> | ||
===Introducción=== | ===Introducción=== | ||
Línea 7: | Línea 8: | ||
#Leer valores del teclado | #Leer valores del teclado | ||
#Mostrar resultados en pantalla | #Mostrar resultados en pantalla | ||
− | [[Archivo:InteracutandoPrograma.png|300px]] | + | [[Archivo:InteracutandoPrograma.png|300px|center]] |
</div> | </div> | ||
Línea 14: | Línea 15: | ||
*En el caso de PHP, hemos visto alguna primitiva para mostrar valores por pantalla (En realidad lo que hace es escribirlas al fichero html que entrega al cliente). | *En el caso de PHP, hemos visto alguna primitiva para mostrar valores por pantalla (En realidad lo que hace es escribirlas al fichero html que entrega al cliente). | ||
*Estas instrucciones son '''''echo''''' y '''''print'''''. | *Estas instrucciones son '''''echo''''' y '''''print'''''. | ||
− | *Ambos dos son son instrucciones del lenguaje, | + | *Ambos dos son son instrucciones del lenguaje, como ya hemos visto en el tema anterior |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
===Cómo leer datos de usuario=== | ===Cómo leer datos de usuario=== | ||
*Nos falta ver cómo podemos hacer que el cliente (a través del navegador) aporte valores al programa escribiéndolos por el teclado. | *Nos falta ver cómo podemos hacer que el cliente (a través del navegador) aporte valores al programa escribiéndolos por el teclado. | ||
*Hay que partir de la situación en la que estamos desarrollando nuestra aplicación '''''Aplicación web'''''. | *Hay que partir de la situación en la que estamos desarrollando nuestra aplicación '''''Aplicación web'''''. | ||
− | El script | + | El script lo ejecuta el servidor |
+ | (en nuestro caso el programa apache ejecutándose en un ordenador) | ||
+ | cuando un cliente (un navegador en un equipo) solicita una página o recurso que tiene código php. | ||
*No puedo detener el programa esperando que el usuario aporte un valor. Esto no es posible en una programación web. | *No puedo detener el programa esperando que el usuario aporte un valor. Esto no es posible en una programación web. | ||
{{Tip|Típico ejemplo que el programa me pide un nombre, y su ejecución espera a que introduzca el nombre y presione intro para continuar}} | {{Tip|Típico ejemplo que el programa me pide un nombre, y su ejecución espera a que introduzca el nombre y presione intro para continuar}} | ||
− | *Lo que la programación web nos va a permitir es '''''enviar junto con la solicitud de la página, valores que aporte el usuario''''', mediante un formulario. | + | *Lo que la programación web nos va a permitir es '''''enviar junto con la solicitud de la página, valores,(o parejas variable, valor) que aporte el usuario''''', mediante un formulario. |
*De alguna manera enviaremos parejas '''''variable, valor'''''. | *De alguna manera enviaremos parejas '''''variable, valor'''''. | ||
*El formulario será parte de la página del cliente, código '''''html'''''. | *El formulario será parte de la página del cliente, código '''''html'''''. | ||
− | [[image: | + | [[image:FormularioPHP.png |center]] |
+ | |||
</div> | </div> | ||
Línea 71: | Línea 35: | ||
<div class="slide"> | <div class="slide"> | ||
;Leyendo del usuario | ;Leyendo del usuario | ||
− | *En el formulario tendremos | + | *En el formulario tendremos elementos gráficos de entradas de valores '''''(input)''''' donde, en el navegador, el usuario podrá escribir contenido(text, ...), o de alguna forma aportarlo (radio, select, ...) |
*En los diferentes elementos de entrada de un formulario , como una texto, el usuario podrá escribir valores. | *En los diferentes elementos de entrada de un formulario , como una texto, el usuario podrá escribir valores. | ||
− | * | + | {{Tip|Existen diferentes tipos de inputs: text, puedo escribir, radio, select, checkbox, son para seleccionar}} |
− | * | + | {{MRM_Puntos clave|Title=El proceso será:| |
+ | El proceso será el siguiente | ||
+ | *Presionando el elemento submit( botón por lo general) '''''(submit del formulario)''', dichos valores irán al servidor para ser leídos y usados en un script; | ||
+ | *Viajan del cliente al servidor, como si fuera un tren y cada elemento va a ser un vagón | ||
+ | *En el servidor podremos acceder a ellos. El nombre de ese tren serán '''$_POST''' o bien '''$_GET'''. | ||
+ | *Cada vagón tendrá un nombre que le habremos puesto en el atributo name del input. | ||
+ | }} | ||
</div> | </div> | ||
<div class="slide"> | <div class="slide"> | ||
Línea 95: | Línea 65: | ||
===Atributos de la etiqueta=== | ===Atributos de la etiqueta=== | ||
*Etiqueta '''''form''''' con una serie de atributos, de los que '''ahora''' nos interesan dos principalmente: | *Etiqueta '''''form''''' con una serie de atributos, de los que '''ahora''' nos interesan dos principalmente: | ||
− | #action especifica el fichero que se invocará al servidor. Este fichero contendrá el código php que queremos que se ejecute. | + | #'''''action''''': especifica el fichero que se invocará al servidor. Este fichero contendrá el código php que queremos que se ejecute. |
− | #method especifica el modo en el que se van a pasar los parámetros (valores introducidos a los diferentes objetos del formulario, o que tengan asignados por defecto). | + | #'''''method''''': especifica el modo en el que se van a pasar los parámetros (valores introducidos a los diferentes objetos del formulario, o que tengan asignados por defecto). |
− | ====GET o POST==== | + | |
+ | ====El action==== | ||
+ | <br /> | ||
+ | {{MRM_Definicion|Title=Valor de action| | ||
+ | Establece el nombre del recurso, script o página | ||
+ | que se va a solictar al servidor | ||
+ | cuando realicemos un click en el submit del formulario | ||
+ | }} | ||
+ | ;Ejemplo | ||
+ | |||
+ | {{MRM_Actividad|Title=Haciendo un pin-pon| | ||
+ | Haz un proyecto que contenga dos páginas '''''ping.php''''' y '''''pon.php''''' | ||
+ | *Ambas tendrán un botón de tipo submit | ||
+ | <source lang=html5> | ||
+ | <input type=submit value='Ir a ...'> | ||
+ | </source> | ||
+ | *La página pin me llevaré a pon py la página '''''pon''''' me ha de llevar a '''''pin''''' | ||
+ | {{plegable|hide|posible solución| | ||
+ | <source lang=html5> | ||
+ | <!--PIN.PHP--> | ||
+ | <!doctype html> | ||
+ | <html lang="en"> | ||
+ | <head> | ||
+ | <meta charset="UTF-8"> | ||
+ | <meta name="viewport"> | ||
+ | <meta http-equiv="X-UA-Compatible" content="ie=edge"> | ||
+ | <title>Document</title> | ||
+ | </head> | ||
+ | <body> | ||
+ | <form action="pon.php"> | ||
+ | <input type="submit" value="Ir a pon"> | ||
+ | |||
+ | </form> | ||
+ | |||
+ | </body> | ||
+ | </html> | ||
+ | <!-- PON.php --> | ||
+ | <!doctype html> | ||
+ | <html lang="en"> | ||
+ | <head> | ||
+ | <meta charset="UTF-8"> | ||
+ | <meta name="viewport"> | ||
+ | <meta http-equiv="X-UA-Compatible" content="ie=edge"> | ||
+ | <title>Document</title> | ||
+ | </head> | ||
+ | <body> | ||
+ | <form action="pin.php"> | ||
+ | <input type="submit" value="Ir a pin"> | ||
+ | |||
+ | </form> | ||
+ | |||
+ | </body> | ||
+ | </html> | ||
+ | </source> | ||
+ | |||
+ | }} | ||
+ | }} | ||
+ | |||
+ | |||
+ | ====El method: GET o POST==== | ||
+ | |||
+ | <br /> | ||
+ | {{MRM_Definicion|Title=Valor de method| | ||
+ | Establece la manera en la que van a enviar los datos al servidor | ||
+ | Se enviarán todas las parejas variable-valor que haya en el formulario | ||
+ | Estos datos se pueden enviar: | ||
+ | en la cabecera (método GET) | ||
+ | en el cuerpo del mensaje (método POST) | ||
+ | }} | ||
+ | |||
<source lang=html4strict style="width:50%"> | <source lang=html4strict style="width:50%"> | ||
− | <form action=" | + | <form action="datos.php" method="POST" |
+ | ...... | ||
+ | </form> | ||
+ | </source> | ||
+ | <source lang=html4strict style="width:50%"> | ||
+ | <form action="datos.php" method="GET" | ||
...... | ...... | ||
</form> | </form> | ||
</source> | </source> | ||
</div> | </div> | ||
− | * | + | |
− | * | + | *Este parámetro es opcional, si no se especifica por defecto toma el valor '''GET''' |
+ | |||
+ | *Cuando el método es '''GET''' las parejas se viaulizan en el URL, apareciendo como parte de él, separado por el signo interrogación con parejas '''variable=valor''', y separadas entre ellas, si hubiera varias, con el & | ||
+ | |||
{{MRM_Ejemplo| | {{MRM_Ejemplo| | ||
; Método GET | ; Método GET | ||
*HTML en el cliente: | *HTML en el cliente: | ||
*Vemos dos ''input'' de type text y con dos atributos asignados: '''''name''''' y '''''value''''': | *Vemos dos ''input'' de type text y con dos atributos asignados: '''''name''''' y '''''value''''': | ||
− | + | *1.- '''''name''''' es el que vamos a utilizar para recuperar el contenido del '''input''' en el servidor. | |
{{Tip|El '''name''' es al servidor lo mismo que el '''id''' es al cliente, con id podéis acceder a los valores de los elementos con javascript, con el ''name'' lo haremos en php}} | {{Tip|El '''name''' es al servidor lo mismo que el '''id''' es al cliente, con id podéis acceder a los valores de los elementos con javascript, con el ''name'' lo haremos en php}} | ||
− | + | *2.- '''''value''''' es el valor. Este valor se sustituye por el contenido del '''input''' del formulario. | |
<source lang=html5> | <source lang=html5> | ||
− | <form action=" | + | <form action="datos.php" method="GET"> |
Nombre | Nombre | ||
<input type=text name = 'nombre' value='maría'> | <input type=text name = 'nombre' value='maría'> | ||
Línea 130: | Línea 177: | ||
*Observamos como aparece el texto después de la url: | *Observamos como aparece el texto después de la url: | ||
<br /> | <br /> | ||
− | [[Imagen: | + | [[Imagen:form_maria_ruiz.png]] |
}} | }} | ||
Línea 138: | Línea 185: | ||
<div class="slide"> | <div class="slide"> | ||
;Atributos | ;Atributos | ||
− | *En este caso estamos indicando que cuando se envíe el formulario, se | + | *En este caso estamos indicando que cuando se envíe el formulario, se solicita al servidor un fichero (página, recurso o script) llamado '''''datos.php'''''. |
− | *La ubicación del fichero, como no se especifica, se busca en la misma ubicación donde está el fichero que actualmente está viendo el cliente. | + | *La ubicación del fichero, en este caso, como no se especifica, se busca en la misma ubicación donde está el fichero que actualmente está viendo el cliente. |
+ | *No obstante se puede especificar una ruta absoluta en lugar de relativa | ||
+ | <source lang=html5> | ||
+ | <form action="http://localhost/pruebas/datos.php" method="GET"> | ||
+ | .... | ||
+ | </source> | ||
+ | {{Tip| Tienes claro la diferencia entre ruta relativa y ruta absoluta?}} | ||
*También se especifica que los valores enviados con el formulario; irán en el cuerpo de documento usando el protocolo http, y no en el URI con el signo ? como sucede si se especificara GET. | *También se especifica que los valores enviados con el formulario; irán en el cuerpo de documento usando el protocolo http, y no en el URI con el signo ? como sucede si se especificara GET. | ||
</div> | </div> | ||
− | |||
<!--3 --> | <!--3 --> | ||
<div class="slide"> | <div class="slide"> | ||
{{MRM_Puntos clave| | {{MRM_Puntos clave| | ||
− | Tan inseguro es usar '''''GET''''' como '''''POST'''''. si queremos garantizar seguridad debemos usar '''''https''''' en lugar de '''''http'''''}} | + | |
+ | Tan inseguro es usar '''''GET''''' como '''''POST'''''. si queremos garantizar seguridad debemos usar '''''https''''' en lugar de '''''http''''' | ||
+ | ;En el caso de GET | ||
+ | <source lang=html5> | ||
+ | <form action="http://localhost/pruebas/datos.php" method="GET"> | ||
+ | .... | ||
+ | </source> | ||
+ | |||
+ | [[image:form_maria_ruiz.png]] | ||
+ | <br /> | ||
+ | ;En el caso de post | ||
+ | <source lang=html5> | ||
+ | <form action="http://localhost/pruebas/datos.php" method="POST"> | ||
+ | .... | ||
+ | </source> | ||
+ | |||
+ | Si vamos a las herramientas de diseño en el navegador, en la solapa de red o network, podemos ver: | ||
+ | [[image:form_maria_ruiz_post.png]] | ||
+ | |||
+ | }} | ||
*Por supuesto hay más atributos, el id es importante para poder acceder a ese elemento con javascript. | *Por supuesto hay más atributos, el id es importante para poder acceder a ese elemento con javascript. | ||
*Tanto '''''method''''' como '''''action''''' son necesarios para la programación web. | *Tanto '''''method''''' como '''''action''''' son necesarios para la programación web. | ||
Línea 168: | Línea 239: | ||
===Creando formularios=== | ===Creando formularios=== | ||
− | Es interesante ojear esta | + | Es interesante ojear esta página que te informa de cómo hacer formularios usando html5. |
− | + | https://developer.mozilla.org/es/docs/Learn/Forms | |
;Elemento '''''input''''' | ;Elemento '''''input''''' | ||
*Como ya hemos comentado, es un elemento de entrada de texto que se rellena en la página web que tiene el cliente, y se envía al servidor donde se puede recuperar esta información para el script a ejecutar (se recuperará durante la ejecución). | *Como ya hemos comentado, es un elemento de entrada de texto que se rellena en la página web que tiene el cliente, y se envía al servidor donde se puede recuperar esta información para el script a ejecutar (se recuperará durante la ejecución). | ||
Línea 286: | Línea 357: | ||
*La respuesta es que tiene el valor null | *La respuesta es que tiene el valor null | ||
}} | }} | ||
+ | <br /> | ||
*Esto puede crear confusiones que debemos aclarar. '''''null''''', cuando una variable tiene valor null vamos a considerar que no tiene valor, o que no ha sido delcarada. | *Esto puede crear confusiones que debemos aclarar. '''''null''''', cuando una variable tiene valor null vamos a considerar que no tiene valor, o que no ha sido delcarada. | ||
*Para comprobar probamos el siguiente código | *Para comprobar probamos el siguiente código | ||
Línea 376: | Línea 448: | ||
<head> | <head> | ||
<meta charset="UTF-8"> | <meta charset="UTF-8"> | ||
− | <meta name="viewport | + | <meta name="viewport"> |
− | + | ||
<meta http-equiv="X-UA-Compatible" content="ie=edge"> | <meta http-equiv="X-UA-Compatible" content="ie=edge"> | ||
<title>Document</title> | <title>Document</title> | ||
Línea 481: | Línea 552: | ||
<!--3 --> | <!--3 --> | ||
<div class="slide"> | <div class="slide"> | ||
+ | |||
===Validando valores en el servidor=== | ===Validando valores en el servidor=== | ||
*Indistintamente de que se validen valores en el cliente, es muy importante validarlos en el servidor | *Indistintamente de que se validen valores en el cliente, es muy importante validarlos en el servidor | ||
Línea 487: | Línea 559: | ||
http://php.net/manual/es/ref.var.php | http://php.net/manual/es/ref.var.php | ||
*Cuando leemos un valor de un formulario, siempre lo vamos a leer como una cadena de caracteres, pero podremos verificar algunos valores por conversión implícita | *Cuando leemos un valor de un formulario, siempre lo vamos a leer como una cadena de caracteres, pero podremos verificar algunos valores por conversión implícita | ||
− | {{MRM_Ejemplo|Title=Algunas | + | {{MRM_Ejemplo|Title=Algunas conversiones| |
* "754" y miramos a ver si es un número, nos va a decir que sí | * "754" y miramos a ver si es un número, nos va a decir que sí | ||
*"false" o "true" si miramos a ver si es booleano, nos va a decir que no | *"false" o "true" si miramos a ver si es booleano, nos va a decir que no | ||
Línea 530: | Línea 602: | ||
*Dirección de correo electrónico. | *Dirección de correo electrónico. | ||
*Estudios realizados entre ESO, BACHILLER, CICLO FORMATIVO, GRADO UNIVERSITARIO (select) | *Estudios realizados entre ESO, BACHILLER, CICLO FORMATIVO, GRADO UNIVERSITARIO (select) | ||
+ | <!-- | ||
{{Plegable|hide|Posible solución index.php| | {{Plegable|hide|Posible solución index.php| | ||
+ | --> | ||
+ | |||
<source lang=php> | <source lang=php> | ||
<!DOCTYPE html> | <!DOCTYPE html> | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
<html> | <html> | ||
<head> | <head> | ||
Línea 550: | Línea 621: | ||
<input type="text" name="nombre" id=""> | <input type="text" name="nombre" id=""> | ||
<label for="">Apellido</label> | <label for="">Apellido</label> | ||
− | <input type="text" name=" | + | <input type="text" name="apellido" id=""> |
<br /> | <br /> | ||
<label for="">Direccion</label> | <label for="">Direccion</label> | ||
Línea 603: | Línea 674: | ||
</body> | </body> | ||
</html> | </html> | ||
− | |||
</source> | </source> | ||
}} | }} | ||
+ | *Observa las diferentes forma de poder leer valores filtrando y evitando o no ataques XSS | ||
{{Plegable|hide|Posible solución: datos.php| | {{Plegable|hide|Posible solución: datos.php| | ||
<source lang=php> | <source lang=php> | ||
<?php | <?php | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
//Primero leemos las variables | //Primero leemos las variables | ||
+ | $n3 = filter_input(INPUT_POST, 'nombre'); | ||
+ | $n1 = htmlspecialchars($_POST['nombre']); | ||
+ | $n2 = strip_tags($_POST['nombre'], "<b>"); | ||
+ | |||
+ | |||
+ | $n4 = $_POST['nombre']; | ||
+ | |||
+ | |||
+ | $idiomas1 = $_POST['idiomas']; | ||
+ | var_dump($idiomas1); | ||
$nombre = filter_input(INPUT_POST, 'nombre', FILTER_SANITIZE_STRING); | $nombre = filter_input(INPUT_POST, 'nombre', FILTER_SANITIZE_STRING); | ||
+ | |||
$apellidos = filter_input(INPUT_POST, 'apellido', FILTER_SANITIZE_STRING); | $apellidos = filter_input(INPUT_POST, 'apellido', FILTER_SANITIZE_STRING); | ||
$edad = filter_input(INPUT_POST, 'edad', FILTER_VALIDATE_INT); | $edad = filter_input(INPUT_POST, 'edad', FILTER_VALIDATE_INT); | ||
$direccion = filter_input(INPUT_POST, 'direccion', FILTER_SANITIZE_STRING); | $direccion = filter_input(INPUT_POST, 'direccion', FILTER_SANITIZE_STRING); | ||
$fNac = filter_input(INPUT_POST, 'fNac', FILTER_SANITIZE_STRING); | $fNac = filter_input(INPUT_POST, 'fNac', FILTER_SANITIZE_STRING); | ||
− | $idiomas = | + | $idiomas = filter_input(INPUT_POST, 'idiomas', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY); |
$genero = filter_input(INPUT_POST, 'genero'); | $genero = filter_input(INPUT_POST, 'genero'); | ||
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL); | $email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL); | ||
Línea 635: | Línea 711: | ||
//Mostramos los valores como una ficha | //Mostramos los valores como una ficha | ||
+ | ?> | ||
+ | <!doctype html> | ||
+ | <html lang="en"> | ||
+ | <head> | ||
+ | <meta charset="UTF-8"> | ||
+ | <title>Document</title> | ||
+ | </head> | ||
+ | <body> | ||
+ | <h1>Datos personales de ficha</h1> | ||
+ | <hr /> | ||
+ | <fieldset style="width:60%; background: azure"> | ||
+ | <h3>Nombre con htmlspecialchar<span style="color:red"><?= $n1 ?></span></h3> | ||
+ | <h3>Nombre con strip_tag<span style="color:red"><?= $n2 ?></span></h3> | ||
+ | <h3>Nombre <span style="color:red"><?= $nombre ?></span></h3> | ||
+ | <h3>Nombre con filter sin sanitizar<span style="color:red"><?= $n3 ?></span></h3> | ||
+ | <h3>Nombre directo de $_POSt<span style="color:red"><?= $n3 ?></span></h3> | ||
+ | <h3>Apellidos <span style="color:red"><?= $apellidos ?></span></h3> | ||
+ | <h3>Edad <span style="color:red"><?= $edad ?></span></h3> | ||
+ | <h3>Fecha de nacimiento <span style="color:red"><?= $fNac ?></span></h3> | ||
+ | <h3>Idioma <span style="color:red"><?= $mis_idiomas ?></span></h3> | ||
+ | <h3>Género <span style="color:red"><?= $genero ?></span></h3> | ||
+ | <h3>Correo <span style="color:red"><?= $email ?></span></h3> | ||
+ | <h3>Estudios <span style="color:red"><?= $estudios ?></span></h3> | ||
+ | </fieldset> | ||
+ | |||
+ | |||
+ | |||
+ | </body> | ||
+ | </html> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
</source> | </source> | ||
}} | }} | ||
− | + | ||
</div> | </div> | ||
Línea 730: | Línea 820: | ||
<!--3 --> | <!--3 --> | ||
<div class="slide"> | <div class="slide"> | ||
+ | </div> |
Última revisión de 18:51 10 dic 2024
- Este parámetro es opcional, si no se especifica por defecto toma el valor GET
- Cuando el método es GET las parejas se viaulizan en el URL, apareciendo como parte de él, separado por el signo interrogación con parejas variable=valor, y separadas entre ellas, si hubiera varias, con el &
Ejemplo
| |
Tip: El name es al servidor lo mismo que el id es al cliente, con id podéis acceder a los valores de los elementos con javascript, con el name lo haremos en php
<form action="datos.php" method="GET"> Nombre <input type=text name = 'nombre' value='maría'> Apellido <input type=text name = 'apellido' value='Ruiz'> <br /> <input type=submit value=enviar> </form>
Dos cajas de texto y el botón submit
|
Tip: No se recomienda por temas de seguridad leer de la superglobal $_REQUEST
Nota: Las variables en $_REQUEST se proporcionan al script a través de los mecanismos de entrada GET, POST, y COOKIE y por lo tanto pueden ser manipulados por el usuario remoto y no debe confiar en el contenido...)