Vous êtes sur la page 1sur 16

SISTEMA DE ENVIOS DE POSTALES CON PHP Mostraremos a grandes rasgos en qu consiste la aplicacin y cules son sus partes constitutivas.

Una pgina de envo gratuito de postales nos ha parecido un ejemplo tpico de sitio web en el que se pueden poner de manifiesto muchas de las utilidades del trabajo en pginas dinmicas. Imaginaos por un momento un sitio web de postales gestionado nicamente por HTML... tcnicamente imposible. En esta aplicacin, el visitante tendr acceso al sitio, elegir el dibujo para su postal y rellenar un formulario para su envo. A continuacin podr ver, corregir y enviar su postal. Un e-mail ser enviado al destinatario para avisarle de la existencia de su postal en el cual figurar un enlace a la URL donde podr visualizarla. Este servicio postal consta de una pequea base de datos entre bastidores que almacena, por un lado, las imgenes y las cataloga por tipo (Cumpleaos, San Valentn y Navidad) y por otro, las diferentes postales enviadas por el internauta definidas por los diferentes parmetros necesarios para su correcta recepcin. La aplicacin consta de los siguientes scripts: index.php Es la pgina de entrada. A partir de ella accederemos al tipo de postal que buscamos. verpostales.php Se encarga de llamar a la base de datos para pedir las imgenes correspondientes al tipo de postal elegida y plasmarlas en la pgina. formulario.php Aqu introducimos los datos para el correcto envo de la tarjeta. enviopostal.php Su cometido es el de componer la postal con la imagen elegida y los datos del formulario e imprimirla. Tambin se encarga de gestionar el envo del e-mail al destinatario y almacenar en la base los datos correspondientes a dicho envo. leepostal.php Mostrara al destinatario la postal haciendo una llamada a la base y recogiendo los datos previamente almacenados por el script enviopostal.php El funcionamiento de la aplicacin puede ser visto continuamente en lnea desde cualquiera de los captulos pinchando sobre el enlace ir a la aplicacin. Recordamos que los scripts, imgenes y archivo para la creacin de la base de datos pueden ser directamente descargados. El funcionamiento de esta aplicacin sido deliberadamente simplificado en todos los sentidos por varias razones obvias, sobre todo buscando en esta simplicidad una ms fcil comprensin de los aspectos primordiales. Esto no nos impedir de, en determinados puntos, hacer hincapi sobre algunas mejoras que podran realizarse. La aplicacin puede ser seguida en todo momento a partir de cualquier capitulo pinchando sobre el siguiente enlace: Ir a la aplicacin

Explicamos los pasos a seguir para crear la base de datos en MySQL


Antes de abordar los scripts de nuestro sitio, es importante crear la base de datos (BD) que va a ser utilizada por los mismos. Hemos elegido una base de datos MySQL, entre otras razones, porque se trata del tipo de base ms corrientemente utilizado en combinacin con PHP. Por supuesto, podramos haber utilizado cualquier otra base para la cual PHP tenga funciones o simplemente crear un DSN y emplear las funciones para ODBC disponibles en PHP. Pensamos que el hecho de programar en este lenguaje lleva inherente la necesidad de conocer mnimamente el funcionamiento de MySQL y que la utilizacin de cualquier otra BD o mtodo de conexin no conlleva cambios significativos en los scripts que abordaremos. Veremos pues el caso particular de MySQL y dejamos a vuestra cuenta aplicar lo visto para cualquier otra base.

SISTEMA DE ENVIOS DE POSTALES CON PHP


En captulos de otros manuales hemos explicado la instalacin y utilizacin de MySQL y la sintaxis para la creacin de tablas. En este captulo nos limitaremos a describir paso a paso la creacin de la base postal sin hacer hincapi en el significado de los comandos utilizados. Pasemos pues a describir uno a uno los pasos a seguir: 1.-Creacin de la base de datos Una vez dentro de MySQL, el primer paso es crear la base de datos:

Create database postal;


2.-Creacin de las tablas Para la creacin de la tabla imagenes, donde almacenaremos los grficos de las postales, generaremos dos campos: id_imagen, que es el identificador del grafico, especfico para cada uno y cuyo valor corresponde tambin con el nombre del archivo gif. El otro campo, tipo, define el objeto de la postal (cumpleaos, Navidades o San Valentn). La forma ms simple de crear esta tabla sera:

Create Table imagenes ( id_imagen int(2), tipo varchar(15) );


La siguiente tabla a crear, postal, debe guardar toda una serie de datos necesarios para hacer llegar la postal al destinatario y hacer que el remitente reciba la confirmacin de recepcin. Veremos cmo acta cada uno de esos datos en el script ms adelante. Por ahora nos limitaremos a describir la sintaxis de la creacin:

