<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4107496699099933270</id><updated>2011-07-29T02:26:39.789-05:00</updated><category term='programacion'/><category term='post'/><category term='mysql'/><category term='procesamiento'/><category term='php'/><category term='get'/><category term='formulario'/><category term='form'/><title type='text'>Macrotech: Blog tecnológico de Macroman</title><subtitle type='html'>Durante mucho tiempo me he dedicado al desarrollo de sistemas, acumulando conocimientos, experiencias y trucos que, en este blog, quiero compartir.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://macrotech66.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107496699099933270/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://macrotech66.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Bondarenko</name><uri>http://www.blogger.com/profile/08716886552704904612</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_DN4qF8-2eec/SnclB_hPXzI/AAAAAAAAATQ/BGqnrDQqm3g/S220/me.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>1</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4107496699099933270.post-4003312353166662174</id><published>2009-09-28T12:59:00.034-05:00</published><updated>2009-10-02T15:07:17.164-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='post'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='procesamiento'/><category scheme='http://www.blogger.com/atom/ns#' term='form'/><category scheme='http://www.blogger.com/atom/ns#' term='programacion'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='get'/><category scheme='http://www.blogger.com/atom/ns#' term='formulario'/><title type='text'>La historia de un formulario (1 de 4)</title><content type='html'>&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:arial;"&gt;Introducción&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;El procesamiento de formularios es una actividad diaria en cualquier sitio de internet. Registros, pedidos, compras, accesos, busquedas, etc. requieren de procesar un formulario para iniciar la serie de acciones que le darán al usuario la respuesta deseada.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Precisamente por ser tan común el modo de procesar un formulario tiene tantas soluciones como programadores. Sin embargo, muchas de estas maneras tienen omisiones, descuidos o errores que pueden afectar a un sitio.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Por ello decidí hacer este tutorial en 4 partes, para ofrecer distintas alterntivas para procesar un formulario, destacando en todas ellas lo bueno, lo malo y lo feo con el fìn de que el lector adquiera el conocimiento necesario para elegir el mejor modo para procesar un formulario en sus circunstancias particulares.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Parto del ejemplo mas burdo (que algunas personas aún utilizan) hasta procesamiento ajax.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;El problema de ejemplo:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Para ilustrar el tema del procesamiento de formularios, elegí un problema de lo mas común: la recepción del comenario de un visitante en nuestro sitio.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Basicamente el visitante nos dará nombre, correo electrónico, su comentario y nos indicará si desea recibir el boletin de nuestro sitio.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;span style="font-family:arial;"&gt;Requisitos:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Conocer lo basico de PHP y MySQL. Si se desea se pueden bajar los archivos de ejemplo &lt;/span&gt;&lt;a style="font-family: arial;" href="http://www.unycorn-systems.net/blog/tutorial1.rar"&gt;aqui&lt;/a&gt;&lt;span style="font-family:arial;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;span style="font-family:arial;"&gt;Antecedentes:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Básicamente, un formulario realiza una petición a un servidor enviando una serie de datos, que corresponden a los campos del formulario y el servidor devuelve una respuesta indicando si la peticion se efectuó correctamente.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Generalmente, la página indica al usuario el resultado de la peticion y, generalmente, queda a la espera de una nueva acción por parte del usuario.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Estas peticiones tienen dos métodos para realizarse: GET y POST.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;El método get envía la información al servidor como parte de una &lt;/span&gt;&lt;a style="font-family: arial;" href="http://es.wikipedia.org/wiki/Uniform_Resource_Identifier"&gt;URI&lt;/a&gt;&lt;span style="font-family:arial;"&gt;, en una estructura de pares nombre:valor, por ejemplo:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;www.lapagina.com/prueba.php?nombre=juan&amp;amp;apellido=perez&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Este método tiene la limitacion de la cantidad de información que puede enviar.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;El método POST envía los datos como parte de la propia petición y tambien esta estructurado como pares nombre:valor.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;No tiene la limitacion del tamaño del metodo GET.&lt;/span&gt;&lt;br /&gt;&lt;a style="font-family: arial;" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html"&gt;&lt;br /&gt;Mas informacion...&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;span style="font-family:arial;"&gt;Paso 1: el formulario&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Primero crearemos el formulario que utilizará nuestro usuario para dejar su comentario. Intencionalmente no manejé ningún estilo, para centrarnos totalmente en la funcionalidad.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: arial;" name="code" class="Php"&gt;&lt;br /&gt;&lt;form name="comentario" id="comentario" action="procesa_formulario.php" method="get" enctype="application/x-www-form-urlencoded" target="_self"&gt;&lt;br /&gt;&lt;fieldset&gt;&lt;br /&gt;&lt;legend&gt;Por favor deje su comentario&lt;/legend&gt;&lt;br /&gt;&lt;label for="nombre"&gt;Nombre:&lt;/label&gt;&lt;br /&gt;&lt;br /&gt;&lt;input id="nombre" name="nombre" size="50" maxlength="50" type="text"&gt;&lt;br /&gt;&lt;br /&gt;&lt;label for="correo"&gt;Correo electrónico&lt;/label&gt;&lt;br /&gt;&lt;br /&gt;&lt;input id="mail" name="mail" size="50" maxlength="50" type="text"&gt;&lt;br /&gt;&lt;br /&gt;&lt;label for="comentario"&gt;Comentario:&lt;/label&gt;&lt;br /&gt;&lt;br /&gt;&lt;textarea id="comentario" name="comentario" cols="38" rows="5"&gt;&lt;/textarea&gt;&lt;br /&gt;&lt;br /&gt;&lt;label for="boletin"&gt;Desea recibir nuestro boletin?:&lt;/label&gt;&lt;br /&gt;&lt;input id="boletin" name="boletin" value="si" type="checkbox"&gt;&lt;br /&gt;&lt;br /&gt;&lt;input id="enviar" name="enviar" value="Enviar" type="submit"&gt;&lt;br /&gt;&lt;/fieldset&gt;&lt;br /&gt;&lt;/form&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;En la linea uno, en el tag &lt;span style="font-weight: bold; font-style: italic;"&gt;form&lt;/span&gt;, determinamos un nombre y un id para nuestro formulario. Estos 2 atributos permiten identificar a este elemento dentro del &lt;/span&gt;&lt;a style="font-family: arial;" href="http://es.wikipedia.org/wiki/Document_Object_Model"&gt;DOM&lt;/a&gt;&lt;span style="font-family:arial;"&gt; de la página y serán utilizados mucho, más adelante.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Enseguida definimos el atributo &lt;span style="font-style: italic; font-weight: bold;"&gt;action&lt;/span&gt;. Este atributo indica la pagina .php que recibirá y procesará nuestra petición. En este caso se denomina &lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span class="string"&gt;procesa_formulario.php.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;A continuacion se especifica el tipo de "enconding" o codificación que se utilizará para este formulario (&lt;/span&gt;&lt;a style="font-family: arial; font-style: italic; font-weight: bold;" href="http://www.htmlcodetutorial.com/forms/_FORM_ENCTYPE.html"&gt;enctype&lt;/a&gt;&lt;span style="font-family:arial;"&gt;). Generalmente podemos omitir este atributo, que por default toma &lt;span style="font-style: italic;"&gt;application/x-www-form-urlencoded&lt;/span&gt;, que basta para cualquiera de los usos comunes, con excepcion de la subida de archivos, que  entonces tendría que ser &lt;span style="font-style: italic;"&gt;multipart/form-data&lt;/span&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Finalmente, indicamos en que ventana se mostrá &lt;span style="font-weight: bold;"&gt;procesa_formulario.php&lt;/span&gt;. En este caso puse &lt;span style="font-style: italic; font-weight: bold;"&gt;_self&lt;/span&gt;, para que se muestre dentro de la misma ventana.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;De esta forma hemos definido el comportamiento de nuestro formulario.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Posteriormente se presentan los campos que se procesarán como nombre, mail, comentario y boletín. Cada input representa una variable que se enviará a procesa_formulario.php.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Incluso el botón es enviado como variable, cuyo valor en este caso es "Enviar" (sin las comillas).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:arial;" &gt;Paso 2: el servidor&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Para procesar nuestra petición es necesario crear un archivo php que reciba y procese los datos enviados.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Para este ejemplo he creado el archivo &lt;span style="font-weight: bold;"&gt;procesa_formulario.php&lt;/span&gt;. Lo único que realiza este servidor es recibir los datos, crear y ejecutar el query para guardar el comentario en la base de datos:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: arial;" name="code" class="Php"&gt;&lt;br /&gt;$conex=new mysqli('localhost', 'usuario', 'password', 'testdata');&lt;br /&gt;if (mysqli_connect_error()) {&lt;br /&gt;die('Error de conexión (' . mysqli_connect_errno() . ') '&lt;br /&gt;   . mysqli_connect_error());&lt;br /&gt;}&lt;br /&gt;if(isset($_GET["boletin"])){&lt;br /&gt;&lt;br /&gt;$boletin=1;&lt;br /&gt;&lt;br /&gt;}else{&lt;br /&gt;&lt;br /&gt;$boletin=0;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;$qry_comentario="INSERT INTO comentario SET nombre='$_GET[nombre]', email='$_GET[email]', comentario='$_GET[comentario]', boletin=$boletin";&lt;br /&gt;$res_comentario=$conex-&gt;query($qry_comentario);&lt;br /&gt;&lt;br /&gt;if($res_comentario){&lt;br /&gt;$resultado="Se ha guardado el comentario exitosamente";&lt;br /&gt;&lt;br /&gt;}else{&lt;br /&gt;$resultado="Ha ocurrido un error en el proceso de alta.".$qry_comentario." - ".$conex-&gt;error;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;echo $resultado;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Lo primero que realiza este archivo es conectarse a la base de datos mediante el objeto &lt;/span&gt;&lt;a style="font-family: arial;" href="http://www.php.net/manual/en/class.mysqli.php"&gt;mysqli&lt;/a&gt;&lt;span style="font-family:arial;"&gt;. No hay que olvidar sustituir los datos de conexión por los de nuestro servidor MySQL.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;En segundo lugar se presenta una estructura &lt;span style="font-style: italic; font-weight: bold;"&gt;if..else..&lt;/span&gt; para la variable boletín.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Esto se debe a una particularidad de los checkboxes: cuando estan seleccionados o "checked" sí envían el nombre de variable. Caso contrario no.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Dado que necesitamos saber si el usuario desea que se le envíe el boletin, validamos con la funcion &lt;/span&gt;&lt;a style="font-family: arial;" href="http://www.php.net/manual/en/function.isset.php"&gt;isset()&lt;/a&gt;&lt;span style="font-family:arial;"&gt; si existe o esta "seteada" la variable boletín.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Si la variable existe significa que el usuario la ha seleccionado o "checkeado", por ello asignamos como 1 el valor a la variable &lt;span style="font-weight: bold;"&gt;$boletin&lt;/span&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;En caso contrario asignamos el valor 0.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Solucionado el escollo de la variable boletín, se construye y ejecuta el query para insertar la información recibida en nuestra base de datos.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: arial;" name="code" class="Php"&gt;&lt;br /&gt;$res_comentario=$conex-&gt;query($qry_comentario);&lt;br /&gt;&lt;br /&gt;if($res_comentario){&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;La variable &lt;span style="font-weight: bold;"&gt;$res_comentario&lt;/span&gt; recibe el resultado de nuestro query. Si es verdadero o "true" nos muestra un mensaje de éxito, caso contrario, nos informa del error.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Generalmente, cuando ocurre un error en etapas de desarrollo es una buena idea mostrar el query que se ejecuto y el mensaje de error recibido. Por ello se utilizan las instrucciones:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: arial;" name="code" class="Php"&gt;&lt;br /&gt;$resultado="Ha ocurrido un error en el proceso de alta.".$qry_comentario." - ".$conex-&gt;error;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Como se puede apreciar en la linea 16 del procesa_formulario, &lt;span style="font-weight: bold;"&gt;$query_comentario&lt;/span&gt; contiene la cadena de texto que se esta ejecutando. &lt;/span&gt;&lt;a style="font-family: arial;" href="http://www.php.net/manual/en/mysqli.error.php"&gt;$conex-&gt;error&lt;/a&gt;&lt;span style="font-family:arial;"&gt; contiene la descripción del error recibido.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Una vez que el archivo ya haya sido probado y validado, se deberían quitar estas líneas ya que pueden dar información sensible que puede ser utilizada por un atacante.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;span style="font-family:arial;"&gt;Paso 3: La base de datos&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;En los archivos de este tutorial viene un archivo SQL para la creación de la base de datos. Sin embargo a continuacion se muestra igualmente la sentencia:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: arial;" name="code" class="Php"&gt;&lt;br /&gt;CREATE TABLE IF NOT EXISTS `comentario` (&lt;br /&gt;`id_comentario` int(11) NOT NULL AUTO_INCREMENT,&lt;br /&gt;`nombre` varchar(50) NOT NULL,&lt;br /&gt;`email` varchar(50) NOT NULL,&lt;br /&gt;`comentario` text NOT NULL,&lt;br /&gt;`boletin` tinyint(1) NOT NULL,&lt;br /&gt;PRIMARY KEY (`id_comentario`)&lt;br /&gt;) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Ya con estos tres elementos:&lt;span style="font-weight: bold;"&gt; formulario.php&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;procesa_formulario.php&lt;/span&gt; y la base de datos podemos probar nuestra aplicación.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;span style="font-family:arial;"&gt;Conclusiones:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:arial;"&gt;Lo bueno:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Es una aplicación sencilla.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Rápida y fácilmente se puede adecuar a cualquier caso.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:arial;"&gt;Lo malo:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;¿Que sucede cuando el usuario no captura algún dato, por ejemplo el nombre?&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;¿Si el usuario pone una direccion erronea de correo electrónico o incluso, captura el email en nombre y el nombre en el email que hacemos?&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-family:arial;"&gt;Estos problemas se deben a que los datos NO son validados antes de ingresarse a la base de datos, por lo que podemos llenarnos de basura en un santiamén.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Por otro lado, al ser recibidos los datos por el metodo GET, un usuario malicioso puede ingresar los datos para el formulario escribiendolos directamente en la barra de navegación:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:arial;" &gt;http://localhost/pruebas2/procesa_formulario.php?nombre=&amp;amp;email=wakawaka&amp;amp;comentario=&amp;amp;enviar=Enviar&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;En este caso no es relevante, pero en casos de una compra o pago, esto podría generar operaciones no validadas por el usuario.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:arial;"&gt;Lo feo:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Si interceptamos los errores y se los mostramos al usuario desde procesa_formulario.php, para que los corrija es necesario que se regrese a formulario.php para que haga la corrección. En este caso es más que posible que tenga que capturar todo de nuevo.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;¿Tu volverías a capturar un formulario grande?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Evidentemente este ejemplo es meramente educacional y con fines de prueba. Pero nos ha mostrado los fundamentos y problemas asociados con el procesamiento de formularios.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;En el la siguiente parte mostraremos un paso adelante para mejorar el procesamiento de nuestros formularios.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:arial;"&gt;To Do's:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Trata de agregar reglas de validación para asegurarte que no lleguen datos vacíos.&lt;/span&gt; &lt;span style="font-family:arial;"&gt;Puedes usar la función &lt;/span&gt;&lt;a style="font-family: arial;" href="http://www.php.net/manual/en/function.empty.php"&gt;empty()&lt;/a&gt;&lt;span style="font-family:arial;"&gt;. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;¿Como te aseguras que un correo electrónico es correcto?.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;¿Te parece correcto que la conexión a la base de datos se encuentre dentro del archivo procesa_formulario.php o sería mejor que estuviese en un archivo aparte y agregarla con un &lt;/span&gt;&lt;a style="font-family: arial;" href="http://www.php.net/manual/en/function.include.php"&gt;include()&lt;/a&gt;&lt;span style="font-family:arial;"&gt;?.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107496699099933270-4003312353166662174?l=macrotech66.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://macrotech66.blogspot.com/feeds/4003312353166662174/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://macrotech66.blogspot.com/2009/09/la-historia-de-un-formulario-1-de-4.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107496699099933270/posts/default/4003312353166662174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107496699099933270/posts/default/4003312353166662174'/><link rel='alternate' type='text/html' href='http://macrotech66.blogspot.com/2009/09/la-historia-de-un-formulario-1-de-4.html' title='La historia de un formulario (1 de 4)'/><author><name>Bondarenko</name><uri>http://www.blogger.com/profile/08716886552704904612</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_DN4qF8-2eec/SnclB_hPXzI/AAAAAAAAATQ/BGqnrDQqm3g/S220/me.jpg'/></author><thr:total>0</thr:total></entry></feed>
