Sistema de Envios de Postales Con Php

16
SISTEMA DE ENVIOS DE POSTALES CON PHP 1 Mostraremos a grandes rasgos en qué consiste la aplicación y cuáles son sus partes constitutivas. Una página de envío gratuito de postales nos ha parecido un ejemplo típico de sitio web en el que se pueden poner de manifiesto muchas de las utilidades del trabajo en páginas dinámicas. Imaginaos por un momento un sitio web de postales gestionado únicamente por HTML... técnicamente imposible. En esta aplicación, el visitante tendrá acceso al sitio, elegirá el dibujo para su postal y rellenará un formulario para su envío. A continuación 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 pequeña base de datos entre bastidores que almacena, por un lado, las imágenes y las cataloga por tipo (Cumpleaños, San Valentín y Navidad) y por otro, las diferentes postales enviadas por el internauta definidas por los diferentes parámetros necesarios para su correcta recepción. La aplicación consta de los siguientes scripts: index.php Es la página 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 imágenes correspondientes al tipo de postal elegida y plasmarlas en la página. formulario.php Aquí introducimos los datos para el correcto envío de la tarjeta. enviopostal.php Su cometido es el de componer la postal con la imagen elegida y los datos del formulario e imprimirla. También se encarga de gestionar el envío del e-mail al destinatario y almacenar en la base los datos correspondientes a dicho envío. 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 aplicación puede ser visto continuamente en línea desde cualquiera de los capítulos pinchando sobre el enlace ir a la aplicación. Recordamos que los scripts, imágenes y archivo para la creación de la base de datos pueden ser directamente descargados. El funcionamiento de esta aplicación sido deliberadamente simplificado en todos los sentidos por varias razones obvias, sobre todo buscando en esta simplicidad una más fácil comprensión de los aspectos primordiales. Esto no nos impedirá de, en determinados puntos, hacer hincapié sobre algunas mejoras que podrían realizarse. La aplicación puede ser seguida en todo momento a partir de cualquier capitulo pinchando sobre el siguiente enlace: Ir a la aplicación 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 más corrientemente utilizado en combinación con PHP. Por supuesto, podríamos 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 mínimamente el funcionamiento de MySQL y que la utilización de cualquier otra BD o método de conexión 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.

Transcript of Sistema de Envios de Postales Con Php

Page 1: Sistema de Envios de Postales Con Php

SISTEMA DE ENVIOS DE POSTALES CON PHP

1

Mostraremos a grandes rasgos en qué consiste la aplicación y cuáles son sus

partes constitutivas. Una página de envío gratuito de postales nos ha parecido un ejemplo típico de sitio web en el que se pueden

poner de manifiesto muchas de las utilidades del trabajo en páginas dinámicas. Imaginaos por un momento un sitio web de postales gestionado únicamente por HTML... técnicamente imposible. En esta aplicación, el visitante tendrá acceso al sitio, elegirá el dibujo para su postal y rellenará un formulario para su envío. A continuación 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 pequeña base de datos entre bastidores que almacena, por un lado, las imágenes y las cataloga por tipo (Cumpleaños, San Valentín y Navidad) y por otro, las diferentes postales enviadas por el internauta definidas por los diferentes parámetros necesarios para su correcta recepción. La aplicación consta de los siguientes scripts:

index.php Es la página 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 imágenes correspondientes al tipo de postal elegida y plasmarlas en la página.

formulario.php Aquí introducimos los datos para el correcto envío de la tarjeta. enviopostal.php Su cometido es el de componer la postal con la imagen elegida y los datos del formulario e imprimirla. También se encarga de gestionar el envío del e-mail al destinatario y almacenar en la base los datos

correspondientes a dicho envío.

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 aplicación puede ser visto continuamente en línea desde cualquiera de los capítulos

pinchando sobre el enlace ir a la aplicación. Recordamos que los scripts, imágenes y archivo para la creación de la base de datos pueden ser directamente descargados. El funcionamiento de esta aplicación sido deliberadamente simplificado en todos los sentidos por varias razones obvias, sobre todo buscando en esta simplicidad una más fácil comprensión de los aspectos

primordiales. Esto no nos impedirá de, en determinados puntos, hacer hincapié sobre algunas mejoras que

podrían realizarse. La aplicación puede ser seguida en todo momento a partir de cualquier capitulo pinchando sobre el siguiente enlace:

Ir a la aplicación

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 más corrientemente utilizado en combinación con PHP. Por supuesto, podríamos 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 mínimamente el funcionamiento de MySQL y que la utilización de cualquier otra BD o método de conexión 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.

Page 2: Sistema de Envios de Postales Con Php

SISTEMA DE ENVIOS DE POSTALES CON PHP

2

En capítulos de otros manuales hemos explicado la instalación y utilización de MySQL y la sintaxis para la

creación de tablas. En este capítulo nos limitaremos a describir paso a paso la creación 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.-Creación de la base de datos Una vez dentro de MySQL, el primer paso es crear la base de datos:

Create database postal;

2.-Creación de las tablas Para la creación de la tabla imagenes, donde almacenaremos los gráficos de las postales, generaremos dos

campos: id_imagen, que es el identificador del grafico, específico para cada uno y cuyo valor corresponde también con el nombre del archivo gif. El otro campo, tipo, define el objeto de la postal (cumpleaños, Navidades o San Valentín).

La forma más simple de crear esta tabla sería:

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 confirmación de recepción. Veremos cómo actúa cada uno de esos datos en el script más adelante. Por ahora nos limitaremos a describir la sintaxis de la creación:

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 aplicación más compleja deberíamos definir además las claves y considerar más detenidamente el

tipo de campo a definir. Aconsejamos leer los capítulos del tutorial de SQL donde podréis consejos para mejorar las prestaciones de las tablas. 3.-Relleno de la tabla imagenes con los gráficos de muestra Para rellenar rápidamente 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 líneas y los valores de campo,

puestos en el buen orden, separados por tabuladores. En el pack de descarga encontraréis el archivo texto imagenes ya preparado. Lo único que tenéis 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;

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

Page 3: Sistema de Envios de Postales Con Php

SISTEMA DE ENVIOS DE POSTALES CON PHP

3

4.-Creación 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 aplicación entrando por la puerta Cumplidos los requisitos de instalación de la base de datos y creación del directorio virtual, estamos en

medida de poder tratar la aplicación en local. Aquí os presentamos el listado del primer script index.php que resulta ser la puerta de entrada a nuestra aplicación:

<? //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, cumpleaños, 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 Valentín</a> <a href="verpostales.php?tipo=cumple">Cumpleaños</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 código PHP que llama a un archivo ("funciones.php") y a una función (html_encabezado) seguido de un fragmento de HTML con un mensaje de bienvenida y unos enlaces que apuntan a las diversas temáticas de las postales.

El archivo al que se hace la llamada contiene un conjunto de funciones que serán utilizadas por otras páginas

de la aplicación. Dentro de esta librería tenemos tres funciones, una de ellas llamada en este script que, como veremos, sirve para crear el principio del documento HTML con su título y etiquetas META generados. En la parte HTML del listado podemos observar como han sido definidos los enlaces a las distintas categorías de postales:

<a href="verpostales.php?tipo=categoria">Categoría</a>

Como veis estamos pasando la variable tipo por URL hacia la página verpostales que podrá a su vez

explotarla como sea necesario.

Creamos una página que muestra las postales posibles para elegir dentro de una categoría.

Page 4: Sistema de Envios de Postales Con Php

SISTEMA DE ENVIOS DE POSTALES CON PHP

4

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 categoría. En este caso, como podéis ver, la mayoría del código 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, cumpleaños, 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>

Page 5: Sistema de Envios de Postales Con Php

SISTEMA DE ENVIOS DE POSTALES CON PHP

5

</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 librería de funciones y llamamos a la función que crea el encabezado HTML. El paso siguiente es evaluar, mediante un condicional if, si la categoría 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 función de ello.

Una vez elegida la sentencia SQL apropiada realizamos la llamada a la función mysql_conexion() creada por nosotros mismos que nos conecta con la base de datos para, a continuación, 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 cuestión. 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 más registros o se llegue al numero máximo 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 línea 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 código 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 función html_pie_volver crear un enlace para volver a la página anterior sirviéndose de la variable de sistema $HTTP_REFERER presentada en otro capítulo.

Presentamos las funciones de cosecha propia integradas en la aplicación 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 descripción pormenorizada no vamos a entrar. Las tareas desempeñadas 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,$descripción y $keywords y define los estilos.