Create Table postal ( id_postal int(5), texto varchar(255), email_destinatario varchar(50), nombre_destinatario varchar(50), email_remitente varchar(50), nombre_remitente varchar(50), id_imagen int(2), avisar char(7) );
Para una aplicacin ms compleja deberamos definir adems las claves y considerar ms detenidamente el tipo de campo a definir. Aconsejamos leer los captulos del tutorial de SQL donde podris consejos para mejorar las prestaciones de las tablas. 3.-Relleno de la tabla imagenes con los grficos de muestra Para rellenar rpidamente la tabla en un primer momento, sin necesidad de recurrir a sentencias SQL tipo Insert, podemos crear un archivo de texto con los registros separados por lneas y los valores de campo, puestos en el buen orden, separados por tabuladores. En el pack de descarga encontraris el archivo texto imagenes ya preparado. Lo nico que tenis que hacer es colocar el archivo en el directorio bin de MySQL y ejecutar la siguiente orden en la base de datos:

Load data local infile "imagenes.txt" into table imagenes;


Con esto tendremos llena la tabla imagenes. Para comprobarlo teclead:

select * from imagenes;


Veris como aparece en pantalla el contenido de la tabla que obviamente corresponde al del archivo texto.

SISTEMA DE ENVIOS DE POSTALES CON PHP


4.-Creacin del directorio virtual en el servidor Llegados a este punto, queda extraer los archivos restantes del pack a un directorio que deber ser registrado en el servidor como directorio virtual tal y como hemos explicado para el caso del PWS.

Empezamos a describir la aplicacin entrando por la puerta


Cumplidos los requisitos de instalacin de la base de datos y creacin del directorio virtual, estamos en medida de poder tratar la aplicacin en local. Aqu os presentamos el listado del primer script index.php que resulta ser la puerta de entrada a nuestra aplicacin:

<? //Incluimos la libreria de funciones include("funciones.php"); //Creamos el encabezado HTML html_encabezado("Servicio de postales de DesarrolloWeb","Servicio de postales gratuitas para todo tipo de felicitaciones","postal, navidad, san valentin, cumpleaos, felicitacion") ?> <div align="center"> <font color="#9933ff">Bienvenido al servicio de postales de DesarrolloWeb</font><br> Por favor, selecciona el tipo de postal que deseas buscar <br><br> <img src="clipart_office_mail_155.gif" width="117" height="135" border="0" alt=""> <br> <br> <a href="verpostales.php?tipo=sanvalentin">San Valentn</a> <a href="verpostales.php?tipo=cumple">Cumpleaos</a> <a href="verpostales.php?tipo=navidad">Navidad</a><br> <a href="verpostales.php?tipo=todas">Todas</a> </div> </body> </html>
Puede verse que el script tiene dos partes fundamentales: Un primer cdigo PHP que llama a un archivo ("funciones.php") y a una funcin (html_encabezado) seguido de un fragmento de HTML con un mensaje de bienvenida y unos enlaces que apuntan a las diversas temticas de las postales. El archivo al que se hace la llamada contiene un conjunto de funciones que sern utilizadas por otras pginas de la aplicacin. Dentro de esta librera tenemos tres funciones, una de ellas llamada en este script que, como veremos, sirve para crear el principio del documento HTML con su ttulo y etiquetas META generados. En la parte HTML del listado podemos observar como han sido definidos los enlaces a las distintas categoras de postales:

<a href="verpostales.php?tipo=categoria">Categora</a>
Como veis estamos pasando la variable tipo por URL hacia la pgina verpostales que podr a su vez explotarla como sea necesario.

Creamos una pgina que muestra las postales posibles para elegir dentro de una categora.

SISTEMA DE ENVIOS DE POSTALES CON PHP


Al pinchar sobre uno de los enlaces de index.php, somos enviados al script verpostales.php que se encarga de mostrarnos las postales disponibles dentro de una categora. En este caso, como podis ver, la mayora del cdigo esta realizado en PHP. Aqu os mostramos el listado antes de comentarlo:

