Script

PHP 7.3
Daniel Formigo -

PHP - Carro de compra
PHP - Cómo hacer un Carro de compra sencillo

Script para hacer un carrito de compras sencillo con PHP y MySQL. Se puede adaptar a cualquier tienda online. Perfecto para principiantes. No se trata de descargar archivos y copiar/pegar el código, sino de rompernos un poquito la cabeza.

Empezamos definiendo los archivos que necesitamos: página de productos (minis.php), página del carrito de compra (vercarrito.php), página para añadir al carrito (agregacar.php), página para quitar del carro (borracar.php) y página del formulario de pedido (pedido.php).

minis.php

En esta página tenemos los productos con un botón para añadir al carro y, si ya está añadido, mostramos el botón de quitar del carro:

CÓDIGO minis.php

<?php
//Creamos sesión y una conexión con la base de datos.
ob_start("ob_gzhandler");
session_start();
require_once(
'connect.php');
$conn = new mysqli($hostname_conn$username_conn$password_conn$database_conn);
$conn->set_charset("utf8");
//Comprobamos que la variable $carro tenga valor.
if(isset($_SESSION['carro']))
$carro=$_SESSION['carro'];else $carro=false;
//Hacemos la consulta a la base de datos para mostrar los productos
$sql=$conn->query("SELECT * FROM productos WHERE tipo='$a'"$conn) or
die(
"Query error: "$mysqli->error);
...
<!
DOCTYPE html PUBLIC ...
...
while (
$row $sql->fetch_assoc();){
//Tenemos una miniatura del producto que al pinchar iremos a
//maxis.php para ver más detalles de dicho producto.
<div id="enlacemini2"><a href="maxis.php"><img src="img/obras/mini/
<?php echo 
$row['imagenproducto']?>.jpg"/></a>
<
h6>producto1.jpg</h6></div>

if(!
$carro || !isset($carro[md5($row['id'])]['identificador']) || 
$carro[md5($row['id'])]['identificador']!=md5($row['id'])){ 
//si el producto no ha sido agregado, mostramos la imagen del
//botón AÑADIR AL CARRITO linkeada a nuestra pagina de agregacar.php
//y transmitiéndole a dicha página el id del artículo y
//el identificador de la sesión.
<p><a href="agregacar.php?<?php echo SID ?>&id=<?php echo $row['id']?>">
AÑADIR AL CARRITO</a></p>
} else {
//en caso contrario mostramos la otra imagen del
//botón AÑADIR AL CARRITO linkeada a la página 
//que sirve para borrar el artículo del carro: borrarcar.php.
<p><a href="borracar.php?<?php echo SID ?>&id=<?php echo $row['id']?>">
<
span class="txtrojo">X</spanQUITAR DEL CARRITO</a></p>
}
}
//Fin del while
...
//Al final del archivo liberamos recursos
$_pagi_result->free();
$conn->close();
ob_end_flush();
?>
                

agregacar.php

En esta página introducimos el nuevo producto en la matriz $carro, utilizando como índice el id del producto en cuestión, encriptado con md5. Al final enviamos el producto a vercarrito.php para actualizar la cesta y mostrarla:

CÓDIGO agregacar.php

