You are on page 1of 9

Tu mejor ayuda para aprender a hacer webs

www.desarrolloweb.com

Carrito de la compra en PHP

Autores del manual


Este manual ha sido realizado por los siguientes colaboradores de DesarrolloWeb.com:
Miguel Angel Alvarez
Director de DesarrolloWeb.com
http://www.desarrolloweb.com

Carrito de la compra en PHP: www.desarrolloweb.com/manuales/56/ 1


© Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorización.
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com

(5 capítulos)

Carrito de la compra en PHP


Vamos a ver una manera sencilla de realizar un carrito de la compra en PHP, utilizando una
variable de sesión para guardar los datos del carrito, como los nombres de los productos, sus
precios y otros datos de interés. En estos ejemplos nos vamos a centrar exclusivamente en la
funcionalidad del carrito, es decir, la memorización de los productos comprados a lo largo de
toda la sesión, dejando de lado todo lo relativo a presentación o la extracción de los productos
de una base de datos.

Para entender este manual son necesarios unos conocimientos previos sobre PHP, que se
pueden obtener de la lectura de nuestro manual de PHP http://www.desarrolloweb.com/php/ o
los talleres prácticos de la tecnología http://www.desarrolloweb.com/manuales/6/. Debemos
prestar especial atención al manejo de sesiones en PHP y, dado que esta implementación del
carrito está realizada utilizando programación orientada a objetos, será necesario que
conozcamos un poco ese tipo de programación, particularmente en PHP 4.

El carrito lo hemos creado con la versión PHP 4. Para que este ejemplo funcione en PHP 5 (que
básicamente cambia con respecto a su antecesor en el trabajo con objetos) habría que realizar
algunas modificaciones.
Referencia: Disponemos de algunos artículos sobre la programación orientada a objetos en PHP 4.

Se pueden descargar los códigos de este artículo en un archivo comprimido.

Librería lib_carrito.php

Vamos a atacar al problema creando una librería con la declaración de una clase, que luego
utilizaremos para crear un objeto carrito. Con dicho objeto implementaremos el trabajo típico
del carro de la compra, es decir, introducir productos, extraerlos, contabilizar precios, etc. Esta
librería la guardaremos en un archivo llamado lib_carrito.php y contendrá el código de la clase
carrito, con todos sus métodos y propiedades.

El carrito se debe poder acceder en cualquier momento, siempre y cuando el visitante


permanezca en la página. Además, cada visitante debe disponer de un carrito propio. Aunque
podríamos pensar en otras soluciones, estas necesidades descritas inicialmente, hacen muy
recomendable el uso de variables de sesión, puesto que ofrecen la mejor forma de tratar con
datos específicos de cada usuario, que deben perdurar entre las distintas páginas que visite.

Vamos a mantener una variable de sesión con una instancia de la clase carrito, que contendrá
el carro de la compra del visitante. Esta variable de sesión se guardará en
$_SESSION["ocarrito"] y se debe crear al acceder a la página, siempre y cuando no se haya
creado previamente. Por ello, en cada página se ha de comprobar si hay un carrito creado y, si
no es así, se debe instanciar el objeto.

if (!isset($_SESSION["ocarrito"])){
$_SESSION["ocarrito"] = new carrito();
}

Carrito de la compra en PHP: www.desarrolloweb.com/manuales/56/ 2


© Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorización.
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com

Este código lo hemos situado dentro del archivo librería del carrito, después de la declaración
de la clase.

Artículo por Miguel Angel Alvarez

Estudio de las necesidades del carrito


Ahora nos vamos a fijar en la clase carrito. Para empezar vamos a hacer un estudio de las
funcionalidades y datos que debería contener.

Métodos del objeto carrito

Las funcionalidades que debería implementar el objeto carrito se definirán como métodos de la
clase carro de la compra. En principio, se deben crear los siguientes métodos:
• Introducir un producto en el carrito
• Eliminar un producto del carrito
• Mostrar el carrito
• Otras funcionalidades que seguro que necesitarás a medida que avances en el trabajo...
Datos a utilizar

Para empezar, tenemos que llevar la cuenta del número de productos que se han introducido
en el carrito. En el momento de creación del objeto carrito, el número de productos debe ser
igual a cero.