<? //Incluimos la libreria de funciones include("funciones.php"); //Creamos el encabezado HTML html_encabezado("Servicio de postales de DesarrolloWeb","Servicio de postales gratuitas para todo tipo de felicitaciones","postal, navidad, san valentin, cumpleaos, felicitacion"); ?> <table align="center" border="0" cellpadding="2" cellspacing="0" bgcolor="White"> <tr> <td align="center" colspan="4" bgcolor="#ccff00"><font color="#9933ff">Te presentamos nuestras postales</font></td> </tr> <? //$tipo ha sido tranferida por URL //Genero la sentencia SQL distinta si queremos ver todas las postales if ($tipo!="todas") $ssql="Select * From imagenes Where tipo like '".$tipo."%'"; else $ssql="Select * From imagenes"; //Conectamos a la BD $connectid=mysql_conexion(); //Ejecutamos sentencia SQL y recogemos resultado en damefila $resultid = mysql_db_query("postal",$ssql); $damefila=mysql_fetch_array($resultid); //Creamos las celdas con las imagenes/enlace while ($damefila) { $i=1;//i es el numero de columnas de la tabla echo "<tr>\n"; while ($i<=4 and $damefila) { echo '<td><a href="formulario.php?id='.$damefila["id_imagen"].'"><img src="imagenes/'.$damefila["id_imagen"].".gif\" border=\"0\"></a></td>\n"; ++$i; $damefila=mysql_fetch_array($resultid); } echo "</tr>\n"; } ?> <tr> <td align="center" colspan="4" bgcolor="#ccff00">Haz click sobre la tarjeta que te guste para enviarla</td>

SISTEMA DE ENVIOS DE POSTALES CON PHP </tr> </table> <? //Liberamos la memoria de consulta mysql_free_result($resultid); //Generamos enlace hacia atras y cierre de documento html_pie_volver($HTTP_REFERER) ?>
Puede verse como la forma de empezar el script coincide con la vista anteriormente : Incluimos la librera de funciones y llamamos a la funcin que crea el encabezado HTML. El paso siguiente es evaluar, mediante un condicional if, si la categora elegida es una cualquiera o, por el contrario, queremos verlas todas. El tipo de sentencia SQL con la que interrogaremos a la BD cambia en funcin de ello. Una vez elegida la sentencia SQL apropiada realizamos la llamada a la funcin mysql_conexion() creada por nosotros mismos que nos conecta con la base de datos para, a continuacin, ejecutar la sentencia y recoger los datos del primer registro en forma de variable array. Es en este punto que tenemos el plato fuerte del script: Dos bucles while anidados que nos permiten recrear una tabla en la que emplazamos en cada celda una imagen que enlaza al script siguiente y que pasa por URL el identificador de la imagen en cuestin. El recorrido de los bucles es el siguiente: 1.-Nos colocamos en la primera columna de la fila ($i=1;) y creamos la etiqueta <tr> 2.-Entramos en el bucle que genera las celdas y que se finalizara cuando no haya ms registros o se llegue al numero mximo de columnas definido arbitrariamente. 3.-Creamos la celda que aloja la imagen definida para este registro junto con el enlace que envia por URL el identificador de la imagen. 4.-Nos colocamos en la columna siguiente y pedimos el siguiente registro 5.-Repetimos 3 y 4 hasta llenar una lnea o acabar los registros. 6.-Cerramos la etiqueta <tr> y volvemos a 1 salvo si los registros se han acabado. Para comprender este bucle, nada mejor que ver el cdigo fuente generado por el navegador al ejecutar el script. La parte final del script se encarga de liberar la memoria ocupada por la consulta que hemos realizado y, a partir de la funcin html_pie_volver crear un enlace para volver a la pgina anterior sirvindose de la variable de sistema $HTTP_REFERER presentada en otro captulo.

Presentamos las funciones de cosecha propia integradas en la aplicacin


Aqu os presentamos las tres funciones que, a modo de ejemplo, hemos creado para este sitio web. Se trata de funciones extremadamente sencillas en cuya descripcin pormenorizada no vamos a entrar. Las tareas desempeadas por estas funciones son las siguientes: html_encabezado($titulo,$descripcion,$keywords) Abre las etiquetas HTML, HEAD y TITLE y BODY a la vez que las rellena las META con las informaciones definidas por las variables $titulo,$descripcin y $keywords y define los estilos.

SISTEMA DE ENVIOS DE POSTALES CON PHP


html_pie_volver($volver) Cierra las etiquetas BODY y HTML e introduce un enlace con el texto Volver que apunta hacia la pgina definida por la variable $volver. mysql_conexion() Crea y comprueba el vnculo con MySQL. Los parmetros de conexin son definidos en esta funcin. Os mostramos a continuacin el listado para que vosotros mismos las estudiis.

