viernes, 18 de enero de 2008

4. Formularios con PHP

Vamos a dar un repaso a los formularios básicos HTML y veremos la interacción con PHP.

Un formulario básico en HTML se compone de la etiqueta <FORM> con un conjunto de parámetros (de los cuales veremos los básicos) y el conjunto de campos que se envía con el formulario. Lo más básico para definir un formulario sería, por ejemplo:

<FORM NAME='mi_formulario' ACTION='procesar.php' METHOD='POST'>

........

</FORM>

Los 3 parámetros que he incluído son:

• NAME: el nombre del formulario para luego ser referenciado en el código (se utiliza especialmente el nombre que le demos cuando trabajemos con javascript). Es muy recomendable utilizarlo en conjunción con el parámetro ID (ID='mi_formulario' siguiendo el ejemplo) ya que según qué navegadores puede primar un parámetro sobre otro.

• ACTION: indica la página de destino a la que se deben mandar los datos del formulario. Como vemos en el ejemplo, los datos se mandarían a la página procesar.php

• METHOD: indica cómo se deben pasar los parámetros:

• POST: se mandan como variables “ocultas” (basta saber esto para lo que queremos conseguir en este cursillo).

• GET: las variables se mandan dentro de la URL de destino (son visibles).

Por ejemplo si pasamos una variable que sea el DNI de la persona y el formulario usa METHOD=GET veríamos en la barra de navegador una URL similar a:

http://miservidor/pagina.php?dni=112335965

Sin embargo, con POST veríamos solamente http://miservidor/pagina.php y el acceso a la variable DNI vendría “embebido” en el formulario.

Visto así, parece que siempre debiéramos usar POST en vez de GET, ¿verdad? El usuario no tiene por qué ver qué variables manejamos. Esto será cierto la mayoría de los casos, pero habrá ocasiones en las que no nos quede más remedio que usar GET. La experiencia te irá diciendo cuándo usar uno u otro método.

Hay un cuarto parámetro que utilizaremos bastante: TARGET. Este parámetro nos sirve para determinar dónde debe mandar los datos el formulario. ACTION nos determina la página que ha de mostrar y que deberá procesar los campos del formulario, TARGET dirá dónde debe mostrarse esa información. Puede tomar los valores:

• _self : en este mismo marco o ventana.

• _blank : en una ventana nueva.

• _top : en el marco de que depende toda la ventana que estamos visualizando (si no utilizamos marcos en nuestra página (FRAMESET) equivaldrá a _self).

• _parent : el marco padre de la ventana que estamos visualizando (si utilizamos FRAMESET con sólo un nivel de anidación, equivaldrá a _top).

• “nombre elemento” : podemos indicar que el destino sea un elemento de nuestra página susceptible de recibir información de un formulario. Por ejemplo, un marco que hayamos creado y tenga un nombre definido, un IFRAME, etc... en general se entiende este “nombre elemento” como el nombre de un marco.

Dentro del formulario tendremos campos que se declaran con la etiqueta INPUT. No vamos a repasar los distintos tipos de campos que existen sino que pasaremos directamente a ver cómo tratarlos en PHP.

Veamos cómo manejar los campos de un formulario que es recibido por una página PHP. Sea el siguiente formulario que incluiremos en la página c4-ejemplo1.html:

<FORM NAME=”datos” ID=”datos” ACTION=”c4-e1.php” METHOD=”POST”>

Tu nombre: <INPUT NAME=”nombre” ID=”nombre” size=”20” maxlength=”20”>

<BR>

Tu email: <INPUT NAME=”email” ID=”email” size=”20” maxlength=”20”>

<BR>

<INPUT TYPE=”SUBMIT” VALUE=”Enviar”>

</FORM>

Introducimos nuestro nombre y el email y pulsamos el botón de Enviar. ¿Cómo consultamos el valor de estos campos en el PHP de destino? PHP construye arrays asociativos para las variables que nos remitan por un formulario:

• Si hemos usado METHOD=GET tendremos un array asociativo $_GET[“nombre_var”] para referenciar cada variable del formulario.

• Si hemos usado METHOD=POST el array será $_POST[“nombre_var”].

Dependiendo además de la configuración del servidor existirá la posibilidad de utilizar, directamente $nombre_var (por ejemplo, $dni ó $email). A modo de comentario, esto dependerá de si la variable REGISTER_GLOBALS está a ON en el servidor. Sin embargo, $_POST y $_GET siempre estarán disponibles, por lo que a efectos de portabilidad de la aplicación es más recomendable utilizar estos arrays.