También necesitaremos guardar los id_producto de cada uno de los productos que se vayan
introduciendo en el carrito. Lo haremos a través del array $array_id_prod, que es una de las
propiedades del objeto.

Ahora bien, probablemente sea útil guardar más que los simples identificadores de los
productos. Si se guarda su precio y su nombre puede ser útil para mostrar rápidamente esos
valores sin necesidad de acceder a la base de datos.

Para ello se utilizan otro par de arrays, que también se han creado como atributos del objeto
carrito. Estos son $array_nombre_prod, para almacenar los nombres de los productos y
$array_precio_prod, para guardar los precios de cada uno de los productos del carrito.

Artículo por Miguel Angel Alvarez

Implementación de la clase carrito en PHP


Como habíamos dicho, el carrito de la compra se ha implementado en una clase, para
aprovechar algunas de las ventajas de la programación a objetos. Vamos a ver ahora cómo
realizar esa clase, lo que incluye la definición de propiedades y métodos.

Atributos de la clase carrito

Carrito de la compra en PHP: www.desarrolloweb.com/manuales/56/ 3


© Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorización.
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com

Es preferible empezar por ver los atributos que tendrá la clase carrito, que ya adelantamos en
el capítulo anterior.

//atributos de la clase
var $num_productos;
var $array_id_prod;
var $array_nombre_prod;
var $array_precio_prod;

El atributo $num_productos guarda el número de productos almacenados en el carrito.


$array_id_prod guarda los identificadores de los productos comprados. $array_nombre_prod
almacena los nombres de los productos y por último, $array_precio_prod, que guarda el precio
de los productos.

Por ejemplo, si tuviésemos un solo producto en el carrito, $num_productos valdría uno.


Además, en los arrays tendríamos una sola posición (con índice cero), donde se guardaría el
identificador, nombre y precio. Estos datos se guardan por separado en cada uno de los tres
arrays.

Métodos del carrito

Vamos ahora con las funciones típicas del carrito que se necesitará crear en algún momento.

Constructor

Se debe contar con un constructor que resuma las tareas de inicialización del carrito. En
concreto, el constructor simplemente inicia a cero el número de productos del carrito.

function carrito () {
$this->num_productos=0;
}

Nota: Este objeto está construido con PHP 4, donde los constructores tienen el mismo nombre que la
clase, en este caso "carrito". En PHP 5 los constructores deben llamarse siempre __constructor

Introducir un producto en el carrito

Se hace con el método introduce_producto(),que recibe los datos del producto y los introduce
en el objeto carrito. También aumenta en uno el número de productos del carrito.

function introduce_producto($id_prod,$nombre_prod,$precio_prod){
$this->array_id_prod[$this->num_productos]=$id_prod;
$this->array_nombre_prod[$this->num_productos]=$nombre_prod;
$this->array_precio_prod[$this->num_productos]=$precio_prod;
$this->num_productos++;
}

El incremento se hace al final porque el numero de productos inicialmente es cero y el primer


producto a insertar deseamos que tenga ese índice.

Borrar un producto del carrito

Debemos disponer de una función que nos permita eliminar un producto del carrito. En este
caso voy a crear una función que recibe el número de línea del producto dentro del carrito, que
corresponde con el índice de los arrays de productos que deseamos borrar. Podríamos recibir

Carrito de la compra en PHP: www.desarrolloweb.com/manuales/56/ 4


© Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorización.
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com

también el identificador del producto a borrar o incluso puede ser que nos sea útil crear un par
de funciones para borrar productos del carrito, una recibiendo la línea del carrito y otra
recibiendo el identificador del producto. Para este ejemplo me resulta más fácil recibir la línea
en la que está ese producto en el carrito.

function elimina_producto($linea){
$this->array_id_prod[$linea]=0;
}

Simplemente colocamos a cero el identificador de producto a borrar. No borramos


directamente las variables de sesión porque eso nos obligaría a recolocar todos los índices de
las variables de sesión para que fuesen correlativos. Este detalle tendremos que tenerlo en
cuenta a la hora de mostrar el carrito, pues si el identificador de producto es cero, se entiende
que el producto está eliminado del carrito.

Tampoco disminuimos en uno el número de productos, porque en realidad no estamos


