Académique Documents
Professionnel Documents
Culture Documents
Cdigo PHP para el envo de boletines a emails almacenados en una base de datos
Ahora est muy de moda el envo de boletines para informar de las novedades en las webs. El nico problema es que para hacerlo, la mayora de webmasters tienen que depender de alguna empresa (o servidor) que les gestione la base de datos y les enve los emails cuando lo requieran. En este artculo explicar paso a paso como crear la tabla (en la base de datos MySQL) necesaria para el almacenamiento de los emails y posteriormente, cmo enviar un boletn electrnico a todos ellos, con el aliciente de que no aparezcan todos los destinatarios en el campo Para: del mensaje.
CREATE TABLE usuarios ( id bigint(7) NOT NULL auto_increment, nick varchar(100) NOT NULL, passowrd varchar(100) NOT NULL, nombre varchar(255) default NULL, email varchar(100) default NULL, KEY id (id) )
Y quedar as en su phpMyAdmin:
Tras esto usted ya tiene la tabla necesaria para almacenar los datos dentro de una base de datos MySQL. Podra explicar como introducir los datos en esta tabla mediante formularios de registro pero eso ya lo dejo a gusto del webmaster.
No se puedo conectar
/* Servidor: aqu debe poner la direccin de su servidor, en la mayora de las compaas es localhost Nombre_de_usuario: debe poner su nombre de usuario en el servidor. Contrasea: su contrasea. */
mysql_select_db(base_de_datos,$mi_conexion);
$query_Tabla = SELECT email FROM usuarios ORDER BY id ASC; $Tabla = mysql_query($query_Tabla, $mi_conexion) or die(mysql_error());
/* Email: es el nombre del campo que requerimos, si ha seguido nuestras instrucciones creando nuestra misma tabla en la base de datos no debe cambiar esto. Usuarios: es el nombre de la tabla donde est el campo email, si ha seguido nuestras
instrucciones creando nuestra misma tabla en base de datos no debe cambiar esto. */
$largo=strlen($losemails); if ($largo>2) {
//quitamos ultimos ,
$asunto=Prueba de email desde PHP; $mensaje=<html> <head> <title>Titulo de la Pagina</title> </head> <body> <p>Esta es una prueba de emails en formato HTML</p>
Precios de nuestros productos: <table> <tr> <th>PRODUCTO<th>PRECIO <th>PROMOCION</th> </tr> <tr> <td>Refresco Grande</td>
<td>25,50</td><td>23,00</td> </tr> <tr> <td>Helado Napolitano</td> <td>27,50</td><td>25,00</td> </tr> <tr> <td>Patatas</td> <td>18,50</td> <td>15,00</td> </tr> </table> </body> </html>;
$envia=enviante; $remite=email_remitente;
mail(null, $asunto, $mensaje, MIME-Version: 1.0 Content-type: text/html; charset=iso-8859-1 From: $envia <$remite> Bcc: $losemails . rn) or die(Error al Enviar Email); echo Mensaje Enviado!; // mysql_free_result($Tabla); mysql_close($mi_conexion); ?>
Ya tenemos nuestro sistema de envo de boletines, no tendremos que depender de nadie. El nico problema que presenta este sistema es que al no aparecer nada en el campo Para: del email, algunos gestores de email lo colocan como correo no deseado.
<ul>
</li><li><a href='#'>Subopcin</a></li>
<li><a href='#'>Subopcin</a></li></ul>
</li></ul>
Ahora agregamos estas reglas de css:
}#menu a{
font-famiy:Arial,sans-serif; font-size:11pt;
text-decoration: none}
#menu a:hover{
}</style>
Estamos definiendo el id menu que asignaremos a la lista principal que contiene todas las opciones y dems submens. Especificamos que los items no tengan vietas u otro estilo (liststyle-type:none), y en la pseudo-clase hover definimos que cambie el color del fondo y de letra. Tambin hay que resaltar que en el selector a estamos especificando la propiedad display. Ya se ve un poco mejor, sin embargo los items de todas las listas estn desplegados de manera vertical (que es el default). Lo que haremos ahora ser especificar que los items de la lista del men principal se desplieguen de manera horizontal. Esto lo haremos definiendo una clase que llamaremos menuitem y algunos ids que sern en los que especificaremos la posicin absoluta en la que queremos que se despliegue cada una de las opciones del men principal:
position: absolute;
top: 0;
left: 9.95em;
width: 10em;
display: none;
display: block;
}
En la primera regla definimos que la posicin ser relativa para los elementos <li> que estn contenidos dentro de un elemento que tenga la clase submenu (que en nuestro caso sern los elementos <ul class=submenu>). Esto nos sirve para que los mens de los siguientes niveles de submens se desplieguen a la misma altura que se encuentra la opcin del men al que pertenecen. Despus de esto, definimos la clase .subsubmenu, en donde especificamos, entre otras cosas, que la posicin ser absoluta con relacin al elemento que lo contiene (que en nuestro caso seran los elementos <li> que a su vez estn contenidos en los elementos <ul class=submenu>), y definimos su offset a la izquierda. En la tercer regla definimos la pseudoclase hover para que al pasar el mouse por una opcin que tenga submens los despliegue. Chequen que esta regla de css se aplicar a los elementos que tengan la clase .subsubmenu y que sean hijos de un elemento <li>, los cuales a su vez deben de tener o pertenecer a un elemento que tenga la clase .submenu. A nivel de html, a cada lista de los submens principales que vayan a contener uno o ms niveles de submens se le tiene que asignar la clase submenu: <ul class=submenu>, y a las listas que contengan las opciones de los submens se les tiene que asignar la clase subsubmenu: <ul class=subsubmenu>. Ahora s ya tenemos un verdadero men con varios niveles de submens. Lo que resta es ponerle bordes para que se vea ms presentable. Le estuve checando y probando, y la manera como me funcion esto de los bordes es de una manera artesanal, con este cdigo de css:
.b_top {border-top:1px solid #369} .b_right {border-right:1px solid #369} .b_bottom {border-bottom:1px solid #369} .b_left {border-left:1px solid #369}
A cada opcin del men, dentro del elemento <a> le asignamos las clases que necesitemos separadas por espacios. Por ejemplo, para la segunda opcin del men principal el html
quedara: <a class=b_top b_right b_bottom href=#'>, y para una opcin que a nivel de diseo sea la ltima de la lista: <a class=b_right b_bottom b_left href=#'>. Esto es un poco tedioso, pero generalmente slo lo tendremos que hacer una vez al realizar el diseo del men, ya que despus de que est funcional, las modificaciones sern mnimas, quizs al aumentar una nueva opcin, o un nuevo submen, dependiendo de las necesidades que surgan. Yo tuve algunos problemas para que todos los bordes se vieran alineados, porque algunos en lugar de que se sobreescribieran, a nivel de diseo se vean ms gruesos; es por eso que tuve que jugar con las posiciones absolutas de los id #m. As termina este tutorial, espero que les sea de utilidad. Ah, se me olvidada comentar, con MS IExplorer no va a funcionar porque este browser no tiene soporte total de CSS2, podra funcionar con algunos truquitos y simulando el efecto hover de los list items con Javascript, pero mejor utilicen un browser que cumpla con los estndares, tal como Mozilla, Firefox, Netscape, Opera, etc.
active_sessions auth_use
active_sessions_split db_sequence
auth_user_md5
En la tabla active_sessions es donde se almacena la informacin de sesin y cada vez que se crea una nueva sesin, se crea un registro en esta tabla para su control. Supongamos que queremos controlar el acceso a un conjunto de pginas por nuestros clientes. Con PHPLIB es tan sencillo como incluir al comienzo de cada pgina con control de sesin la llamada:
$sess->register("s");
Al final de una pgina con control de sesin, tenemos que realizar una llamada a PHPLIB para cerrar la sesin. En esta llamada todas las variables asociadas a la sesin se guardan para que no se pierdan:
page_close();
Es por todos conocido lo poco que gustan las cookies a la gente por el ataque hacia su privacidad que supone. Con PHPLIB el control de sesiones se puede realizar tambin utilizando el mtodo GET de envo de datos, es decir, adjuntando a la URL de acceso a la pgina el identificador de la sesin. Esto se controla si en la pgina con control de sesiones ponemos todos los enlaces a otras pginas de la siguiente forma:
$sess->purl("showoff.php3");
Ya hemos visto pues una de las principales ventajas de utilizar PHPLIB: el sencillo control de sesiones. con este control el implementar una bolsa de la compra donde se vayan almacenando todos los artculos de una compra es trivial. O el almacenamiento de una barra de navegacin con todas las pginas por las que ha ido accediendo el usuario.
$perm->check("admin");
Si el usuario no est an autenticado se le presentar una pgina para que inserte un identificador y una clave de entrada. En el ejemplo inicial de PHPLIB el identificador es kris y la clave es test. Una vez introducidos podemos volver a acceder a esta pgina y ya se nos volver a pedir el identificador.
Crear los archivos que se detallan a continuacin con su contenido, esto es un ejemplo simple y sencillo para que puedan visualizar como dar mantenimiento a una tabla en MySQL con PHP.
Archivo: conexion.php <?php $dbhost="localhost:3306"; // host del MySQL (generalmente localhost) $dbusuario="root"; // aqui debes ingresar el nombre de usuario // para acceder a la base $dbpassword="usbw"; // password de acceso para el usuario de la // linea anterior $db="demo"; // Seleccionamos la base con la cual trabajar $conexion = mysql_connect($dbhost, $dbusuario, $dbpassword); mysql_select_db($db, $conexion); ?>
<title>Listado de Usuarios</title> <script language="javascript"> function nuevo() { window.open("guardar.php","_parent"; } </script> </head> <body> <h2>Listado de usuarios</h2> <?php include "conexion.php"; $result=mysql_query("SELECT * FROM usuarios ORDER BY nombre",$conexion); echo "<table border=1> <tr> <td><b>Nombre</b></td> <td><b>Apellido</b></td> <td><b>DNI</b></td> <td><b>Opciones</b></td> </tr>"; while($row=mysql_fetch_row($result)) { echo "<tr> <td>$row[0]</td> <td>$row[1]</td> <td>$row[2]</td>
<td><a href="actualizar.php?dni=$row[2]">Actualizar</a> <a href="borrar.php?dni=$row[2]">Eliminar</a></td> </tr>"; } echo"</table>"; include "cerrar_conexion.php"; ?> <input type="button" value="Nuevo" onclick="nuevo()" /> </body> </html>
Archivo: actualizar.php <?php include "conexion.php"; $accion=$_GET[accion]; if (!isset($accion)) { $dni=$_GET[dni]; $result=mysql_query("SELECT * FROM usuarios WHERE dni=$dni",$conexion); $row=mysql_fetch_row($result); echo " <html> <head> <title>Actualizar Usuario</title> <script language="javascript"> function cancelar()
{ window.open("ver.php","_parent"; } </script> </head> <body> <h3>Actualizar Usuario</h3> <form action="actualizar.php?accion=guardar" method="POST"> Nombre:<br> <input type="text" value="$row[0]" name="nombre"><br> Apellido:<br> <input type="text" value="$row[1]" name="apellido"><br> DNI:<br> <input type="text" value="$row[2]" name="dni"><br> <input type="hidden" name="dniAnt" value="$row[2]"> <input type="submit" value="Actualizar"> <input type="button" value="Cancelar" onclick="cancelar()" /> </form> </body> </html>"; }elseif($accion=="guardar" { $nombre=$_POST[nombre]; $apellido=$_POST[apellido]; $dni=$_POST[dni]; $dniAnt=$_POST[dniAnt];
$result=mysql_query("UPDATE usuarios SET nombre="".$nombre."",apellido="".$apellido."", dni=".$dni." WHERE dni = ".$dniAnt,$conexion); echo " <html> <head> <title>Actualizar Usuario</title> </head> <body> <h3>Los datos han sido actualizados</h3> <a href="ver.php">Ir a listado</a> </body> </html>"; } include "cerrar_conexion.php"; ?>
Archivo: borrar.php <?php include "conexion.php"; $accion=$_GET[accion]; if (!isset($accion)) { $dni=$_GET[dni]; $result=mysql_query("SELECT * FROM usuarios WHERE dni=$dni",$conexion);
$row=mysql_fetch_row($result); echo" <html> <head> <title>Borrar Usuario</title> <script language="javascript"> function cancelar() { window.open("ver.php","_parent"; } </script> </head> <body> <h3>Borrar Usuario</h3> <form action="borrar.php?accion=guardar" method="POST"> Nombre:<br> <input type="text" value="$row[0]" name="nombre" readonly="readonly"><br> Apellido:<br> <input type="text" value="$row[1]" name="apellido" readonly="readonly"><br> DNI:<br> <input type="text" value="$row[2]" name="dni" readonly="readonly"><br> <input type="submit" value="Borrar"> <input type="button" value="Cancelar" onclick="cancelar()" /> </form> </body> </html>";
}elseif($accion=="guardar" { $dni=$_POST[dni]; $result=mysql_query("DELETE FROM usuarios WHERE dni = ".$dni,$conexion); echo" <html> <head> <title>Borrar Usuario</title> </head> <body> <h3>El registro se ha borrado</h3> <a href="ver.php">Ir a listado</a> </body> </html>"; } include "cerrar_conexion.php"; ?>
Archivo: guardar.php <?php include "conexion.php"; $accion=$_GET[accion]; if (!isset($accion)) { echo " <html>
<head> <title>Crear Nuevo Uusario</title> <script language="javascript"> function cancelar() { window.open("ver.php","_parent"; } </script> </head> <body> <h3>Crear Nuevo Uusario</h3> <form name="form1" method="post" action="guardar.php?accion=guardar"> Nombre:<br> <input type="text" name="nombre"><br> Apellido:<br> <input type="text" name="apellido"><br> DNI:<br> <input type="text" name="dni"><br> <input type="submit" value="Crear"> <input type="button" value="Cancelar" onclick="cancelar()" /> </form> </body> </html>"; }elseif($accion=="guardar" { $nombre=$_POST[nombre];
$apellido=$_POST[apellido]; $dni=$_POST[dni]; $result=mysql_query("INSERT INTO usuarios(nombre, ("".$nombre."","".$apellido."",".$dni."",$conexion); echo " <html> <head> <title>Crear Nuevo Uusario</title> </head> <body> <h3>Los datos han sido guardados</h3> <a href="ver.php">Ir a listado</a> </body> </html>"; } include "cerrar_conexion.php"; ?> apellido, dni) VALUES
aqu est el cdigo para la base de datos y tabla y puedan realizar pruebas.
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL'; CREATE SCHEMA IF NOT EXISTS `demo` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ;
USE `demo`; -- ------------------------------------------------------ Table `demo`.`usuarios` -- ----------------------------------------------------CREATE TABLE IF NOT EXISTS `demo`.`usuarios` ( `nombre` VARCHAR(75) NOT NULL , `apellido` VARCHAR(75) NOT NULL , `dni` DOUBLE NOT NULL , PRIMARY KEY (`dni`) ) ENGINE = MyISAM; SET SQL_MODE=@OLD_SQL_MODE; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
class Mi_Cesta extends Cart { var $classname = "Mi_Cesta"; // Base de datos donde guardamos los artculos var $database_class = "DB_Article"; var $database_table = "articles"; var $db; var $sum = 0; function show_cart_open() {
printf("</table>n"); printf("That's a total of %s.n", $this->sum);} function show_item($art, $num) { if (!is_object($this->db)) { $class = $this->database_class;
$this->db = new $class; } $query = sprintf("select * from %s where artid = '%s'", $this->database_table, $art);
$this->db->query($query); while($this->db->next_record()) { printf(" <tr class=cart_row>n <td class=cart_cell>%s</td>n", $this->db->Record["name"]); printf(" <td class=cart_cell>%s</td>n",
Para utilizar la clase "Cart" vamos a necesitar crear una tabla ms donde se encuentren la descripcin de todos los artculos que vendamos en nuestra tienda. Esta tabla la podemos crear dentro de una base de datos propia para cada uno de nuestros clientes, base de datos que tambin deber tener la informacin de "active_sessions" y "auth_user". Un ejemplo sencillo podra ser:
# # Estructura de la tabla de 'articles' # CREATE TABLE articles ( name text, price float(8,2),
artid int(11) DEFAULT '0' NOT NULL auto_increment, PRIMARY KEY (artid) );
En la documentacin de PHPLIB se encuentran todos los detalles necesarios para un uso completo de esta clase. Su descripcin completa desbordara el espacio del que disponemos para este artculo.