<? function html_encabezado($titulo,$descripcion,$keywords) { //Genera un encabezado de HTML, rellena el titulo y las etiquetas META y define los estilos echo "<HTML>\n<HEAD>\n<TITLE>$titulo</TITLE> <meta name=\"description\" content=\"$descripcion\"> <meta name=\"keywords\" content=\"$keywords\"> <meta name=\"title\" content=\"$titulo\"></HEAD>\n <style type=\"text/css\"><!--A:link {text-decoration: none; color : #9933ff;} A:visited {text-decoration: none; color : #9933ff;} A:active {text-decoration: none} BODY { font-size : 11pt; font-family : comic sans ms,verdana,arial,helvetica; font-weight : bold; color : 0066ff; background-color : #ccff00; margin-left : 0px; margin-right : 0px; margin-top : 0px; margin-bottom : 0px; } TD { font-size : 11pt; font-weight : bold; font-family : comic sans ms,verdana,arial,helvetica; color : 0066ff; } --> </style> <body>\n"; } function html_pie_volver($volver) { //Genera el cierre del documento e introduce un enlace con direccion configurable y texto "Volver" echo "<div align=\"center\"><a href=\"$volver\">Volver</a></div> </body> </html>"; } function mysql_conexion() { //Crea una conexion a una base mysql y previene de un eventual fallo

SISTEMA DE ENVIOS DE POSTALES CON PHP //Conexion con la base $connectid = mysql_connect("localhost","",""); //Compruebo el exito de la conexion if (!$connectid) echo "Error en la conexin con la base de datos"; else return $connectid; } ?> Creamos un formulario dinmico por medio de cookies y variables de sesin
Las imgenes mostradas en verpostales apuntan hacia la pgina formulario.php de la cual os presentamos el listado a continuacin:

<? //Iniciamos la sesion en la pagina registrando variables_formulario session_register('variables_formulario'); //Si las variables_formulario no estan creadas las definimos vacias if (isset($variables_formulario)==0) { $i=0; while ($i<=6) { $variables_formulario[]=""; ++$i; } } //Incluimos la libreria de funciones include("funciones.php"); //Creamos el encabezado HTML html_encabezado("Servicio de postales de DesarrolloWeb","Servicio de postales gratuitas para todo tipo de felicitaciones","postal, navidad, san valentin, cumpleaos, felicitacion"); //Creamos el formulario, rellenamos los campos que conocemos con session y/o cookies //Enviamos un dato escondido: id_imagen ?> <table align="center" border="0" cellpadding="2" cellspacing="2"> <td colspan="2" align="center" style="celda1"><font color="#9933ff">Ten la amabilidad de rellenar el formulario</font></td> <form action="enviopostal.php" method="post"> <tr> <td align="center">Email destinatario<br><input type="Text" name="email_destino" size="20" maxlength="50" value="<? echo $variables_formulario[0]; ?>"></td> <td align="center">Nombre destinatario<br><input type="Text" name="nombre_destino" size="20" maxlength="50" value="<? echo $variables_formulario[1]; ?>"></td>

SISTEMA DE ENVIOS DE POSTALES CON PHP </tr> <tr> <td align="center">Email remitente<br><input type="Text" name="email_origen" size="20" maxlength="50" value=" <? if (isset($email)) echo $email; else echo $variables_formulario[2]; ?> "></td> <td align="center">Nombre remitente<br><input type="Text" name="nombre_origen" size="20" maxlength="50" value=" <? if (isset($nombre)) echo $nombre; else echo $variables_formulario[3]; ?> "><td> </tr> <tr> <td align="center" colspan="2"><input type="Checkbox" name="avisar" <? echo $variables_formulario[4]; ?>>Quiero ser avisado de la recepcin</td> </tr> <tr> <td align="center" colspan="2">Texto postal<BR><textarea name="texto" cols="40" rows="6"><? echo $variables_formulario[5]; ?></TEXTAREA></td> </tr> <tr> <td align="center" colspan="2"><input type="Submit" value="Enviar" name="enviar"> &&nbsp;&&nbsp;&&nbsp;<INPUT type="Submit" value="Ver postal" name="ver"></td> </tr> </table> <input type="Hidden" name="id_imagen" value="<? echo $id ?>"> </form> <? //Generamos enlace hacia atras y cierre de documento html_pie_volver("index.php") ?>
Es en esta pgina donde daremos por comenzada la sesin y lo haremos registrando una variable de tipo array que llamaremos variables_formulario cuyo contenido va a ser, obviamente, los datos introducidos en este formulario. El objeto de usar una variable de sesin para conservar los valores del formulario en otras pginas es de ndole prctico: Queremos que, si el internauta vuelve hacia atrs para corregir su postal antes de enviarla, no se vea obligado a rellenar de nuevo el formulario. Definido el array, el paso siguiente es inicializarlo en el caso que no lo est ya. Ya hemos explicado que la funcin isset nos dice si una variable ha sido inicializada o no. En el caso de que no lo est, llenaremos 7 elementos del array con contenidos nulos ("") que sern sustituidos por los valores del formulario en el

SISTEMA DE ENVIOS DE POSTALES CON PHP


siguiente script. Tras incluir la librera de funciones y generar el encabezado, el siguiente paso es crear el formulario. Esto lo haremos fundamentalemente por medio de cdigo HTML dentro del cual embeberemos ciertas etiquetas en PHP para rellenarlo total o parcialmente. En efecto, si el visitante acaba de ver su postal y viene a corregirla, en lugar de encontrarse un formulario vaco, ste conservara los datos que haya introducido previamente ya que los valores habrn sido almacenados en variables de sesin. Las cookies son introducidas nicamente en los campos del formulario correspondientes al e-mail ($email) y nombre del remitente ($nombre). De esta forma permitimos al internauta, al visitarnos una segunda vez, disponer de un formulario parcialmente relleno con sus datos. Lo nico que tendr que hacer es completarlo con los del destinatario y escribir el texto. Hay que tener en cuenta que las cookies pueden estar anuladas por el usuario por lo que al rellenar el formulario, si no disponemos de las cookies bien por que stas estn desautorizadas o porque el internauta nos visite por primera vez, el script colocar la variables_formulario de sesin correspondiente. Hemos querido introducir una tcnica comnmente utilizada para transferir variables por medio de un formulario sin que el usuario sea consciente de ello:

<input type="Hidden" name="variable" value="valor">


Por medio de este tipo de etiquetas, estamos enviando una variable y su valor por medio del formulario. Esta variable no se visualiza en la pgina y que slo puede ser detectada mirando el cdigo fuente. La forma de recogerla en la pgina destino del formulario es, como para cualquiera de las otras, por simple llamada en el cdigo. Puede que este formulario, sobre todo la parte de las cookies y las variables de sesin, quede un poco vago despus de haberlo visto una primera vez. Esperamos que las dudas existentes puedan ser resueltas al estudiar el siguiente script y volviendo a leer ste, ya que, ambos utilizan variables comunes y resulta complicado entender uno sin ser consciente del funcionamiento del otro.

Presentamos el listado del script principal de la aplicacin y comentamos algunos puntos generales
El formulario que acabamos de ver propone dos botones distintos (enviar y ver) que, por pertenecer a la misma etiqueta form, apuntan hacia el mismo script: enviopostal.php. Este script ha de encargarse por lo tanto de llevar a cabo ambas tareas: Visualizar la tarjeta que el internauta ha compuesto Enviar la postal al destinatario Hemos querido fusionar ambas tareas en un mismo archivo para de esta forma introducir tcnicas con condicionales if que nos permitan discriminar una de las dos tareas en funcin de la orden del visitante. Por el momento contentmonos de echar una ojeada al script para entrar en estos detalles posteriormente:

<? //Iniciamos la sesion en la pagina session_start(); //Comprobamos si venimos de esta misma pagina o de la del formulario if (!ereg($PHP_SELF,$HTTP_REFERER)) //Si venimos del formulario { //Guardamos las cookies para futuras visitas SetCookie("nombre",$nombre_origen,time()+86400*365); SetCookie("email",$email_origen,time()+86400*365);

SISTEMA DE ENVIOS DE POSTALES CON PHP //Creamos el array variables_formulario tipo sesion con los datos del formulario $variables_formulario[0]=$email_destino; $variables_formulario[1]=$nombre_destino; $variables_formulario[2]=$email_origen; $variables_formulario[3]=$nombre_origen; $variables_formulario[5]=$texto; $variables_formulario[6]=$id_imagen; //Miramos si el checkbox esta validado if (isset($avisar)) $variables_formulario[4]="checked"; else $variables_formulario[4]=""; } //Incluimos la libreria de funciones include("funciones.php"); //Creamos el encabezado HTML html_encabezado("Servicio de postales de DesarrolloWeb","Servicio de postales gratuitas para todo tipo de felicitaciones","postal, navidad, san valentin, cumpleaos, felicitacion"); //Miramos si queremos ver o enviar la postal if (isset($ver)) //Si queremos ver la postal { //Generamos la postal ?> <table align="center" cellspacing="0" cellpadding="2" border="0" bgcolor="White"> <tr> <td colspan="2" align="center" bgcolor="#ccff00"><font color="#9933ff">Aqu tienes la postal que recibir <? echo $variables_formulario[1]?></font></td> </tr> <tr> <td align="left" valign="middle"><img src="2lightho.gif" width="32" height="32" border="0" alt=""></td> <td rowspan="2" width="300"><? echo $variables_formulario[1].",<br> ".$variables_formulario[5]."<br>".$variables_formulario[3];?></td> </tr> <tr> <td><img src="<? echo"imagenes/".$variables_formulario[6].".gif" ?>" border="0"></td> </tr> </table> <div align="center"><a href="enviopostal.php">Enviar</a></div> <? //Generamos enlace hacia atras y cierre de documento html_pie_volver($HTTP_REFERER); } //Si el formulario no esta completamente relleno... 10

SISTEMA DE ENVIOS DE POSTALES CON PHP elseif (!$variables_formulario[0] or !$variables_formulario[1] or !$variables_formulario[2] or !$variables_formulario[3] or !$variables_formulario[5]) { echo "<div align=\"center\">Tu formulario esta incompleto, por favor compltalo para poder enviar la postal</div>\n"; //Generamos enlace hacia atras y cierre de documento html_pie_volver("formulario.php"); } else //Querra decir que enviamos la postal { //Conectamos a la BD $connectid=mysql_conexion(); //Creamos un numero aleatorio para el id_postal que no este utilizado ya //Primero creo una semilla para los numeros aleatorios srand ((double) microtime() * 1000000); //Generamos un numero aleatorio distinto hasta que tengamos un numero libre do { $aleatorio = rand(0,32000); $resultid = mysql_db_query("postal","Select * From postal Where id_postal=" . $aleatorio); $dameFila=mysql_fetch_array($resultid); }while ($dameFila); //Insertamos los datos necesarios en la BD $sentencia_sql = "Insert Into postal (id_postal, texto,email_destinatario, nombre_destinatario, email_remitente, nombre_remitente, id_imagen,avisar) "; $sentencia_sql .= "Values (" . $aleatorio . ",'" . $variables_formulario[5] . "','" . $variables_formulario[0] . "','" . $variables_formulario[1] ; $sentencia_sql .= "','" . $variables_formulario[2] ."','" . $variables_formulario[3] ."'," . $variables_formulario[6] .",'".$variables_formulario[4]."')"; mysql_db_query("postal",$sentencia_sql); //Enviamos el e-mail al destinatario //Variables de configuracion del correo $asunto = "Has recibido una postal"; $cuerpo_mensaje = "Saludos cordiales ".$variables_formulario[1].",\n\n"; $cuerpo_mensaje .= $variables_formulario[3]." te ha enviado una postal.\n"; $cuerpo_mensaje .= "Para recoger la postal que has recibido, accede a la siguiente direccin:\n"; $cuerpo_mensaje .= "http://localhost/postal/leepostal.php?id_postal=" . $aleatorio; $headers_mensaje = "From: DesarrolloWeb>\n"; //Funcion para enviar el correo $mailenviado = mail ($variables_formulario[0], $asunto, $cuerpo_mensaje, $headers_mensaje); //Mensaje para informar del exito o fracaso de las operaciones if ($mailenviado) { 11

SISTEMA DE ENVIOS DE POSTALES CON PHP echo "<div align=\"center\">Tu postal ha sido enviada correctamente</div>\n"; session_destroy(); } else echo "<div align=\"center\">Ha habido un error en el envio del correo electrnico</div>"; //Generamos enlace hacia atras y cierre de documento html_pie_volver("index.php"); } ?>
Diremos, antes de pasar a un comentario detallado, que el script esta dividido en dos bloques principales delimitados por dos condicionales. El primero de estos bloques gestiona el almacenamiento de las cookies y el relleno de la variable de sesin a partir de los datos del formulario. Esto se llevara nicamente a cabo cuando el visitante venga de la pgina formulario.php. El segundo bloque es una instruccin if que ejecuta una u otra serie de sentencias dependiendo de si el visitante quiere ver la postal o desea enviarla. En este condicional se tiene en cuenta tambin la posibilidad de que el usuario no haya rellenado el formulario completamente. Pasemos a ver ms detalladamente cada una de estas partes...

Comentamos la primera parte del script donde se gestiona la sesin y las cookies
Ya hemos visto que en el script formulario.php introducamos en el atributo value de las etiquetas input del formulario unas pequeas incrustaciones de cdigo PHP que nos permitan rellenar el formulario automticamente. Lo que no vimos es cmo esas variables eran definidas. El proceso de creacin de esas variables tiene lugar en el script enviopostal.php que es donde recibimos los datos del formulario. Para hacer partcipe al script de las variables registradas en la sesin es necesario antes de nada iniciar la sesin:

session_start();

Seguidamente, puesto que este script puede llamarse a s mismo y no necesariamente ejecutarse desde la pgina del formulario, debemos crear la condicin de que la creacin de las variables_formulario y de las cookies tenga lugar en el caso de que provengamos del script formulario.php o, lo que es lo mismo, que el script no se est ejecutando desde l mismo (un enlace que apunta a la misma pgina). Esta condicin ha sido expresada en trminos de variables del sistema tan slo para presentar una vez ms su utilidad a la vez que mostramos una funcin muy til para la gestin de cadenas:

if (!ereg($PHP_SELF,$HTTP_REFERER))
Esta condicin lo que expresa es: "Si en la variable $HTTP_REFERER (URL de procedencia) NO est incluida la variable $PHP_SELF (camino virtual de ejecucin del script) llevamos a cabo lo siguiente..." La funcin ereg sirve para detectar si un determinado texto ha sido encontrado en el interior de otro. Aqu los textos seran las dos variables de sistema. El paso siguiente, si la condicin resulta verdadera, es crear las variables de sesin y las cookies algo relativamente trivial salvo para el caso del campo checkbox avisar donde, si queremos que el checkbox sea validado al volver al formulario, hemos de darle el valor "checked".

12

SISTEMA DE ENVIOS DE POSTALES CON PHP


Os recomendamos reflexionar un poco sobre la funcin que desempea la opcin else en este condicional. Para ello hay que tener en cuenta que la variable $avisar no ser inicializada si la caja no es validada y que el visitante puede validarla en una primera visita al formulario y anular la validacin en la segunda. Si este es al caso, la variable $avisar no habr sido inicializada y variables_formulario[4] continua almacenando el valor checked por lo que al volver por tercera vez al formulario encontraramos la caja validada a no ser que incluyamos dicha instruccin else en la que vaciamos la variable de sesin.

if (isset($avisar)) $variables_formulario[4]="checked"; else $variables_formulario[4]="";


El objeto de esta reflexin no es ms que familiarizaros un poco ms sobre el concepto de sesin con un ejercicio mental de este tipo.

Comentamos el fragmento de enviopostal.php que se encarga de visualizar la postal antes de ser enviada
Hemos comentado previamente la existencia de un segundo bloque principal del script delimitado por una condicin if que se encarga de evaluar si el visitante ha pedido visualizar la postal. Esta condicin es definida inicialmente por la lnea:

if (isset($ver)) //Si queremos ver la postal


Si este no es el caso, eso quiere decir que el script ha sido llamado para enviar la postal en cuyo caso lo primero que habr que verificar es si el formulario ha sido rellenado satisfactoriamente y en caso positivo enviar la postal:

elseif (!$variables_formulario[0] or !$variables_formulario[1] or !$variables_formulario[2] or !$variables_formulario[3] or !$variables_formulario[5])


Los primeros dos casos, ver postal o avisar de un formulario incompleto, no aportan nada nuevo con respecto a todo lo visto. Es la tercera parte de esta condicin, referente al envo de la postal, la que reviste un cierto inters. El hecho de enviar la postal significa dos cosas: Incluimos en nuestra base de datos postal, en nuestra tabla postal un nuevo registro en el que almacenaremos todos los datos que necesitaremos para mostrar la postal cuando el destinatario venga a buscarla. Enviamos un e-mail al destinatario para avisarle de la existencia de una postal a su nombre en nuestro sitio web. A cada postal que se introduzca en la base de datos se le asignar un nmero de identificacin para que el destinatario pueda acceder luego a la postal apropiada. Si asignsemos un nmero correlativo a cada postal que se genere, podra pasar que un usuario acceda a la postal de otros con simplemente cambiar el numero de la postal que le asignamos al nmero siguiente o al anterior. Para evitar que esto ocurra, vamos a generar un nmero aleatorio dentro de un amplio rango, que sirva para identificar a las postales creadas. Adems, se tendr que comprobar que ese nmero aleatorio no est ya ocupado con una postal. Veamos con detenimiento cada una de estas acciones. La primera accin a realizar consiste en conectar con la base de datos en la forma que ya hemos visto en el script verpostales.php. El siguiente paso consiste en generar un nmero aleatorio que no est ocupado para asignarlo como identificador a la postal. Con la funcin srand() se hace una semilla, lo que nos permite generar nmeros aleatorios que no se repitan. A continuacin nos metemos en un bucle que genera un nmero aleatorio,

13

SISTEMA DE ENVIOS DE POSTALES CON PHP


intenta extraer de la base de datos una postal que tenga ese nmero de identificacin y, si dicho nmero aleatorio ha sido ya utilizado para otra postal, llevamos a cabo otra iteracin del bucle. Para extraer los datos de la base ejecutamos una consulta clsica en lenguaje SQL. El programa saldr del bucle en el momento en el que el numero aleatorio definido no est siendo utilizado para otra postal residente en la base de datos.

do { $aleatorio = rand(0,32000); $resultid = mysql_db_query("postal","Select * From postal Where id_postal=" . $aleatorio); $dameFila=mysql_fetch_array($resultid); }while ($dameFila);
Este es un ejemplo en el que un bucle do/while puede resultar til con respecto a un while simple dado que necesitaremos ejecutar el bucle al menos una vez para generar nuestro numero aleatorio y comprobar que es nico en nuestra base de datos. Una vez tenemos un identificador de la postal exclusivo nos disponemos a introducir en la base de datos la informacin de las variables_formulario y el identificador. Para ello construimos dinmicamente una sentencia SQL que inserte la informacin que hemos recibido del formulario. A continuacin se ha de mandar el correo electrnico informando de la creacin de la postal. En el ejemplo, primero creamos una serie de variables que nos ayudarn a configurar el mensaje de correo electrnico. Estas variables son: $asunto: Para el asunto del correo electrnico $cuerpo_mensaje: Con un texto que informa de la creacin de la postal y la URL para ir a recogerla. En la direccin web que construimos pasamos por parmetro el nmero aleatorio asignado a la postal, para que la pgina encargada de mostrarla sepa cul es la postal que debe sacar por pantalla. $headers_mensaje: Para indicar algn dato adicional que se coloque en la cabecera del mensaje. En este caso indicamos que lo enva DesarrolloWeb. Con la funcin mail(), pasndole los parmetros de configuracin, enviamos el correo electrnico. La funcin mail devuelve un valor que nos servir ms tarde para saber si el mensaje se envi correctamente o si hubo algn error. En el caso de que todo haya funcionado correctamente, damos por finalizada la sesin por medio de la funcin session_destroy con lo que elimenaremos aquellas variables que nos han servido a llenar el formulario.

Describimos el programa que se encarga de visualizar la postal al destinatario una vez sta ha sido enviada
En el e-mail recibido, el destinatario ver una URL que nosotros mismos hemos generado dinmicamente. Al dirigirse a ella lo que estar haciendo es ejecutar un script que, en base al identificador que su URL, mostrar la postal correspondiente por una simple llamada a la base de datos. El script ha de tener en cuenta la posibilidad de que el identificador sea errneo ya sea debido a que dicho registro haya sido borrado de la base o bien a causa de que el internauta est intentando acceder a una postal que no es la suya. Si se trata efectivamente del identificador correcto, por medio de la llamada a la base de datos, podremos ir sacando uno a uno los parmetros almacenados para recomponer la postal tal y como el remitente la ha creado. A continuacin, en el caso en el que el remitente lo haya solicitado, le enviaremos un mensaje notificndole de la recepcin de la postal:

<? //Incluimos la libreria de funciones

14

SISTEMA DE ENVIOS DE POSTALES CON PHP include("funciones.php"); //Creamos el encabezado HTML html_encabezado("Servicio de postales de DesarrolloWeb","Servicio de postales gratuitas para todo tipo de felicitaciones","postal, navidad, san valentin, cumpleaos, felicitacion"); //En $id_postal tenemos la clave de la postal que se solicita //Extraemos de la BD los datos para generar la postal //Conectamos a la BD $connectid=mysql_conexion(); //Ejecutamos sentencia SQL y recogemos resultado en damefila $resultid = mysql_db_query("postal","SELECT * FROM postal WHERE id_postal=" . $id_postal); $damefila=mysql_fetch_array($resultid); //Si el identificador es correcto, deberiamos tener valores en damefila if ($damefila) //Si existe esa postal la muestro { //Recreamos la postal con los datos extraidos ?> <br> <table align="center" cellspacing="0" cellpadding="2" border="0" bgcolor="White"> <tr> <td align="left" valign="middle"><img src="2lightho.gif" width="32" height="32" border="0" alt=""></td> <td rowspan="2" width="300"><? echo $damefila["nombre_destinatario"].',<br>&nbsp;&nbsp;&nbsp;'.$damefila["texto"].'<br>'.$damefila["nombre_r emitente"];?></td> </tr> <tr> <td><img src="<? echo"imagenes/".$damefila["id_imagen"].".gif" ?>" border="0" alt=""></td> </tr> </table> <div align="center"><a href="index.php">Enva una postal a alguien</a></div> <? //En caso de haberlo pedido, enviamos un mail para notificar la recepcion if ($damefila["avisar"]="checked") { //Variables de configuracion del correo $asunto = "Tu postal ha sido recibida"; $cuerpo_mensaje = "Saludos cordiales ".$damefila["nombre_remitente"].",\n\n"; $cuerpo_mensaje .= $damefila["nombre_destinatario"]." ha recibido bien tu postal.\n"; $headers_mensaje = "From: DesarrolloWeb.com>\n"; //Funcion para enviar el correo $mailenviado = mail ($damefila["email_remitente"], $asunto, $cuerpo_mensaje, $headers_mensaje); } } 15

SISTEMA DE ENVIOS DE POSTALES CON PHP else //El identificador era erroneo, la postal no existe echo "<div align=\"center\">Lo sentimos, pero esa postal no existe</div>"; //Liberamos la memoria de consulta mysql_free_result($resultid); ?> </body> </html>
Con este script finaliza este manual prctico de programacin en PHP. Esperamos que hayis sacado partido de l y que os haya dado un poco ms de soltura para poder abordar vuestros primero proyectos en PHP con una base suficiente. Os agradeceremos cualquier comentario sobre este o cualquier otro de los manuales a la vez que os invitamos a plantearnos vuestras posibles dudas en la direccin de ayuda de esta misma web. Asimismo os recordamos la existencia de foros especializados y ponemos a vuestra disposicin la lista de recursos de PHP ms significativos del web.

16

Vous aimerez peut-être aussi