eliminando un producto de la estructura de datos, sino que lo estoy marcando a cero para
saber que no hay nada que contabilizar en ese caso.

En el siguiente capítulo veremos la implementación del método más complicado del carrito,
que es el encargado de mostrar todos los productos que hay dentro.

Artículo por Miguel Angel Alvarez

Mostrar el carrito PHP


La última función de las que vamos a ver aquí sirve para mostrar todos los productos del
carrito. Tiene que hacer un simple bucle que recorra los arrays de productos, que se han ido
rellenando al meter productos en el carrito. Debe mostrar los datos de cada producto según se
recorre con el bucle. Además, debe proporcionar el importe total de la compra y un enlace
para quitar cualquier producto del carrito.

function imprime_carrito(){
$suma = 0;
echo '<table border=1 cellpadding="3">
<tr>
<td><b>Nombre producto</b></td>
<td><b>Precio</b></td>
<td> </td>
</tr>';
for ($i=0;$i<$this->num_productos;$i++){
if($this->array_id_prod[$i]!=0){
echo '<tr>';
echo "<td>" . $this->array_nombre_prod[$i] . "</td>";
echo "<td>" . $this->array_precio_prod[$i] . "</td>";
echo "<td><a href='eliminar_producto.php?linea=$i'>Eliminar producto</td>";
echo '</tr>';
$suma += $this->array_precio_prod[$i];
}
}
//muestro el total
echo "<tr><td><b>TOTAL:</b></td><td> <b>$suma</b></td><td> </td></tr>";
//total más IVA
echo "<tr><td><b>IVA (16%):</b></td><td> <b>" . $suma * 1.16 . "</b></td><td> </td></tr>";

Carrito de la compra en PHP: www.desarrolloweb.com/manuales/56/ 5


© Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorización.
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com

echo "</table>";
}

La función declara primero la variable suma donde se guardará la suma de importes de los
productos.

Se muestran todos los productos con un bucle que recorre las líneas del carrito, desde la
primera hasta el número de productos. En cada línea del carrito se muestran sus datos,
teniendo cuidado porque si el identificador del producto era cero quería decir que ese producto
había sido borrado del carrito. Además, acumulamos en la variable suma el importe de todos
los productos del carrito que no han sido borrados previamente.

Todavía dentro del bucle que recorre los productos del carrito, colocamos un enlace para que el
visitante pueda eliminar un producto. Hay que darse cuenta que el enlace para borrar un
producto indica como parámetro la línea del carrito que se debe borrar, que era lo que nosotros
necesitábamos en la función creada para borrar los productos.

Ya fuera del bucle, imprimimos el importe total con la suma de los importes de los productos
que hemos ido acumulando durante el bucle.

Código completo de la clase

Veamos a continuación cómo quedaría la clase carrito completa, para que no se nos pase
ningún detalle.

class carrito {
//atributos de la clase
var $num_productos;
var $array_id_prod;
var $array_nombre_prod;
var $array_precio_prod;

//constructor. Realiza las tareas de inicializar los objetos cuando se instancian


//inicializa el numero de productos a 0
function carrito () {
$this->num_productos=0;
}

//Introduce un producto en el carrito. Recibe los datos del producto


//Se encarga de introducir los datos en los arrays del objeto carrito
//luego aumenta en 1 el numero de productos
function introduce_producto($id_prod,$nombre_prod,$precio_prod){
$this->array_id_prod[$this->num_productos]=$id_prod;
$this->array_nombre_prod[$this->num_productos]=$nombre_prod;
$this->array_precio_prod[$this->num_productos]=$precio_prod;
$this->num_productos++;
}

//Muestra el contenido del carrito de la compra


//ademas pone los enlaces para eliminar un producto del carrito
function imprime_carrito(){
$suma = 0;
echo '<table border=1 cellpadding="3">
<tr>
<td><b>Nombre producto</b></td>
<td><b>Precio</b></td>
<td> </td>
</tr>';
for ($i=0;$i<$this->num_productos;$i++){
if($this->array_id_prod[$i]!=0){

Carrito de la compra en PHP: www.desarrolloweb.com/manuales/56/ 6


© Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorización.
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com

echo '<tr>';
echo "<td>" . $this->array_nombre_prod[$i] . "</td>";
echo "<td>" . $this->array_precio_prod[$i] . "</td>";
echo "<td><a href='eliminar_producto.php?linea=$i'>Eliminar producto</td>";
echo '</tr>';
$suma += $this->array_precio_prod[$i];
}
}
//muestro el total
echo "<tr><td><b>TOTAL:</b></td><td> <b>$suma</b></td><td> </td></tr>";
//total más IVA
echo "<tr><td><b>IVA (16%):</b></td><td> <b>" . $suma * 1.16 . "</b></td><td> </td></tr>";
echo "</table>";
}

//elimina un producto del carrito. recibe la linea del carrito que debe eliminar
//no lo elimina realmente, simplemente pone a cero el id, para saber que esta en estado retirado
function elimina_producto($linea){
$this->array_id_prod[$linea]=0;
}
}