Page 6: Sistema de Envios de Postales Con Php

SISTEMA DE ENVIOS DE POSTALES CON PHP

6

html_pie_volver($volver)

Cierra las etiquetas BODY y HTML e introduce un enlace con el texto Volver que apunta hacia la página

definida por la variable $volver. mysql_conexion() Crea y comprueba el vínculo con MySQL. Los parámetros de conexión son definidos en esta función.

Os mostramos a continuación el listado para que vosotros mismos las estudiéis.

<? 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

Page 7: Sistema de Envios de Postales Con Php

SISTEMA DE ENVIOS DE POSTALES CON PHP

7

//Conexion con la base $connectid = mysql_connect("localhost","",""); //Compruebo el exito de la conexion if (!$connectid) echo "Error en la conexión con la base de datos"; else return $connectid; } ?>

Creamos un formulario dinámico por medio de cookies y variables de sesión Las imágenes mostradas en verpostales apuntan hacia la página formulario.php de la cual os presentamos el listado a continuación:

<? //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, cumpleaños, 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>

Page 8: Sistema de Envios de Postales Con Php

SISTEMA DE ENVIOS DE POSTALES CON PHP

8

</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 recepción</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 página donde daremos por comenzada la sesión 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 sesión para conservar los valores del formulario en otras páginas es de índole práctico: Queremos que, si el internauta vuelve hacia atrás 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 función 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 serán sustituidos por los valores del formulario en el

Page 9: Sistema de Envios de Postales Con Php

SISTEMA DE ENVIOS DE POSTALES CON PHP

9

siguiente script.

Tras incluir la librería de funciones y generar el encabezado, el siguiente paso es crear el formulario. Esto lo haremos fundamentalemente por medio de código 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

vacío, éste conservara los datos que haya introducido previamente ya que los valores habrán sido almacenados en variables de sesión. 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 estén desautorizadas o porque el internauta nos visite por primera vez, el script colocará la variables_formulario de sesión correspondiente. Hemos querido introducir una técnica comúnmente 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 página y que sólo puede ser detectada mirando el código fuente. La forma de recogerla en la página destino del formulario es, como para cualquiera de las otras, por simple llamada en el código. Puede que este formulario, sobre todo la parte de las cookies y las variables de sesión, quede un poco vago

después 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 aplicación 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 técnicas con

condicionales if que nos permitan discriminar una de las dos tareas en función de la orden del visitante. Por el momento contentémonos 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);

Page 10: Sistema de Envios de Postales Con Php

SISTEMA DE ENVIOS DE POSTALES CON PHP

10

//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, cumpleaños, 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...

Page 11: Sistema de Envios de Postales Con Php

SISTEMA DE ENVIOS DE POSTALES CON PHP

11

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 complétalo 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 dirección:\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) {

Page 12: Sistema de Envios de Postales Con Php

SISTEMA DE ENVIOS DE POSTALES CON PHP

12

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 electrónico</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 sesión a

partir de los datos del formulario. Esto se llevara únicamente a cabo cuando el visitante venga de la página formulario.php.

El segundo bloque es una instrucción 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 también la posibilidad de que el usuario no haya rellenado el formulario completamente. Pasemos a ver más detalladamente cada una de estas partes...

Comentamos la primera parte del script donde se gestiona la sesión y las cookies

Ya hemos visto que en el script formulario.php introducíamos en el atributo value de las etiquetas input del formulario unas pequeñas incrustaciones de código PHP que nos permitían rellenar el formulario

automáticamente. Lo que no vimos es cómo esas variables eran definidas. El proceso de creación de esas variables tiene lugar en el script enviopostal.php que es donde recibimos los datos del formulario.

Para hacer partícipe al script de las variables registradas en la sesión es necesario antes de nada iniciar la sesión:

session_start();

Seguidamente, puesto que este script puede llamarse a sí mismo y no necesariamente ejecutarse desde la página del formulario,

debemos crear la condición de que la creación 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

página). Esta condición ha sido expresada en términos de variables del sistema tan sólo para presentar una vez más su utilidad a la vez

que mostramos una función muy útil para la gestión de cadenas:

if (!ereg($PHP_SELF,$HTTP_REFERER))

