Carrito de la compra en PHP

  • Por
Planteamientos iniciales para la realización de un carrito de la compra sencillo en PHP. Almacenamiento del carrito en una variable de sesión.
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();
}


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

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

Matias

20/12/2004
Hola, estuve implementando el carrito en mi sitio y funciona muy bien.
Solo que para tener un completo carro de compras estaria muy bueno que se pudiera insertar los productos cargados en el carro en una base de datos.
Desde ya muy agradecido por el nivel del sitio.

Matias

Alberto

14/2/2005
Esta muy bueno gracias por la nota. Alguien sabe como hacer para que no se pongan duplicados en la lista sino que se aumente la cantidad de productos? Es decir, si compras dos veces el mismo producto se lista dos veces, estaria bueno que se ponga "cantidad: 2", no? Vyo a ver si puedo hacerlo pero no se mucho como para esto.

Cluster

21/4/2005
Los métodos empleados (en general y concretamente) como "imprime_carrito()" .. estaría mejor si devolviesen su salida ante su llamada (con un return $html por ejemplo concatenando su salida en esa variable) ..
Todo esto con el objetivo por ejemplo de generar un e-mail o un archivo .. etc.
De la forma que está si bien cumple su objetivo principal, complica y hace que hay que "rediseñar" ese método para hacer taréas de lo más comunes con el trabajo de un "carrito" como es esa misma: generar una orden de pedido mínimo por e-mail.

Un saludo,

Ricardo

16/6/2005
Sabes que desp de instalar el carrito, me agrega bien los articulos, pero al Ver carrito siempre, me trae product_num en 0 (cero).
Tengo otros sist con sessiones y andan bien pero , aca no modif nada y no me trae los datos almacenados.???

Diego Aldana

22/10/2005
Tengo un problema, cuando inserto un producto y le doy actualizar a la página se carga dos veces el mismo producto. He puesto todo en lib_carrito.php incluyendo el codigo que introduce el producto (mete_carrito.php).

Les agradecería si me pueden ayudar para que no se carge de nuevo el producto cada vez que se actualiza la web o el cliente va atrás y luego vuelve al carrito.

Muchas Gracias.

Ryan

15/4/2006
Que raro cluster criticando el trabajo de los demas, no cambia mas este muchacho.

Roberto Buil Artal

01/9/2006
Bueno como veo no soy el único que ha tenido verdaderos problemas para poder almacenar el carrito en una variable y así meterlo en la base de datos.
Pero gracias a esta URL que explica las clases http://www.desarrolloweb.com/articulos/1913.php
a mi amigo Sergi y a varias horas he creado una función que os puede servir a los novatos como yo.

//EN lib_carrito.php
//declaro 2 variables nuevas
var $codref;
var $suma;

//añado una función
function guarda_carrito(){
global $codref;
global $suma;

$suma = 0;
for ($i=0;$i<$this->num_productos;$i++){
if($this->array_id_prod[$i]!=0){
$this->codref.=$this->array_id_prod[$i] . "&nbsp;".$this->array_precio_prod[$i]. "<BR>";
$suma += $this->array_precio_prod[$i];

}
}
$this->suma=$suma*1.16;


}

//Y para finalizar las recupero desde mi página de confirma.php y las almaceno en variables para meter en la BD.

$_SESSION["ocarrito"]->guarda_carrito();
$pedido=$_SESSION["ocarrito"]->codref;
$total=$_SESSION["ocarrito"]->suma;

Espero que os sirva de algo.
Agradezco a los desarrolladores de esta web las explicaciones del código, e imagino que si no lo han dado completo es para evitar la comercialización con su herramienta. Pero aqui estamos los usuarios para ayudarnos entre todos.


Lugano

06/9/2006
Hola amigo, no podrías postear tu página confirma.php para estudiar como funciona completo, pués este código va bien pero no lleva a ningún form los datos seleccionados.

Gracias. se aprende y mucho.

Roberto Buil Artal

19/10/2006
Aqui esta todo lo q necesitas de confirmar.php