<?php 
session_start
();
error_reporting(E_ALL);
@
ini_set('display_errors''1');
//con session_start() creamos la sesión si no existe o la retomamos si ya ha
//sido creada
extract($_REQUEST);
//la función extract toma las claves de una matriz asoiativa y las convierte 
//en nombres de variable, asignándoles a esas variables valores iguales a los 
//que tenía asociados en la matriz. Es decir, convierte a $_GET['id'] en $id,
//sin que tengamos que tomarnos el trabajo de escribir $id=$_GET['ID']; 
require_once('connect.php');
$conn = new mysqli($hostname_conn$username_conn$password_conn$database_conn);
$conn->set_charset("utf8");
//incluímos la conexión a nuestra base de datos
if(!isset($cantidad)){$cantidad=1;}
//Como también vamos a usar este archivo para actualizar las cantidades,
//hacemos que cuando la misma no esté indicada sea igual a 1
$qry=$conn->query("SELECT * FROM arteMadera WHERE id='".$id."'");
$row $qry->fetch_array();
//Si ya hemos introducido algún producto en el carro lo tendremos guardado 
//temporalmente en el array superglobal $_SESSION['carro'], de manera que 
//rescatamos los valores de dicho array y se los asignamos a la variable $carro, 
//previa comprobación con isset de que $_SESSION['carro'] ya haya sido definida
if(isset($_SESSION['carro']))
$carro=$_SESSION['carro'];
//Ahora introducimos el nuevo producto en la matriz $carro, utilizando como índice
// el id del producto en cuestión, encriptado con md5. Utilizamos md5 porque genera 
//un valor alfanumérico que luego, cuando busquemos un producto en particular dentro 
//de la matriz, no podrá ser confundido con la posición que ocupa dentro de dicha 
//matriz, como podría ocurrir si fuera sólo numérico. Cabe aclarar que si el producto
//ya había sido agregado antes, los nuevos valores que le asignemos reemplazarán
//a los viejos. 
//Al mismo tiempo, y no porque sea estrictamente necesario sino a modo de ejemplo, 
//guardamos más de un valor en la variable $carro, valiéndonos de nuevo de la 
//herramienta array.
$carro[md5($id)]=array('identificador'=>md5($id),'cantidad'=>$cantidad,'id'=>$id,
'imagen'=>$row['imagen'],'titulo'=>$row['titulo'],'precio'=>$row['precio'],
'tipo'=>$row['tipo']);
//Ahora dentro de la sesión ($_SESSION['carro']) tenemos sólo los valores que teníamos
// (si es que teníamos alguno) antes de ingresar a esta página y en la variable $carro
//tenemos esos mismos valores más el que acabamos de sumar. De manera que 
//tenemos que actualizar (reemplazar) la variable de sesión por la variable $carro.
$_SESSION['carro']=$carro;
//Y volvemos a nuestro catálogo de artículos. La cadena SID representa al
//identificador de la sesión, que, dependiendo  de la configuración del servidor
//y de si el usuario tiene o no activadas las cookies puede no ser necesario
//pasarla por la url. Pero para que nuestro carro funcione, independientemente
//de esos factores, conviene escribirla siempre.
header("Location:vercarrito.php?".SID."&id=".$id."&precio=".$precio);
?>

borracar.php

En esta página la función unset borra el elemento del array que le pasemos por parámetro. En este caso la usamos para borrar el elemento cuyo id le pasemos a la página por la url. Al final enviamos el producto a vercarrito.php para actualizar la cesta y mostrarla:

CÓDIGO borracar.php

<?php
session_start
();
error_reporting(E_ALL);
@
ini_set('display_errors''1');
//con session_start() creamos la sesión si no existe o la retomamos si ya
//ha sido creada.
extract($_REQUEST);
//Como antes, usamos extract() por comodidad, pero podemos no hacerlo
//tranquilamente.
$carro=$_SESSION['carro'];
//Asignamos a la variable $carro los valores guardados en la sessión
unset($carro[md5($id)]);
//la función unset borra el elemento de un array que le pasemos por parámetro.
//En este caso la usamos para borrar el elemento cuyo id le pasemos a la
//página por la url.
$_SESSION['carro']=$carro;
//Finalmente, actualizamos la sessión, como hicimos cuando agregamos un
//producto y volvemos al catálogo.
header("Location:vercarrito.php?".SID."&id=".$id."&precio=".$precio);
?>

vercarrito.php

En esta página mostramos los productos en una tabla con la posibilidad de borrarlos, continuar compra o finalizar el pedido:

CÓDIGO vercarrito.php

<?php
//Creamos sesión y una conexión con la base de datos.
ob_start("ob_gzhandler");
session_start();
require_once(
'connect.php');
$conn = new mysqli($hostname_conn$username_conn$password_conn$database_conn);
$conn->set_charset("utf8");
//Comprobamos que la variable $carro tenga valor.
if(isset($_SESSION['carro']))
$carro=$_SESSION['carro'];else $carro=false;
//Hacemos la consulta a la base de datos para mostrar los productos
$sql=$conn->query("SELECT * FROM productos WHERE id='$id'"$conn) or
die(
"Query error: "$mysqli->error);
...
<!
DOCTYPE html PUBLIC ...
...
 <?
php if($carro){ // Si $carro tiene algo lo muestra en la tabla. ?>
<table>
    <tr>
      <td width="9%">CÓDIGO</td>
      <td width="14%">IMAGEN</td>
      <td width="48%">T&Iacute;TULO</td>
      <td width="19%">PRECIO</td>
      <td width="10%">BORRAR</td>
    </tr>
<?php $color=array("#666666","#777777");
$contador=0;
$suma=0;
foreach(
$carro as $k => $v){
       
$row $sql->fetch_assoc();
       
$subto=$v['cantidad']*$v['precio'];
       
$suma=$suma+$subto;
       
$contador++; ?>
<form name="a<?php echo $v['identificador'?>" method="post" action="
agregacar.php?<?php echo SID ?>&id=<?php echo $row['id']?>"
id="a<?php echo $v['identificador'?>">
    <tr bgcolor="<?php echo $color[$contador%2]; ?>">
      <td>
        <?php //cogemos como código el nombre de la imagen menos el .jpg.
        
$codigoImagen substr($v['imagenproducto'],0,-4);
        echo 
$codigoImagen  ?>
      </td>
      <td>
          <?php //ponemos la miniatura del producto con link a su detalle. ?>
        <a href="detalle-producto.php?<?php echo SID ?>&id=<?php echo $v['id']?>">
        <img src="img/obras/mini/<?php echo $v['imagenproducto'?>"/></a>
      </td>
      <td>
        <?php ////ponemos el título del producto con link a su detalle. ?>
        <a href="detalle-producto.php?<?php echo SID ?>&id=<?php echo
        
$v['id']?>"><?php echo $v['tituloproducto'?></a>
      </td>
      <td>
      <?php //ponemos el precio del producto. ?>
      <?php echo $v['precio'?> €<br />
      </td>
      <td><a href="borracar.php?<?php echo SID ?>&id=<?php echo $v['id'?>
      &precio=<?php echo $precio ?>"><img src="img/btBorrar.gif" alt="Borrar
       obra de pedido" width="20" height="20" /></a><a href="borracar.php?<?php echo
       
SID ?>&id=<?php echo $v['id'?>&precio=<?php echo $precio ?>"></a>
      </td>
     </tr></form>
     <tr>
<?php //fin foreach ?>
      <td colspan="5"><p>TOTAL  PRODUCTOS:
      <?php echo count($carro); ?><br />
      TOTAL PRECIO: <?php echo number_format($suma,2); ?> &euro;</p></td>
    </tr>
</table>
<div id="boton"><a href="index.php?<?php echo SID?>">CONTINUAR COMPRA</a></div>
<div id="boton"><a href="pedido.php?<?php echo SID?>&precio=<?php echo $precio ?>">FINALIZAR COMPRA</a></div>
<?php }else{ // // Si $carro NO tiene nada solo muestra un link a index.php.?>
<p>El carrito de compra está vacío.</p>
<div id="boton"><a href="index.php<?php echo SID?>">CONTINUAR COMPRA</a></div>
<?php }?>
<?php 
//Al final del archivo liberamos recursos
$sql->free();
$conn->close();
ob_end_flush(); ?>

pedido.php

En esta página mostramos los productos igual que en vercarrito.php y tenemos un formulario para recoger los datos del usuario así como las matrices con los códigos y cantidades de los productos del carrito.

CÓDIGO pedido.php

<?php
//Creamos sesión y una conexión con la base de datos.
ob_start("ob_gzhandler");
session_start();
require_once(
'connect.php');
$conn = new mysqli($hostname_conn$username_conn$password_conn$database_conn);
$conn->set_charset("utf8");
error_reporting(E_ALL);
@
ini_set('display_errors''1');
extract($_REQUEST);
//Comprobamos que la variable $carro tenga valor.
if(isset($_SESSION['carro']))
$carro=$_SESSION['carro'];else $carro=false;
...
<!
DOCTYPE html PUBLIC ...
...
<
h1>carrito de compra</h1>
<
form class="formPedido" id="formPedido" name="formPedido" method="post" 
action="pedidoEnviarScript.php">
<
table>
    <
tr>
        <
td width="9%">CÓDIGO</td>
        <
td width="14%">IMAGEN</td>
        <
td width="58%">T&Iacute;TULO</td>
        <
td width="19%">PRECIO</td>
    </
tr>
<?
php
$color
=array("#666666","#777777");
$contador=0;
$suma=0;
foreach(
$carro as $k => $v){
    
$subto=$v['cantidad']*$v['precio'];
    
$suma=$suma+$subto;
    
$contador++;
?>
    <tr bgcolor="<?php echo $color[$contador%2]; ?>">
        <td><?php
//cogemos como código el nombre de la imagen menos el .jpg
$codigoImagen substr($v['imagenproducto'],0,-4);
echo 
$codigoImagen ?></td>
        <td><img src="img/obras/mini/<?php echo $v['imagenproducto'?>
        height="40" /></td>
        <td><?php echo $v['titulo'?></td>
        <td><?php echo $v['precio'?> €</td>
    </tr>
    <tr>
<?php 
$codigos
[]= $codigoImagen;
$cantidades[]= $v['cantidad'];       
$cantidadTotalProdarray_sum($cantidades);
}
?>
        <td colspan="5"><p>TOTAL  OBRAS:
<?php echo count($carro); ?><br />
TOTAL PRECIO:<?php echo number_format($suma,2); ?> &euro;</p>
        </td>
    </tr>
</table>
<h2>Datos personales de entrega</h2>
<p><h3>Nombre</h3>
<input name="nombre" type="text" id="nombre"/></p>
<p><h3>Apellidos</h3>
<input name="apellidos" type="text" id="apellidos"/></p>
<p><h3>Teléfono</h3>
<input name="telefono" type="text" id="telefono" /></p>
<p><h3>N.I.F.:</h3>
<input name="nif" type="text" id="nif" size="15" /></p>
<p><h3>e-mail</h3>
<input name="email" type="text" id="email" /></p>
<h2>Dirección de envío de la/s obra/s</h2>              
<p><h3>Dirección</h3>
<input name="direccion" type="text" id="direccion" /></p>
<p><h3>Población</h3>
<input name="poblacion" type="text" id="poblacion" /></p>
<p><h3>Provincia</h3>
<input name="provincia" type="text" id="provincia" /></p>
<p><h3>C.P.</h3>
<input name="cp" type="text" id="cp" /></p>
<p><h3>País</h3>
<input name="pais" type="text" id="pais" /></p>
<p><h3>Observaciones</h3>
<textarea name="observaciones" cols="43" rows="5" wrap="virtual" 
id="observaciones"></textarea></p>
<p> 
<input id="enviar" name="enviar" type="image" src="img/btEnviarPedido.jpg" 
alt="ENVIAR EL PEDIDO DE PRODUCTOS" width="225" height="30" border="0"/>
</p>
</form>
<?php //Al final del archivo liberamos recursos
$conn->close();
?>


Compartir