Por tanto, si construimos el siguiente PHP, tendremos en pantalla la información remitida por el formulario:

<HTML>

<HEAD>

<TITLE>Cap 4 ejemplo 1</TITLE>

</HEAD>

<BODY>

Tu DNI es <? echo $_POST[“dni”]; ?>

Tu email es <? echo $_POST[“email”]; ?>

</BODY>

</HTML>

Puedes ver el ejemplo completo aquí: Ejemplo c4-e1
Actualización 28/01/2014: Se ha reparado este ejemplo, ya que en el html se refería a un campo "nombre" y en el php se refería a un campo "DNI".

Filosofía Todo en uno
Muy frecuentemente nos convendrá (o necesitaremos) mantener en pantalla el mismo formulario que hemos enviado al PHP. Para lograrlo, construiremos el formulario dentro de una página PHP y accederemos a las variables de la siguiente forma:

<HTML>

<HEAD>

<TITLE>Cap 4 ejemplo 2</TITLE>

</HEAD>

<BODY>

<FORM NAME="datos" ID="datos" ACTION= "c4-e2.php" METHOD="POST">

Tu nombre: <INPUT NAME="nombre" ID="nombre" size="20" maxlength="20" VALUE="<? echo $_POST["nombre"]; ?>" >

<BR>

Tu email: <INPUT NAME="email" ID="email" size="20" maxlength="20" VALUE="<? echo $_POST["email"]; ?>" >

<BR>

<INPUT TYPE="SUBMIT" VALUE="Enviar">

</FORM>

<?

if (strlen($_POST["nombre"]) > 0){

echo "<BR>Tu nombre es ";

echo $_POST["nombre"];

}



if (strlen($_POST["email"]) > 0){

echo "<BR>Tu email es ";

echo $_POST["email"];

}



?>

</BODY>

</HEAD>

He resaltado en azul aquello que hemos cambiado o añadido:

• Si hacemos que el ACTION del formulario sea la propia página que estamos visualizando, los valores que se introduzcan después de visualizar la primera vez la página serán remitidos a nuestra misma página.

• Al ponerle a cada INPUT la propiedad VALUE le estamos asignando un valor por defecto. Si le indicamos que el valor por defecto es “lo que contenga la variable PHP” estaremos “conservando” lo remitido en el formulario.

• En la sección final he incluído el uso de la función strlen de PHP (es equivalente a la misma función en C). Esta función devuelve el número de caracteres que componen la variable que se le pase por argumento. Lo que hemos hecho ha sido decir “si la variable contiene más de cero caracteres, ejecuta estas sentencias”. Las sentencias, por su parte, son muy simples: mostrar un mensaje fijo de texto y a continuación el valor de la variable.

Puedes ver el ejemplo funcionando en Ejemplo c4-e2

Actualización 28/01/2014: Os dejo este enlace por si queréis descargar los ficheros fuente de los ejemplos vistos:  Ejemplos capitulo 4


29 comentarios:

Mario R. Vasquez S. dijo...

Me parece excelente el planteamiento.Si cada tecnica es asi de explicada , no hace falta material adicional.

Pazificador dijo...