<?
$_SESSION["ocarrito"]->imprime_carritolateral();
?></td>
</tr>
</table>
<div align="center"><br>
<a href="ver_carrito.php"><img src="imagenes/vercarro.png" alt="Ver detalle Carrito" border="0"></a></div></td>
<td width="90%" valign="top" bgcolor="#FFFFCC">
<?
if($nom){
$_SESSION["ocarrito"]->guarda_carrito();
$pedido=$_SESSION["ocarrito"]->codref;
$total=$_SESSION["ocarrito"]->suma;


//Entrem les dades a la BD
require("fichero_config.php");

mysql_connect("localhost:3306",$usuari_bd,$clau_bd);

mysql_db_query($nom_bd,"insert into pedidos (compra, nom, apellidos, empresa, cargo, cif, telf, fax, movil, email, domicilio, poblacion, cp, provincia, pais,pedido,total)
values ('','$nom','$apellidos','$empresa','$cargo','$cif','$telf','$fax','$movil','$email','$domicilio','$poblacion','$cp','$provincia','$pais','$pedido',$total)");
echo '<br>
<table width="80%" border="0" align="center" cellpadding="3" cellspacing="3" class="borde">
<tr>
<td class="titulo"> <div align="justify">Su pedido ha sido registrado con &eacute;xito,
nuestro departamento comercial se pondr&aacute; en contacto con Ud. para confirmar los datos del pedido. <br>
Todos los envios son contrareembolso y no est&aacute;n incluidos los gastos de envio. </div></td>
</tr>
</table>';
//Buscamos el nº de la compra
$r=mysql_db_query($nom_bd,"select max(compra) as maxim from pedidos");
$f=mysql_fetch_object($r);
//Enviem el formulari
#Definimos el cuerpo del mensaje
$body ="<br>Nom: ".$nom." ".$apellidos."<br>Poblacion: ".$poblacion."<br>País: ".$pais."<br>Telf: ".$telf."<br>E-mail: ".$email."<br>Pedido:<br>".$pedido."<br><b>Total: ".$total."&euro;</b>&nbsp; No incluye Gastos de envio";
# HTML Version
$msg = "<html><body>".$body.$eol.$eol."</body></html>";

mail("usuario@dominio.com","Nuevo pedido nº ".$f->maxim." finalizado ".$nom." ".$apellidos,$msg,"From:$email "."MIME-Version: 1.0 " . "Content-type: text/html; charset=iso-8859-1");


//Borra los datos de sesión y vacia el carrito
session_destroy();
}else{
echo '
<form action="confirmar.php" method="post" name="rob"><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="titulo2">Confirmaci&oacute;n de Compra</span><br><br>
<table width="90%" border="0" align="center" cellpadding="2" cellspacing="0" bgcolor="#FFFFCC" class="carrito">
<tr>
<td width="13%" class="carrito">
<strong> Nombre
</strong>

<td width="37%" class="carrito"><input name="nom" type="text" id="nom">
<td width="15%" class="carrito"><strong>Apellidos
</strong>
<td width="35%" class="carrito"><input name="apellidos" type="text" id="apellidos"> </tr>
<tr>
<td class="carrito">Empresa
<td class="carrito"><input name="empresa" type="text" id="empresa">
<td class="carrito">Cargo
<td class="carrito"><input name="cargo" type="text" id="cargo"> </tr>
<tr>
<td class="carrito"><strong>CIF
</strong>
<td class="carrito"><input name="cif" type="text" id="cif">
<td class="carrito">FAX
<td class="carrito"><input name="fax" type="text" id="fax"> </tr>
<tr>
<td class="carrito"><strong>Tel&eacute;fono </strong>
<td class="carrito"><input name="telf" type="text" id="telf">
<td class="carrito">M&oacute;vil
<td class="carrito"><input name="movil" type="text" id="movil"> </tr>
<tr>
<td class="carrito"><strong>E-mail
</strong>
<td class="carrito"><input name="email" type="text" id="email">
<td class="carrito">Domicilio
<td class="carrito"><input name="domicilio" type="text" id="domicilio"> </tr>
<tr>
<td class="carrito">Poblaci&oacute;n
<td class="carrito"><input name="poblacion" type="text" id="poblacion">
<td class="carrito">CP
<td class="carrito"><input name="cp" type="text" id="cp"> </tr>
<tr>
<td height="28" class="carrito">Provicia
<td class="carrito"><input name="provincia" type="text" id="provincia">
<td class="carrito">Pais
<td class="carrito"><input name="pais" type="text" id="pais"> </tr>
</table>
<table width="30%" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td width="50%">
<div align="center">
<input type="button" name="Submit" value="Aceptar Pedido" onclick="javascript:verifica();">
</div>
</td>
<td width="50%"><div align="center">
<input name="reset" type="reset" id="reset" value="Restablecer">
</div></td>
</tr>
</table></form>';

}
?>

Víctor

22/2/2007
Es un excelente tutorial, me ayudo a crear mi carrito, gracias.

http://www.conceptoweb.cl

jacinto

11/5/2007
Hola, alguien que haya creado una mini tienda virtual o carrito de compra aria el favor de agregarme al correo para consultar unas cosas?

jcbtzr@hotmail.com

11/5/2007
Si no os importa no me entero de el codigo, de algunas cosas y kisiera mantener una xarla con alguiernq haya creado una tienda virtual.php

Alex

02/6/2007
Pues a mi no se me añaden los articulos, cunado le doy a mostrar carrito me muestra 0 producots y total 0.

He estado mirando pero no encuentro que es, lo unico que veo es que se es que mi carrito no se llena nunca,
echo "<p>" . $this->array_precio_prod[$i] . "</p>";
No imprime nada

Marga

17/2/2009
Me pareció muy bueno el manual...

Mi problema lo tengo cuando muestra el carrito, pues me muestra 0 productos y total...

Ojalá alguien pueda ayudar...

Chau

hkcristian

04/12/2009
variable carro de compra
estoy desarrollando mi carro de compras, pero aun no he podido agregar una variable de valor adicional en cuanto a las personas interesadaas en comprar mi producto y se encuentras en bogotá y las personas que estan fuera de bogota, debido a que los valores adicionales de envio son diferentes. hkcristian@gmail.com

paco

02/7/2010
problema con mi carrito
hola tengo un problema con mi carrito de compras lo que pasa es que agrega perfectamente los productos al carrito y todo y cuando termino la seleccion de mis productos y voy a otra pagina y me quiero regresar a mi carrito, este me lo muestra completamente vacio.... espero que me puedan ayudar con este problema.. gracias

dajacar2

04/12/2010
ayuda
hola amigos soy nuevo en php me gustaria saber como lo hago correr, ayudenme o denme un manual, dajacar@hotmail.com

laura

21/4/2011
carrito de compras
el ejemplo esta muy bueno me gusto mucho da facilidad de manipular datos afuera dejando de lado las bases de datos

Chester

02/9/2011
Pregunta
Hola, me gusto esto, pero una consulta, como harias para enviar un email cuando ya tienes el carrito listo? O sea...donde iria el boton enviar y el codigo php, para mandar el correo con lo que quiero comprar?

luismiguel9

21/11/2011
Increible que Facilidad.!!
Nunca me había dado cuenta de que tan simple estaba hecho este articulo.
Siempre buscaba y buscaba carrito y nunca encontraba algo que podia entender
Muy Buen Post.!!!

Lo mas interesante es que a toda una clase lo transforma en session !!!
Muy Buen Aporte

pol

10/12/2011
carrito
Tal com esta hecho el carrito solo puede tener un usuario por ordenador, ya que si inicias sesion con otro usuario sigue teniendo el mismo carrito. Alguien me puede ayudar con esto?
Gracias

kend

29/12/2011
pregunta importante
hola , estoy tratando de hacer un sistema de vetas en php en el que tenga alta, baja y cambio de productos , "lo cual ya yo tengo entendido"; pero tengo que desarrollar la pagina de ventas en donde se supone que tendre que seleccionar los productos de una lista y que me los ponga en el tiket que se tendrá que visualizar.

mi pregunta es k ¿si este tema de carrito de compras me puede servir de ejemplo para mi sistema de ventas?

Juanpa123

12/8/2014
Ayudad
Muy buen articulo pero no me funciona le metodo de guardar

MiguelSuarez

18/1/2016
Solucion problema general
Tened en cuenta que al inicio de cada archivo php no está declarado correctamente. <?php ...... ?>
También hay que poner un session_start(); debajo del include en cada uno de los php que vayan a manejar la sesion.

Un saludo.

fer

13/3/2016
12 años
Estimados este articulo tiene 12 años desde su publicación...
Muchas cosas ya no deben tener un funcionamiento optimo. saludos.

pedro

29/11/2016
tabla de cotizacion
Es posible hacer o desarrollar una tabla en php o js, que originalmente se hizo en excel, o mas claro recrear la misma tabla de excel en uno de esos lenguajes?
Tiene formulas y funciones en diferentes celdas, ademas de arrojar totales o calcular los valores inmediatamente

Tu pene

17/10/2017
Muy buen articulo
ahora ya entendí mas o menos como funciona el carrito de compras de una pagina web