Esta condición lo que expresa es: "Si en la variable $HTTP_REFERER (URL de procedencia) NO está incluida la variable $PHP_SELF (camino virtual de ejecución del script) llevamos a cabo lo siguiente..."

La función ereg sirve para detectar si un determinado texto ha sido encontrado en el interior de otro. Aquí los textos serían las dos variables de sistema. El paso siguiente, si la condición resulta verdadera, es crear las variables de sesión 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".

Page 13: Sistema de Envios de Postales Con Php

SISTEMA DE ENVIOS DE POSTALES CON PHP

13

Os recomendamos reflexionar un poco sobre la función que desempeña la opción 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 validación 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 encontraríamos la caja validada a no ser que incluyamos dicha instrucción else en la que vaciamos la variable de sesión.

if (isset($avisar))

$variables_formulario[4]="checked";

else

$variables_formulario[4]="";

El objeto de esta reflexión no es más que familiarizaros un poco más sobre el concepto de sesión 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 condición if que se encarga de evaluar si el visitante ha pedido visualizar la postal. Esta condición es definida

inicialmente por la línea:

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 condición, referente al envío de la postal, la que reviste

un cierto interés. 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 número de identificación para que el destinatario pueda acceder luego a la postal apropiada. Si asignásemos un número correlativo a cada postal

que se genere, podría pasar que un usuario acceda a la postal de otros con simplemente cambiar el numero de la postal que le asignamos al número siguiente o al anterior. Para evitar que esto ocurra, vamos a generar un número aleatorio dentro de un amplio rango, que sirva para identificar a las postales creadas. Además, se tendrá que comprobar que ese número aleatorio no esté ya ocupado con una postal. Veamos con detenimiento cada una de estas acciones.

La primera acción 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 número aleatorio que no esté ocupado para asignarlo como identificador a la postal. Con la función srand() se hace una semilla, lo que nos permite generar números

aleatorios que no se repitan. A continuación nos metemos en un bucle que genera un número aleatorio,

Page 14: Sistema de Envios de Postales Con Php

SISTEMA DE ENVIOS DE POSTALES CON PHP

14

intenta extraer de la base de datos una postal que tenga ese número de identificación y, si dicho número

aleatorio ha sido ya utilizado para otra postal, llevamos a cabo otra iteración del bucle. Para extraer los datos

de la base ejecutamos una consulta clásica 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 información de las variables_formulario y el identificador. Para ello construimos dinámicamente una

sentencia SQL que inserte la información que hemos recibido del formulario. A continuación se ha de mandar el correo electrónico informando de la creación de la postal. En el ejemplo, primero creamos una serie de variables que nos ayudarán a configurar el mensaje de correo electrónico. Estas variables son: $asunto: Para el asunto del correo electrónico

$cuerpo_mensaje: Con un texto que informa de la creación de la postal y la URL para ir a recogerla. En

la dirección web que construimos pasamos por parámetro el número aleatorio asignado a la postal, para que la página encargada de mostrarla sepa cuál es la postal que debe sacar por pantalla. $headers_mensaje: Para indicar algún dato adicional que se coloque en la cabecera del mensaje. En

este caso indicamos que lo envía DesarrolloWeb.

Con la función mail(), pasándole los parámetros de configuración, enviamos el correo electrónico. La función mail devuelve un valor que nos servirá más tarde para saber si el mensaje se envió correctamente o si hubo algún error. En el caso de que todo haya funcionado correctamente, damos por finalizada la sesión por medio de la función 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 dinámicamente. 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 erróneo 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 parámetros almacenados para recomponer la postal tal y como el remitente la ha creado.

A continuación, en el caso en el que el remitente lo haya solicitado, le enviaremos un mensaje notificándole de la recepción de la postal:

<? //Incluimos la libreria de funciones

Page 15: Sistema de Envios de Postales Con Php

SISTEMA DE ENVIOS DE POSTALES CON PHP

15

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, cumpleaños, 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_remitente"];?></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">Envía 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); } }

Page 16: Sistema de Envios de Postales Con Php

SISTEMA DE ENVIOS DE POSTALES CON PHP

16

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 práctico de programación en PHP. Esperamos que hayáis sacado partido de él y que os haya dado un poco más 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 dirección de ayuda de esta misma web.

Asimismo os recordamos la existencia de foros especializados y ponemos a vuestra disposición la lista de recursos de PHP más significativos del web.