Toda la explicacion excelente, pero me parece que el codigo publicado no es el correcto, estube intentando entender por que no resulta y solo me da el siguiente error:

){ echo "
Tu nombre es "; echo $_POST["nombre"]; } if (strlen($_POST["email"]) > 0){ echo "
Tu email es "; echo $_POST["email"]; } ?>

y las areas de texto con el codigo php escrito.

Nunca pense que alguien necesitaria esto.

Gracias.

Unknown dijo...

Muchas gracias por los comentarios, mi intención es enseñarlo de esta manera precisamente para que no haga falta tener en cuenta más que lo aprendido y después aplicar el propio ingenio a la hora de diseñar y programar.

Pazificador, cuál es el error que te genera? en la página de pruebas va correctamente y es un copiar-pegar, ¿me puedes decir el texto de error que te sale y así analizarlo?

Una cuestión interesante es la función isset para comprobar si una variable tiene algún valor en vez de usar strlen. El uso sería

if (isset($variable)){
}

pero a mí personalmente no me gusta en el sentido de que isset devuelve true incluso si la variable fue introducida vacía. Con strlen me aseguro que tiene algún contenido.

Saludos y muchas gracias por los comentarios

Gosz dijo...

gracias, ahora ya conozco un poquito de php, pero no has publicado nada nuevo, espero que si sigas publicando

Saludos

Ines dijo...

Enhorabuena y muchas gracias por esta página, estoy haciendo un curso de php y me está ayudando mucho.
Mi problema es con la página que imprime los datos del formulario, en la misma página. Resulta que cuando meto un dato y después, doy a actualizar, me aparece grabado el dato anterior y no se borra hasta que se introduce el nuevo.
¿Sabrías decirme como solucionar esto?
Muchas gracias de nuevo

Unknown dijo...

Ante todo gracias por los comentarios. Ando liado de trabajo y no veía que nadie tuviera interés, por eso lo dejé un poco, pero intentaré sacar tiempo para seguir publicando capítulos.

Inés, lo que comentas creo que no es resoluble en el sentido de que cuando pulsamos actualizar en el navegador, lo que estamos haciendo es recargar la página actual con toda la información que pudiera haber recibido (por ejemplo, los datos del formulario que se te recargan). Existen opciones vía Javascript para inhibir eventos de ventana como pueda ser la recarga de página o el cancelar la carga de página. No es algo trivial, pero se puede hacer así para al menos evitar que tu formulario reciba contínuamente los mismos datos si pulsan F5. También puedes implementar opciones que se basen en tu lógica de negocio para controlar si están actualizando la página o bien es una "llamada limpia". Por ejemplo si estás en un formulario en el que insertas los datos de un cliente, no tiene lógica que se haga la misma inserción 2 veces... espero que esto te haya servido.

Saludos

Pazificador dijo...

Ya entendi que era.
La cosa es que estube probando todo este tiempo con el famoso servidor local Xamp y creo que no lo soporta, termine de pura curiosidad subiendolo a mi servidor en la Inet y todo OK! me inspiro a hacer un formulario gigante que necsitaba publicar en pantalla, muchas Gracias.

Anónimo dijo...

por cierto. esto es lo que me aparece en la url de la nueva página:

http://localhost/secuencia/recordar.php?pasadato=%3C%3Fphp+echo%28%24idclave%29%3B%3F%3E

Anónimo dijo...

vaya... no se que pasó que no entro mi primer texto... ahí va de nuevo...
esto iba antes de ese otro comentario sobre la url.

vaya!.. de nuevo... no me deja mandar lo que he escrito porque tiene fragmentos de código...

Hola... como estan?...
Desde Canarias una duda:

Estoy tratando de hacer algo similar al ejemplo que se plantea pero no hay modo.
No se si alguien va a leer esto y ayudarme. Si es así vuelvo a escribir y explico mejor mi problema. De momento, de forma resumida lo

que me pasa es lo siguiente:

1. Tengo una variable PHP que ha tomado su valor de una consulta a MySql.
2. Mas adelante tengo un formulario con un -INPUT HIDDEN- y trato de asignarle en VALUE el valor de mi variable PHP. El formulario está

dentro de un código PHP usando en cada linea echo('aquí cófigo html etc etc');

Usando la sintaxis que se comenta arriba: LO HE TENIDO QUE BORRAR PARA PODER ENVIAR ESTO; y todas las variantes que se me

ocurren (con/sin comillas, parentesis, etc), y no hay forma.

No consigo pasar el valor a la siguiente página que es llamada por el formulario cuando su pulsa un boton submit del mismo

formulario.

Se que el resto de todo el código está bien porque si cambio la asignación de value por algo normal entre comillas, ejemplo:

value="hola", todo llega pefectamente a la otra página.

Ya estoy desquiciado... que alguien me eche una mano por favor... Gracias.

Unknown dijo...

hola Gonzalo_es
El problema que comentas puede ser por varias posibilidades:
1) El input type=hidden que estás declarando no está dentro del formulario que envías.
2) No estás capturando bien el valor del campo MySQL que quieres enviar. ¿Has probado a hacer un echo del valor del campo sin ponerlo en el formulario, para comprobar que sí está tomando el dato que buscas?
3) El valor del campo mysql que imprimes como value del input hidden contiene caracteres que te cortan el campo html input. Por ejemplo, si el valor del campo extraído de BD es D'amaro, tu input type no podría declararse como input type='hidden' value='\<\? echo $campomysql \?\>' porque la etiqueta value debe estar entre comillas simples y el valor del campo contiene una comilla simple. Si este es tu problema, puedes usar las funciones php addslashes y stripslashes.
Cualquier otra duda, intentaré resolvértela. Saludos

Unknown dijo...

En el comentario anterior he tenido que indicar las marcas inicio y fin de php como \<\? en vez de por su notación convencional ya que de otra forma no me aceptaba ponerlo ;-) supongo que se entiende el código. Saludos

Unknown dijo...