Artículo por Miguel Angel Alvarez

Utilización de la clase carrito en PHP


Para ilustrar el funcionamiento de la clase carrito, vamos a realizar unas páginas donde
podremos utilizarla. Realmente son unas páginas sencillas, el trabajo duro ya se realizó al
crear el propio carrito.
index.php
La página de inicio muestra una lista de objetos para comprar. Esta lista está completamente
inventada sobre la marcha, pero en nuestros ejemplos lo lógico sería que la extrajéramos de
una base de datos.
<?
include("lib_carrito.php");
?>

<html>
<head>
<title>Trabajando con el carrito</title>
</head>

<body>

<a href="mete_producto.php?id=12&nombre=silla+modelo+jupiter&precio=80">Silla modelo jupiter 80 euros</a>


<br>
<br>
<a href="mete_producto.php?id=16&nombre=mesa+camilla+oferta&precio=29">Mesa camilla en oferta 29
euros</a>
<br>
<br>
<a href="mete_producto.php?id=18&nombre=Silla+oficina&precio=102">Silla oficina 102 euros</a>
<br>
<br>
<a href="mete_producto.php?id=98&nombre=Aparador+cocina+blanco&precio=200">Aparador cocina blanco 200
euros</a>
<br>

Carrito de la compra en PHP: www.desarrolloweb.com/manuales/56/ 7


© Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorización.
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com

<br>
<br>
- <a href="ver_carrito.php">Ver carrito</a>
</body>
</html>

mete_producto.php

Esta página introduce el un producto en el carrito de la compra. Recibe los datos del producto
a introducir por la URL. Lo que hace es llamar al método introduce_producto(), pasando los
datos del producto, que se reciben por GET.

<?
include("lib_carrito.php");
$_SESSION["ocarrito"]->introduce_producto($_GET["id"], $_GET["nombre"], $_GET["precio"]);
?>
<html>
<head>
<title>Introduce Producto</title>
</head>
<body>

Producto introducido.
<br>
<br>
<a href="index.php">- Volver</a>
<br>
<br>
<a href="ver_carrito.php">- Ver carrito</a>

</body>
</html>

ver_carrito.php

La página que muestra el carrito es básicamente una llamada al método de la clase carrito que
se encarga de mostrar el contenido del carro de la compra y la suma de los precios de los
productos.

<?
include("lib_carrito.php");
?>

<html>
<head>
<title>Introduce Producto</title>
</head>

<body>

<?
$_SESSION["ocarrito"]->imprime_carrito();
?>
<br>
<br>
<a href="index.php">Volver</a>

</body>
</html>

eliminar_producto.php

Carrito de la compra en PHP: www.desarrolloweb.com/manuales/56/ 8


© Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorización.
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com

Esta página recibe por GET el índice del producto que se desea borrar. Con el índice, se llama
al método elimina_producto, que se encarga de marcar como eliminado el producto del carro.

<?
include("lib_carrito.php");
$_SESSION["ocarrito"]->elimina_producto($_GET["linea"]);
?>

<html>
<head>
<title>Introduce Producto</title>
</head>

<body>

Producto eliminado.
<br>
<br>
<br>
<a href="index.php">- Volver</a>
<br>
<br>
<a href="ver_carrito.php">- Ver carrito</a>

</body>
</html>

Artículo por Miguel Angel Alvarez

Carrito de la compra en PHP: www.desarrolloweb.com/manuales/56/ 9


© Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorización.

You might also like