Académique Documents
Professionnel Documents
Culture Documents
Curso:
PHP, MySQL y E-Commerce
Módulo:
“Diseño de aplicaciones con PHP y MySQL”
Tutor: Ing. Oscar R. Espeche
Modulo 5:
Introducción
El comercio electrónico o e-commerce es el nombre que se le asigna al proceso de venta de productos
por Internet. La tecnología en que se basa este comercio on line es el empleado en todos los sitios Web.
Por lo tanto necesitamos disponer por lo menos de un sitio Web más la implementación de algún medio
de pago y de distribución de mercaderías.
La mayoría de los sitios de comercio electrónico piden que el pago se realice mediante tarjetas de
crédito, presentando un formulario con los datos del cliente, de la compra, el número de la tarjeta, de tal
manera que el proceso de compra sea lo más seguro posible.
También el trato con los proveedores y distribuidores de productos que conforman la logística del flujo
de productos desde el fabricante hasta el consumidor se realizan por un medio electrónico.
Veremos a continuación los programas que nos permitirán armar una tienda virtual donde los clientes o
usuarios realizan su compra.
También se puede pensar en reconocer tres módulos o capas si se tiene en cuenta como algo crítico el
acceso a las bases de datos. Tenemos así el esquema o estructura de programación conocida como
modelo de tres capas. Dichas capas serían las siguientes.
También hay que aclarar que en una aplicación de Web se reconocen básicamente dos tipos de páginas:
En nuestro caso, el estilo adoptado para la diagramación de las páginas responde en forma aproximada
al siguiente esquema:
1. Inclusión de librerías básicas (allí se definen las funciones globales a todas las páginas)
2. Inclusión de encabezamientos (páginas que dibujan y procesan el encabezamiento como por ej.
Banners)
Tenemos que reconocer que la inclusión de los encabezamientos y pie, en las páginas de una misma
aplicación, facilita la tarea de otorgar al sitio un look característico. Al incluir cabeceras y pie similares
en las páginas, el sitio adquiere un estilo propio que se refleja en todas sus páginas.
A continuación mostramos distintas partes básicas del código de la página y trataremos de explicar su
contenido para mostrar como funciona el comercio en un sitio Web.
<?
//***************************INDEX.PHP *************************************************
//*******************************Pagina de inicio del sitio de comercio electronico******
?>
En esta parte del código observamos en primer lugar los comentarios que nos permiten realizar un
seguimiento de las alternativas del programa y de cómo se resuelven las distintas situaciones como así
también facilitar un posterior mantenimiento del mismo.
Vemos que la cadena de caracteres que sigue a las dos barras // son ignoradas por el procesador PHP y
las utilizamos para introducir comentarios al código en cualquier parte de una línea, pero solo hasta el
final de la misma.
Si queremos aislar un comentario del resto del código aunque abarque varias líneas, usamos la
siguiente metodología:
/*comentarios ...... ....... ...... .... .... ......... ........ ........... .................... ............ ............................. .......................... ...............
.................................................*/
/*************** comentarios ...... ....... ...... .... .... ......... ........ ........... .................... ............ .............................
.......................... ............... ....................................*******************************/
La sentencia :
include("aplicacion.php");
se usa para incluir el contenido de un archivo, en este caso aplicacion.php. Incluir significa que el
contenido de tal archivo se incorpora temporariamente al contenido de nuestro index.php en el punto de
inclusión y se procesa como si originariamente ambos formaran parte de un solo archivo. Es una forma
simple que se usa también por otros lenguajes para incorporar contenido de una forma flexible.
Normalmente las inclusiones se usan para rehusar código que se centraliza en un archivo por separado
que contiene funciones que se emplean en distintas páginas.
También se emplea la inclusión para incorporar código HTML que se desarrolla posiblemente por
separado por distintas personas que participan de un mismo proyecto y de esa forma las páginas PHP
son confeccionadas por programadores y las páginas con contenido HTML por diseñadores gráficos.
En nuestro caso, el archivo aplicacion.php contiene variables y otras definiciones que se requieren en
varias páginas del proyecto. Otra ventaja del uso de las inclusiones, es que permite definir en forma
centralizada, de tal manera que si se deben realizar cambios posteriores, solo se modifica un archivo
solamente y se asegura que la modificación alcanzan a todos los archivos que están dependientes de
dichas especificaciones.
Otra característica es que el archivo index.php como otros del proyecto, se ocupan de procesar scripts y
realizar definiciones sobre variables que después son tomados por los archivos con contenido HTML
que son incluidos a continuación.
La variable $titulo se usa para definir el título que aparece en el encabezado que se incluye a
continuación.
Varias páginas “principales de nuestro sitio comenzarán incluyendo aplicacion.php y header.php, por
los motivos ya señalados.
Todas estas tareas pueden ser realizadas por los mismos clientes. Algunas tienen sentido si todavía el
cliente no se registró (login) y otras se realizan una vez que el cliente se registró en el sitio.
Permite registrar la sesión del cliente y de esa manera realizarle el seguimiento mientras navega por el
sitio y asociarle como por ejemplo un carrito de compras donde va registrando los productos de una
posible futura compra.
La página principal para esta acción es login.php que describiremos a continuación. Esta página
también permite como acción secundaria, darle oportunidad al cliente de recordar su clave o crear una
nueva cuenta.
En el encabezamiento (header.php) tenemos un link a esta página como nos muestra la siguiente imagen
Como podemos apreciar tenemos un formulario para registrar el nombre y la contraseña del usuario y
también opciones de recordar la clave y la creación de una nueva cuenta.
Página login.php
El código de login.php comienza de la siguiente forma:
<?/* login.php */
$db=mysql_connect("localhost","alumno1","alumno");
mysql_select_db("e-shop",$db);
Como vemos, incluimos aplicacion.php para definir todas las variables básicas y las funciones de
librerías como es común en todas las paginas principales del sitio.
Aclaramos que una pagina principal es aquella que se accede por medio de un link, establece la sesión
con el servidor de web e incluye tal vez a otras páginas que llamamos secundarias.
También creamos la conexión con la base de datos e-shop donde se encuentran las tablas de nuestra
tienda virtual.
A continuación se verifica si se procede al procesamiento de la pagina con los datos enviados del
formulario, o si se trata de la presentación del formulario por primera vez.
La función verificar_login() comprueba la validez de los datos enviados en el formulario, y si estos son
correctos devuelve el array $usuario con los datos del cliente
Si $usuario existe (entonces existe el cliente con el nombre y la clave indicada en el formulario) se
registra el cliente en una variable de sesión para comenzar con su seguimiento.
if ($usuario) {
$SESSION["usuario"] = $usuario;/**** crea la var de sesión $SESSION["usuario"]
**** que es un array con los datos del usuario **/
También se verifica la procedencia del pedido de login para retornarlo al lugar de origen una vez
registrado, o simplemente introducirlo a la página principal de la tienda. Si proviene de una pagina que
solicite el login, entonces se definió la variable $SESSION[“faltalogin”] con la dirección de dicha
pagina.
Al final se define el título da la pagina que muestra el formulario de login y se incluyen las paginas con
contenido gráfico.
$titulo = "ADMINNET/E-SHOP";
include("$CFG->templatedir/header.php");//*************** include HEADER.PHP *************
include("$CFG->templatedir/login_form.php");/****** incluye templatedir/LOGIN_FORM.PHP****/
include("$CFG->templatedir/pie.php");//*************** include PIE.PHP
$qid = db_query("
SELECT cliente, nombre, apellido, email, priv
FROM usuarios
WHERE cliente = '$cliente' AND password = '" . md5($password) . "'
");
return db_fetch_array($qid);
}
La pagina templates/login_form.php muestra el formulario para enviar nombre y contraseña como asi
también funciones complementarias como recordar la contraseña y crear una nueva cuenta.
Pagina logout.php
Una vez que el cliente está conectado y por lo tanto definida la variable de sesión SESSION[“usuario”]
con los datos del cliente, aparece en la pantalla un link a la página logout.php.
Haciendo clic en dicho link se accede a dicha página y se deshabilita la variable SESSION[“usuario”]
con lo que el cliente pierde su sesión.
<?/* logout.php */
include("aplicacion.php");
unset($SESSION["usuario"]);
Pagina recordar.php
Si el cliente no recuerda su clave de acceso no podrá entrar en sesión en la tienda virtual que lo habilita
para realizar su compra. Bajo esta circunstancia puede cambiar su clave, pero en forma indirecta.
Indicando su dirección de correo, el sistema de la tienda virtual cambia su contraseña eligiendo una al
azar y se la envía a su dirección de correo.
En la pantalla que le muestra el formulario de login, tiene links que le permiten acceder a la página
recordar.php que realiza la tarea descripta anteriormente.
Esta página le muestra al cliente un formulario para que indique su dirección de correo donde enviará la
nueva clave.
<? /* recordar.php */
/*********************** cambia la clave y la envía por correo al cliente ***************/
//**variables remotas:
//** $email
//**
//$error está vacío si no hay error. Si sino, es un texto con los errores.
//$errores es un array que se crea por referencia que contiene indicación de los campos
//erróneos del formulario.
//Si no vino ninguna variable remota o si hubo error se ejecuta la página html con el formulario,
//quién a su vez ejecuta la página form_header.php que se encarga de revisar las variables de
error //si existen para marcar los errores si corresponde.
En el código vemos que después de validar el formulario, obtiene el nombre de login del cliente
mediante la función obtiene_cliente($HTTP_POST_VARS["email"]) y luego con el retorno de dicha
función ejecuta la función reset_pass_cliente($cliente) que cambia la contraseña y la envía al mail del
cliente.
La función validar_form() como su nombre lo indica valida el envío del formulario por parte del cliente,
y en el caso de que haya un error o el formulario esté en blanco o falten datos, muestra nuevamente el
formulario con un mensaje de advertencia para que el usuario corrija su error.
if (empty($frm["email"])) {
$errores->email = true;//el nombre de la propiedad debe ser igual al nombre del
//campo que se verifica
$error .= "debe indicar una dirección de correo válida";
} elseif (! existe_email($frm["email"])) {
$errores->email = true;
$error .= "No existe tal dirección en su registro";
}
Se crea el objeto $errores con una propiedad para cada casillero del formulario que será “true” si el
casillero está incorrecto. Luego en el formulario que se le presenta nuevamente al cliente se analiza la
propiedad asociada a dicho casillero y si es “true” dibuja una marca al lada de casillero respectivo.
También se genera un mensaje de error que se agrega a la variable $error, con el texto que señale los
errores cometidos. El listado de mensajes de errores será analizado y enviado a la pantalla por el código
<?
include("$CFG->templatedir/headeradminnet.php");//**** include HEADERADMINNET.PHP *******
?>
<?
include("$CFG->templatedir/form_header.php");/**** incluye FORM_HEADER.PHP ***************/
?>
<p>
<table cellpadding=20>
<tr valign=top>
<td width=300 class=normal>
<p>Indique su dirección de correo para obtener una nueva contraseña.
La nueva contraseña será enviada a su dirección de correo
<td bgcolor="#FDE90D">
<? if (! empty($msg)) { ?>
<div class=warning align=center><? pv($msg) ?></div>
<? } ?>
</tr>
</table>
</form>
</td>
</tr>
</table>
La función obtener_cliente() retorna el nombre de login del cliente que se almacena en el campo
“cliente”de la tabla “usuarios”.
function obtiene_cliente($email) {
/* obtiene los datos del usuario en base a su dirección de email ******************/
return $usuario->cliente; }
La función reset_pass_cliente($cliente)
function reset_pass_cliente($cliente) {
/* cambia el password del cliente con $cliente, y le envía la nueva clave por mail *****/
global $CFG;
/* cambia la clave */
$nuevapassword = genera_password();
$qid = db_query("UPDATE usuarios SET password = '" .
md5($nuevapassword) ."' WHERE cliente = '$cliente'");
mail(
"$var->nombre <$user->email>",
"Informacion confidencial de ADMINNET/E-SHOP",
$mensaje,
"From: $var->admin");
}
Vemos que usa la función genera_password() para obtener la nueva clave en forma aleatoria como se
muestra a continuación.
function genera_password($maxlong=10) {
global $CFG;
$relleno = "1234567890!@#$%&*-_=+^";
$lista = file($CFG->lista);
srand((double) microtime() * 1000000);
$palabra1 = trim($lista[rand(0, count($lista) - 1)]);//sel. palabra al azar
$palabra2 = trim($lista[rand(0, count($lista) - 1)]);//sel. otra pal. Al azar
$relleno1 = $relleno[rand(0, strlen($relleno) - 1)];//sel. caracter al azar
//retorna los 10 primeros caracteres de $palabra1.relleno1.$palabra2 ****
return substr($palabra1 . $relleno1 . $palabra2, 0, $maxlong);
}
A continuación graba la nueva clave en la tabla donde están los datos del usuario con:
Y finalmente envía al cliente un mensaje por correo electrónico donde le indica el cambio de clave y le
muestra su valor.
mail(
"$var->nombre <$user->email>",
"Informacion confidencial de ADMINNET/E-SHOP",
$mensaje,
"From: $var->admin");
El mensaje donde le indica el nuevo valor de la clave se coloca en $mensaje que se obtiene con la
función read_template($archivo, &$var) que se muestra a continuación.
//el parámetro &$var permite el acceso a las variables del objeto $var que contiene las variables
a reemplazar.
}
Esta función retorna un string con el contenido de un archivo de texto que se indica como argumento,
donde previamente se reemplazan las variables dentro de él con las componentes de la variable $var que
contiene los datos del cliente.
Hola: $var->nombre,
Atentamente,
Su Ayuda de E-SHOP: ($var->admin)
La función mail por lo tanto envía un mensaje según el contenido de sus argumentos donde se indica lo
siguiente:
Mensaje: $mensaje
eval
eval() evalúa la cadena de carácteres dada en code_str como código PHP. Entre otras cosas, ésto
puede ser útil para almacenar código en un campo de texto de base de datos para una ejecución
posterior.
Hay algunos aspectos a tener en cuenta cuando se utiliza eval(). Recuerde que la cadena de carácteres
pasada debe ser código PHP válido, incluyendo aspectos como sentencias de terminación con un punto
y coma para que el parser no finalice en la línea después de eval(), y secuencias de formato correctas en
code_str.
Recuerde también que las variables a las que se les da valor en eval() retendrán estos valores
posteriormente en el script principal.
Ejemplo
<?php
$string = 'cup';
$name = 'coffee';
$str = 'This is a $string with my $name in it.<br>';
echo $str;
eval( "\$str = \"$str\";" );
echo $str;
?>
microtime
Devuelve la cadena "msec sec", donde sec es la hora actual en número de segundos desde el valor Unix
Epoch (0:00:00 del 1 de enero de 1970, hora GMT), y msec es la parte de microsegundos.
srand
rand
Si es llamada sin los argumentos opcionales min y max, rand() devuelve un valor pseudo-aleatorio entre
0 y RAND_MAX. Si quiere un número aleatorio entre 5 y 15 (inclusive), por ejemplo, use rand(5,15).
Recuerde introducir la semilla del generador de números aleatorios antes de usar srand().
La creación y mantenimiento de las cuentas de los clientes también forma parte de las tareas
administrativas del encargado de dicha función, como se explicará oportunamente cuando se explique la
funcionalidad de administración remota de la tienda virtual.
Por lo pronto vemos que un visitante cualquiera del sitio Web puede voluntariamente convertirse en
cliente mediante la página registrar.php que le permite al visitante introducir sus datos en un
formulario para ser registrado como cliente de la tienda virtual.
La página registrar.php
Esta página simplemente permite el alta de los datos del cliente mediante un formulario como se
muestra a continuación.
<? /* registrar.php */
/************crea cuenta de usuarios con nombre de login unicos*********************/
include("../aplicacion.php");/********incluye aplicacion.php**********************/
include("$CFG->templatedir/header.php");/**incluye HEADER.PHP******/
include("$CFG->templatedir/form_header.php");/**incluye FORM_HEADER.PHP******/
include("templates/registrar.php");/**incluye templates/REGISTRAR.PHP******/
include("$CFG->templatedir/pie.php");/**incluye PIE.PHP******/
La función validar_form.php
Como ya vimos, esta función permite obtener el mensaje que se presenta en el formulario, para
comunicarle al cliente que cometió errores en el llenado del mismo. También se indica aquellos campos
del formulario que deben corregirse.
/*Analiza cada campo obligatorio. Si hay error, crea el trozo de mensaje correspondiente ($msg) y
crea la propiedad correspondiente del objeto $errores como “true”. Todo esto luego será tenido en
cuenta por el código de la página form_header.php para indicarle al usuario cuales son y donde
están los errores.**/
if (empty($frm["cliente"])) {
$errores->cliente = true;
$msg .= "<li>Ud. no especificó el nombre del Cliente";
} if (cliente_existe($frm["cliente"])) {
$errores->cliente = true;
$msg .= "<li>El Cliente <b> " . ov($frm["cliente"]) ."
</b> ya existe";
} if (empty($frm["password"])) {
$errores->password = true;
$msg .= "<li>No especifico la contraseña";
} if (empty($frm["nombre"])) {
$errores->nombre = true;
$msg .= "<li>Falta especificar su primer nombre";
} if (empty($frm["apellido"])) {
$errores->apellido = true;
$msg .= "<li>Falta indicar su apellido";
} if (empty($frm["email"])) {
$errores->email = true;
$msg .= "<li>Olvido indicar su direccion de correo";
} if (existe_email($frm["email"])) {
$errores->email = true;
$msg .= "<li>La dirección de correo<b> ".ov($frm["email"])." </b>ya existe";
} if (empty($frm["telefono"])) {
$errores->telefono = true;
$msg .= "<li>No indicó su número de teléfono";
Autor: Ing. Oscar R. Espeche 28
PHP,MySQL y E-COMMERCE Diseño de una tienda virtual
} if (empty($frm["direccion"])) {
$errores->direccion = true;
$msg .= "<li>Falta especificar su domicilio particular";
}
return $msg;
}
A continuación vemos el código da la función que accede a la base de datos para agregar un registro
que contenga la cuenta de un usuario
function agregar_usuario(&$frm) {
$qid = db_query("
INSERT INTO usuarios (
cliente, password, nombre, apellido, email, telefono, direccion,
pais,
provincia, ciudad
) VALUES (
'$frm[cliente]'
,'" . md5($frm[password]) ."'
,'$frm[nombre]'
,'$frm[apellido]'
,'$frm[email]'
,'$frm[telefono]'
,'$frm[direccion]'
,'$frm[pais]'
,'$frm[prov]'
,'$frm[ciudad]'
)");
}
?>
A continuación vemos a título informativo el contenido de la tabla usuarios como podría verse
con la herramienta MySQLcc
La página templates/registrar.php
Esta es una página secundaria incluida por registrar.php que como ya anticipamos sirve para contener
la parte de HTML de esta sección del código. Su contenido se incluye si el formulario para agregar
cliente se muestra por primera vez, o se repite mostrando los errores cometidos en un llenado previo
del formulario. La imagen proporcionada por esta página ya fue mostrada anteriormente. El código es el
siguiente.
<p class=normal>
Por favor complete el formulario. Todos los campos son obligatorios.
</p>
<? mysql_select_db("e-shop",$db);?>
<tr>
<td class=label>País:</td>
<td><select name="pais">
<?php
$qid=db_query("select * from pais");
while ($row=db_fetch_array($qid)) { ?>
<option <? echo $row["pnombre"]; if ($row["pnombre"]==pv($frm["pais"]))
{?> selected<?}?>><?=$row["pnombre"]?>
<?}?>
</select></td>
</tr>
<tr>
<td class=label>Provincia:</td>
<td><select name="prov">
<?php
$qid=db_query("select * from provincia");
while ($row=db_fetch_array($qid)) { ?>
<option <? echo $row["prov_nom"]; if
($row["prov_nom"]==pv($frm["provincia"]))
{?> selected<?}?>><?=$row["prov_nom"]?>
<?}?>
</select></td>
</tr>
<tr>
<td class=label>Ciudad:</td>
<td><select name="ciudad">
<?php
$qid=db_query("select * from ciudad");
while ($row=db_fetch_array($qid)) { ?>
<option <? echo $row["cnombre"]; if ($row["cnombre"]==pv($frm["ciudad"]))
{?> selected<?}?>><?=$row["cnombre"]?>
<?}?>
</select></td>
</tr>
<tr valign=top>
<td class=label>Domicilio Particular:</td>
<td><textarea name="direccion" cols=50 rows=5><? pv($frm["direccion"]) ?></textarea>
<?err($errors->direccion)?></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="Crear la Cuenta de Cliente"></td>
</tr>
</table>
</form>
La función pv() es la siguiente , tal como está definida en la librería lib/lib.php, que define funciones
globales.
function pv(&$var) {
/* imprime $var con los caracteres HTML (como "<", ">", etc.) propiamente
* delimitados, si $var no esta definida, imprime un string vacio.
* para strings normales o funciones usar ov() ****************************/
La función err() es la siguiente , tal como está definida en la librería lib/e-shop.php, que define
funciones globales.
function err(&$errorvar) {
if (isset($errorvar)) {
echo "<font color=#ff0000><<</font>";
}
}
Esta función es la que genera la marca “<<” que se dibuja en el formulario al lado del campo que
contiene error.
El siguiente código se usa para generar los select HTML para elegir en el formulario país, provincia y
ciudad de una lista.
<? mysql_select_db("e-shop",$db);?>
<tr>
<td class=label>País:</td>
<td><select name="pais">
<?php
$qid=db_query("select * from pais");
while ($row=db_fetch_array($qid)) { ?>
<option <? echo $row["pnombre"]; if ($row["pnombre"]==pv($frm["pais"]))
{?> selected<?}?>><?=$row["pnombre"]?>
<?}?>
</select></td>
</tr>
Autor: Ing. Oscar R. Espeche 36
PHP,MySQL y E-COMMERCE Diseño de una tienda virtual
<tr>
<td class=label>Provincia:</td>
<td><select name="prov">
<?php
$qid=db_query("select * from provincia");
while ($row=db_fetch_array($qid)) { ?>
<option <? echo $row["prov_nom"]; if ($row["prov_nom"]==pv($frm["provincia"]))
{?> selected<?}?>><?=$row["prov_nom"]?>
<?}?>
</select></td>
</tr>
<tr>
<td class=label>Ciudad:</td>
<td><select name="ciudad">
<?php
$qid=db_query("select * from ciudad");
while ($row=db_fetch_array($qid)) { ?>
<option <? echo $row["cnombre"]; if ($row["cnombre"]==pv($frm["ciudad"]))
{?> selected<?}?>><?=$row["cnombre"]?>
<?}?>
</select></td>
</tr>
La página form_header.php
Esta página es la encargada de mostrar el mensaje de los errores cometidos en un formulario.
<?
/******muestra la lista de errores de $error y/o mensaje de $mensaje ********/
if (!empty($error)) {
echo "<h2 style='color: #ff0000'>Error</h2>";
echo "<div class=normal>";
echo $error;
echo "</div>";
}
<table>
<tr>
<td class=normal>Nombre de login:</td>
<td class=normal><b><? pv($frm["cliente"]) ?></b></td>
</tr>
<tr>
<td class=normal>Contraseña:</td>
<td class=normal><b><? pv($frm["password"]) ?></b></td>
</tr>
</table>
<p class=normal>
Por favor memorice estos datos y manténgalos en privado!!
</p>
<p class=normal>
Si lo desea, ahora si puede conectarse con el sistema <a href=
"<?=$CFG->wwwroot?>/login.php">login</a>.
</p>
Autor: Ing. Oscar R. Espeche 39
PHP,MySQL y E-COMMERCE Diseño de una tienda virtual
<?
/**** actualiza los datos del propio cliente**************************/
if (empty($error)) {
actualizar_datos($frm);
$mensaje = "Se actualizaron los datos exitosamente";
}
} else {
$frm = carga_perfil_usuario();
}
/******************************************************************************
* FUNCIONES
*****************************************************************************/
function carga_perfil_usuario() {
global $SESSION;
$cliente = $SESSION["usuario"]["cliente"];
$qid = db_query("SELECT * FROM usuarios WHERE cliente = '$cliente'");
return db_fetch_array($qid);
}
global $SESSION;
if (empty($frm["email"])) {
$errores->email = true;
$msg .= "<li>Falta indicar su direccion de correo";
} elseif (empty($frm["telefono"])) {
$errores->telefono = true;
$msg .= "<li>Falta indicar el numero de su telefono";
} elseif (empty($frm["direccion"])) {
$errores->direccion = true;
$msg .= "<li>Falta indicar el numero de su direccion personal";
}
return $msg;
}
function actualizar_datos(&$frm) {
global $SESSION;
$cliente = $SESSION["usuario"]["cliente"];
$qid = db_query("
UPDATE usuarios SET
email = '$frm[email]'
,telefono = '$frm[telefono]'
,direccion = '$frm[direccion]'
WHERE cliente = '$cliente'
");
}
?>
actualizar_datos($frm);
Se define la variable
carga_perfil_usuario();
Donde se obtienen los datos registrados del usuario para llenar los campos correspondientes del
formulario.
Donde se le informa al usuario de las fallas del formulario para que corrija.
La página templates/cambiar_datos.php
Muestra el formulario para cambiar los datos personales del cliente. Se muestran datos fijos que se
obtienen de la variable de sesión $SESSION[“usuario”] y los datos modificables de la base de datos de
usuarios, cuando se muestran por primera vez. Cuando se modifican los datos se muestra el formulario
modificado con los nuevos datos que se obtienen de la variable $HTTP_POST_VARS.
<tr>
<td class=label>Direccion de correo:</td>
<td><input type="text" name="email" size=25 value="<? pv($frm["email"]) ?>">
<?err($errors->email)?>
</td>
</tr>
<tr>
<td class=label>Teléfono:</td>
<td><input type="text" name="telefono" size=25 value="<? pv($frm["telefono"]) ?>">
<?err($errors->telefono)?>
</td>
</tr>
<tr valign=top>
<td class=label>Dirección postal:</td>
<td><textarea name="direccion" cols=50 rows=5><? pv($frm["direccion"]) ?></textarea>
<?err($errors->direccion)?>
</td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="Actualizar los datos"></td>
</table>
</form>
El código es el siguiente.
<?
/******** permite cambiar la contraseña, si conoce la contraseña anterior*********/
/******************************************************************************
* FUNCIONES
*****************************************************************************/
return $msg;
}
function valida_clave($password) {
global $SESSION;
$cliente = $SESSION["usuario"]["cliente"];
$password = md5($password);
Autor: Ing. Oscar R. Espeche 52
PHP,MySQL y E-COMMERCE Diseño de una tienda virtual
function actualiza_clave($nuevapassword) {
/* cambia la contrasena */
global $SESSION;
$cliente = $SESSION["usuario"]["cliente"];
$nuevapassword = md5($nuevapassword);
?>
Pagina usuarios/templates/cambiar_clave.php
Es la página secundaria de usuarios/cambiar_clave.php, que muestra el formulario para cambiar la
clave. El código es el siguiente.
Página index.php
Es la página principal del sitio de la tienda virtual ADMINNET/E_SHOP que se dedica a la venta de
software por Internet. Este tipo de comercio virtual es uno de los más simples y convenientes desde el
punto de vista de su facilidad administrativa.
En este tipo de comercio se simplifica notablemente el manejo de stocks como así también la logística
de distribución del producto, ya que se baja directamente por la red desde el sitio hasta el consumidor
final.
Sin embargo en el transcurso del desarrollo del curso haremos mención las distintas cuestiones
relacionadas con un comercio más complejo en donde se deban administrar relaciones con los
proveedores y distribución de la mercadería por diferentes medios de transporte.
A continuación mostramos distintas partes del código de la página y trataremos de explicar su contenido
para mostrar como funciona el comercio en un sitio Web.
<?
//***************************INDEX.PHP *************************************************
//*******************************Pagina de inicio del sitio de comercio electronico******
?>
En esta parte del código observamos en primer lugar los comentarios que nos permiten realizar un
seguimiento de las alternativas del programa y de cómo se resuelven las distintas situaciones como así
también facilitar un posterior mantenimiento del mismo.
La inclusión del encabezamiento realiza la siguiente tarea de mostrar en pantalla links a distintas
páginas principales como se muestra a continuación.
Varias páginas “principales de nuestro sitio comenzarán incluyendo aplicacion.php y header.php, por
los motivos ya señalados.
A continuación se elabora una tabla que contiene la parte central de la página index.php.
<a href="shopping/index.php">
<img src="images/webmail.png" border=0 width=440 height=350></a>
<!--------------------------------------------------------------------------------------->
En la parte fina de la tabla se incluye un campo donde se ubican las promociones del día de los
productos totales del sitio. O sea las promociones más importantes que se usan para atraer a los clientes
a nuestro sitio.
Al final se incluye el archivo pie.php que contiene la terminación de varias de las páginas del sitio.
Debe notarse que la estructura de la página está implementada por tres partes básicas que son:
El encabezamiento.
Las imágenes centrales.
El pie
Bajo el punto de vista estructural del contenido, podemos observar prestando atención al código HTML,
que las tres partes mencionadas están conectadas entre si por el hecho de formar parte de una tabla que
comienza en el encabezado, continúa en la parte central y termina en el pie.
Esto permite en las subsiguientes páginas elaborar solamente la parte central y armar el conjunto total
simplemente incluyendo al comienzo el encabezamiento y terminar finalmente incluyendo el pie.
La parte central debe ser un campo de dicha tabla, que normalmente debería contener una tabla donde
se estructura el contenido.
Todo esto permite lograr una buena eficiencia en el diseño del código como así también delegar tareas
que se procesen en forma paralela a varios integrantes del proyecto.
Al final del código vemos la definición de la función promociones(), que como se observará se puede
implementar después de hacer un llamado a dicha función (en un campo de la tabla). También se puede
implementar la definición de la función antes de su llamado.
function promociones() {
/******************************* muestra la lista de las promociones *************************/
global $CFG;
mysql_select_db("e-shop");//*************conexion con la base de datos*****************
//*******************************selecciona los productos en oferta ***************************
$qid = db_query("SELECT id, nombre, descripcion, oferta_especial, precio FROM productos
WHERE oferta_especial = 1");
include("$CFG->templatedir/promociones.php");//**** incluye PROMOCIONES.PHP ***********
}
Vemos que la variable $CFG se define como global ya que fue definida fuera del cuerpo de la función
actual.
Se usa la función mysql_select_db("e-shop") para seleccionar a la base de datos e-shop que permite a
continuación realizar la consulta :
$qid = db_query("SELECT id, nombre, descripcion, oferta_especial, precio FROM productos
WHERE oferta_especial = 1");
$qid contiene el handle (habilitador) que permite el acceso al resultado de la consulta conocido como
“recordset”.
Dicho resultado será accedido y manejado por el archivo templates/promociones.php que se incluye a
continuación. Este archivo tiene contenido HTML que permite visualizar en el navegador un listado de
las ofertas globales de la tienda virtual, como será explicado oportunamente.
En definitiva, la página index.php es una página principal (incluye a otras secundarias) que procesa
información en el servidor de Web mediante el procesador PHP y que envía contenido gráfico al
navegador como se aprecia a continuación.
<?
//***************************INDEX.PHP
*************************************************
//*******************************Pagina de inicio del sitio de comercio electronico******
?>
<table class = normal width=100%>
<tr valign="top">
<td class = normal> <h1>Bienvenido a ADMINNET/E-SHOP</h1>
<a href="shopping/index.php">
<img src="images/webmail.png" border=0 width=440 height=350></a>
<!--------------------------------------------------------------------------------------->
<?
include("$CFG->templatedir/pie.php");//*************** incluye PIE.PHP ******************
/*********************************************************************************
*******
* FUNCIONES
**********************************************************************************
******/
function promociones() {
/******************************* muestra la lista de las promociones ********************/
global $CFG;
mysql_select_db("e-shop");//*************conexion con la base de datos***********
//*******************************selecciona los productos en oferta *********************
$qid = db_query("SELECT id, nombre, descripcion, oferta_especial, precio FROM productos
WHERE oferta_especial = 1");
include("$CFG->templatedir/promociones.php");//**** incluye PROMOCIONES.PHP
******
}
?>
Autor: Ing. Oscar R. Espeche 61
PHP,MySQL y E-COMMERCE Diseño de una tienda virtual
Página aplicacion.php
En esta página se definen valores iniciales de configuración como se muestran a continuación:
$CFG->dbhost = "localhost";
$CFG->dbnombre = "e-shop";
$CFG->dbusuario = "root";
$CFG->dbpass = "password";
$CFG->wwwroot = "/ecommerce";
$CFG->dirroot = "/mnt/hda4/ecommerce/ecommerce";
$CFG->templatedir = "$CFG->dirroot/templates";
$CFG->libdir = "$CFG->dirroot/lib";
$CFG->imagedir = "$CFG->wwwroot/images";
$CFG->lista = "$CFG->libdir/lista.txt";
$CFG->admin = "oespeche@adminnet.edu.ar";
Vemos que se crea un objeto genérico y se le asignan valores a sus propiedades que consisten en
definiciones generales para un sitio determinado que serán diferentes para otros sitios ya que
representan los valores típicos de la configuración del sitio y el acceso a la base de datos.
Cabe notar que $CFG->wwwroot se refiere a un PATH interpretado por http y $CFG->dirroot se refiere
a un PATH interpretado por el sistema de archivos del sistema operativo.
Luego se usa el poder de inclusión para incorporar a las funciones de librerías comunes que se usarán en
la mayoría de las páginas del sitio.
Como vemos los archivos de librerías se usan para agrupar funciones de acuerdo a su ámbito de
cometido.
Como en todo sitio Web usaremos las variables de sesión que permiten asociar contenido a una sesión,
que consiste en varios accesos a distintas páginas del sitio.
El protocolo http tiene la particularidad que no memoriza el acceso a sus páginas, de tal manera que
cuando un usuario accede a una página, es como si lo hiciera por primera vez, sin tener en cuenta lo
accedido anteriormente. Se dice que el protocolo http es “sin estado”.
Para incorporar un estado consistente, en varios accesos al sitio que conforman una sesión, de tal
manera que los distintos accesos se puedan relacionar, se crearon las variables de sesión que se guardan
en un archivo o directorio temporario del servidor y que es accedido cada vez que se indica la variable
de sesión correspondiente.
Las variables se localizan en base a un número que caracteriza a la sesión que es enviado al navegador
del cliente, y que es devuelto en la siguiente conexión que forma parte de la sesión. De esa forma es
posible relacionar varias conexiones como pertenecientes a una misma sesión y localizar las variables
de sesión correspondientes.
Luego, en nuestro caso particular definimos a la variable $SESSION como un array, que nos permitirá
alojar múltiples variables.
Todas estas acciones se realizarán cada vez que un archivo incluya a aplicacion.php. A continuación
vemos el código completo de aplicación.php.
<?
//***************************APLICACION.PHP
//********* define variables globales, incluye librerias y conecta con la base ***********
$CFG->wwwroot = "/ecommerce";
$CFG->dirroot = "E:/Tecnologica/comercio electronico/Ejercicios/ecommerce";
$CFG->templatedir = "$CFG->dirroot/templates";
$CFG->libdir = "$CFG->dirroot/lib";
$CFG->imagedir = "$CFG->wwwroot/images";
$CFG->lista = "$CFG->libdir/lista.txt";
$CFG->admin = "oespeche@adminnet.edu.ar";
Página header.php
Este archivo se incluye en todas aquellas páginas que deben mostrar un encabezado con el logo del sitio
y otras promociones propias del mismo.
A su vez incluye a otro encabezado que contiene el banner u otros banner que se deseen incorporar para
promocionar sitios y/o productos. Ambos encabezados definen de alguna manera el estilo gráfico de la
presentación visual de la tienda virtual.
<?php
//***************************HEADER.PHP
//******************incluye header de ADMINNET que coloca la barra superior**************
include ("/mnt/hda4/ecommerce/ecommerce/templates/headeradminnet.php");
?>
Esta página es un ejemplo de página secundaria que será solamente mostrada como una inclusión de
otra que será la página principal tomada por el navegador. La página principal es accedida mediante un
link o un URL definido como dirección de acceso en el navegador.
Como se trata de un archivo que se incluye al comienzo de páginas que desean una salida gráfica, se
aprovecha para definir estilos de fuentes que se usarán en el resto de la página principal.
<style>
h1 { font-family: Arial, sans-serif; font-size: 14pt; font-weight: bold;
color: #006699; }
h2 { font-family: Arial, sans-serif; font-size: 12pt; font-weight: bold; }
th { font-family: Arial, sans-serif; font-size: 10pt; font-weight: bold;
text-align: center; }
.h1 { font-family: Arial, sans-serif; font-size: 14pt; font-weight: bold; }
.h2 { font-family: Arial, sans-serif; font-size: 12pt; font-weight: bold; }
.label { font-family: Arial, sans-serif; font-size: 10pt; font-weight: bold; }
.normal { font-family: Arial, sans-serif; font-size: 10pt; }
.notice { font-family: Arial, sans-serif; font-size: 10pt; color: #006699; }
</style>
Esto es solo un ejemplo de cómo se puede simplificar la definición de estilo en páginas HTML.
A continuación se muestra como se resuelve parte de este encabezado en nuestra tienda virtual:
Vemos que existe una toma de decisión que permite mostrar el nombre del cliente registrado y su
posibilidad de desconexión, o la opción de login y la posibilidad de crear una cuenta de cliente si el
usuario todavía no está logueado. Esto se muestra en la siguiente figura:
Se ha marcado la tabla con border=”1” para poner en evidencia los límites de la tabla. Vemos que la
mitad del borde rojo corresponde a header.php y la mitad superior a headeradminnet.php.
También observamos que $titulo se define en la página principal previo a la inclusión de header.php,
para desplegar el título de la página en forma normalizada.
Luego sigue la elaboración de la salida que se muestra en la barra vertical de la izquierda donde
primeramente mostramos las opciones:
Home
Entrar al shopping
Cambiar contraseña
Actualizar datos
Logout
Si el usuario es un administrador se muestra el enlace Administrar el sitio en caso contrario se usa ese
lugar para darle al usuario la posibilidad de registrarse o crear una cuenta.
A continuación se muestra un resumen del contenido en el carrito o cesta de compras que le permite al
cliente ver la cantidad de productos seleccionados para la compra y el monto total de la misma.
También se incluye un acceso a la página principal del carrito de compras donde el cliente podrá ver los
detalles de la compra como así también modificar la misma.
<tr>
<td class=normal>Items:</td>
<td class=label><?=$SESSION["carro"]->cantitems()?></td>
</tr>
<tr>
<td class=normal>Total:</td>
<td class=label><? printf("$%.2f", $SESSION["carro"]->total); ?></td>
</tr>
<tr>
<td nowrap colspan=2 class=label><br><a href="<?=$CFG->wwwroot?>
/shopping/comprar.php">Compre YA!!</a></td>
</tr>
</table>
La función de la clase Carro (se explicará luego con los detalles de la cesta de compra)
$SESSION["carro"]->cantitems() muestra la cantidad de ítems que contiene actualmente la cesta de
compras, y la variable $SESSION["carro"]->total muestra el monto total de la compra hasta este
momento. Estos valores son actualizados cada vez que se incorpora un producto a la cesta de compras
(carrito). La salida es la siguiente:
Accediendo a la tienda virtual podrá comprobar que cada vez que selecciona un producto para ser
incluido en el carrito, se actualizan estos valores.
Finalmente se termina el encabezado abriendo un campo de la tabla, que contendrá a la parte central de
la página.
<td width=100%>
<!--**********en este campo se coloca la imagen central de la pagina, en index.php**************-
->
Como fue explicado previamente, la tabla se cierra recién en el pie da la página (pie.php) que
obligatoriamente deberá ser incluido.
<?php
//***************************HEADER.PHP
//******************incluye header de ADMINNET que coloca la barra superior**************
$title=$titulo;
include ("$CFG->templatedir/headeradminnet.php");//entre otras cosas dibuja el banner ****
?>
<html>
<head>
<title><? pv($titulo) ?></title>
</head>
<!--**********************define estilos de texto**************************************--
>
<style>
h1 { font-family: Arial, sans-serif; font-size: 14pt; font-weight: bold;
color: #006699; }
h2 { font-family: Arial, sans-serif; font-size: 12pt; font-weight: bold; }
th { font-family: Arial, sans-serif; font-size: 10pt; font-weight: bold;
text-align: center; }
.h1 { font-family: Arial, sans-serif; font-size: 14pt; font-weight: bold; }
.h2 { font-family: Arial, sans-serif; font-size: 12pt; font-weight: bold; }
.label { font-family: Arial, sans-serif; font-size: 10pt; font-weight: bold; }
.normal { font-family: Arial, sans-serif; font-size: 10pt; }
.notice { font-family: Arial, sans-serif; font-size: 10pt; color: #006699; }
.notice2 { font-family: Arial, sans-serif; font-size: 14pt; color: #006699; }
</style>
<body bgcolor="yellow" link=#0000ff vlink=#000099 alink=#ff0000>
<!----------------------comienza la barra central roja------------------------------------------------------------>
<table width=100% cellspacing=0 border = 1>
<tr>
<td width = 100% bgcolor="#C70D11" class=h1><? pv($titulo) ?></td>
</table>
</td>
</tr>
<tr><td bgcolor="#C70D11" colspan=1><hr size=1></td></tr>
<tr>
<td class=normal>Items:</td>
<td class=label><?=$SESSION["carro"]->cantitems()?></td>
</tr>
<tr>
<td class=normal>Total:</td>
<td class=label><? printf("$%.2f", $SESSION["carro"]->total); ?></td>
</tr>
<tr>
<td nowrap colspan=2 class=label><br><a href="<?=$CFG->wwwroot?>
/shopping/comprar.php">Compre YA!!</a></td>
</tr>
</table>
</td>
<td width=15 nowrap></td>
<td width=100%>
<!--**********en este campo se coloca la imagen central de la pagina, en index.php**************--
>
Página pie.php
Es una página que se usa para terminar las páginas de la tienda virtual, que contiene cierta información
que se desee incluir en todas las páginas.
En nuestro caso simplemente contiene una línea de terminación y el nombre del sitio como firma
distintiva del sitio.
<!--PIE.PHP-->
<!--**************************pie de la pagina principal ***********->
<p>
<hr size=1>
<div align=right class=normal>ADMINNET/E-SHOP</div>
</body>
</html>
También se observa que en este archivo se termina la página HTML, cerrando así el contenido gráfico
que fue iniciado en heder.php.