para terminar, Gonzalo_es, te sugiero que rastrees el error. Para ello yo suelo utilizar dos mecanismos:
1) Ver el código fuente generado de la página y examinar el input que me está dando problemas
2) Usar un recorrido asociativo de la variable $_POST o $_GET (según el method de tu formulario) y que me imprima en pantalla exactamente qué nombres de campos y valores recibe. Para ello puedes utilizar echo print_r($_POST) o echo print_r($_GET).

Saludos

Anónimo dijo...

Gracias, anda buscando especificamente ( consulte tres libros y lo explicaban como espagueti o trivial XD).

koper dijo...

keremos mas

koper dijo...

nos tienes a pan y agua tio,
pasamos mas hambre de conocimientos ke el perro un ciego!

animate!

Anónimo dijo...

Y como sigue???

Cuando al fin encuentro un curso que realmente enseña lo que quiero aprender (no solo teoria, sino, como aplicarlo) no tiene continuidad ¿?

Hasta donde llega el curso a dia de hoy:
COJONUDO!!!!!!!!

Unknown dijo...

hola!! como véis el blog hace mucho tiempo q no se actualiza, no sé si podré seguir con él pero cualquier técnica que queráis ir aprendiendo me comprometo a documentarla. Gracias por tus ánimos koper.

Y Daniel, evidentemente el curso seguiría laaargo y tendido, php tiene muchísimo (pero MUCHÍSIMO) más que ofrecer, pero antes de eso también haría falta explicar cosas de javascript (por ejemplo, validación de formularios y similares que yo siempre he preferido realizar en el lado del cliente y no del servidor). Intentaré sacar tiempo para hacer alguna lección que mezcle validaciones JS y PHP, pero en cualquier caso puedes consultarme cualquier duda ok?

btocruzado dijo...

no puedo creer que justo cuando encuentro un tutorial de php perfecto... desaparece...ojala vuelva

Anónimo dijo...

Es una pena que este tutorial tan bueno deje de publicar capítulos... ¿SeekeR no has pensado en poner algo de publi de google? ¡¡Yo pulsaría todos los días y así tendrías un incentivo por continuar con el tuto!!

Rongo dijo...

Bueno... como parece que este magnífico blog está con el freno de mano echado, me gustaría preguntar algunas cosas al creador... A ver si con suerte puedo conseguir respuesta:
1º) Un buen libro de php en español.
2º) Una vez compardo un dominio web, ¿cuáles son los pasos a seguir para colgar una web php?

Muchas gracias.

Unknown dijo...

Hola Rongo.
En cuanto a bibliografía, yo te recomendaría más bien que utilizaras webs como phpya.com que tienen todo bastante bien explicado. Yo aprendí con un libro de McGraw-Hill sobre PHP 4.x pero ya está desfasado.
Y sobre el dominio, si compras un dominino "limpio" (esto es, sólo espacio en el servidor y una consola de administración) tendrás q instalarte un apache 2.x y una distribución de php (yo te recomendaría la 5.x). Depende del tipo de alojamiento q hayas contratado pq algunos ya te dan esos servicios instalados y no necesitas más q empezar a desplegar tus aplicaciones en el directorio q la empresa suministradora te diga.

Saludos

cu3rvac30 dijo...

Seeker jodio a ver si te pasas por el foro de vez en cuando que los vikingos te echamos de menos, bueno al menos yo, un fuerte abrazo y FELICIDADESSSSSSS VIEJO

PD: FELICITAME POR EL TITULO DE COPA DE MI SEVILLA ¿NO?

No lo olvides... http://www.soyvikingo.net

ha cambiado de direccion por problemas de dominio, te espero por alli

Unknown dijo...

cu3rvac30 amigo! muchísimas gracias!! y por supuesto felicidades por ese título, también yo lo celebré ;-)
A ver si me paso por el foro... he tenido un añito muy difícil por temas personales, un saludo!

Unknown dijo...

Genial, sólo un poco más de mejor explicado

Unknown dijo...

por lo has dejado de seguir publicando .????

Beltrones dijo...

Muy bueno Gracias!

Unknown dijo...

Excelente amigo continua asi !!

Edu dijo...

Muchas gracias, me esta ayudando mucho a empezar a programar en PHP.

Espero seguir leyendo tus posts y que continúes ayudando a quien lo necesita.

Te recomiendo.

Anónimo dijo...

Buen dia encontre este formulario en html pero me dicen que es obsoleto que recomiendan uno en php mira el link que me recomiendas el php o el html gracas http://piemse.com/como-crear-un-formulario-de-contacto-html/