A ver, yo hago esto con una clase en lugar de utilizar arrays y lo agrego de otra forma, te paso un ejemplo que simplificará mucho tu trabjo
Creas un archivo por ejemplo llamado carrito.class.php y metes este código que después puedes tratar como tu quieras. Si te fijas en este archivo creamos dos clases, una los datos del producto que será donde almacenemos los datos de cada producto en varibles y otra llamada obj_carrito que será la que nos de las funcionalidades del carrito y el array donde se guardará cada dato del producto.
Esta ultima clase tiene cuatro funciones que puedes modificar o añadir más para llamarlas de forma sencilla:
find_prod() a la que le pasamos el id del producto que buscamos y nos devuelve si el producto está ya en el carrito o no.
add_changue_prod() a la que le pasamos todos los datos del producto para que guarde uno nuevo o sencillamente cambia la cantidad a un producto, es importante que siempre habrá que pasarle como mínimo la $id y la $cantidad.
del_prod() a la que le pasaremos el $numArt, número del articulo que coincidirá con la clave del array para eliminarlo del carrito con facilidad.
total_kart() que nos devolverá el total del carrito con dos decimales y separandolos por un punto no por una coma.
Código PHP:
class datos_producto {
public $numArt;
public $id;
public $nombre;
public $precio;
public $cantidad;
public $foto;
}
class obj_carrito {
public $productos = array();
/* ESTA FUNCION TE DICE SI EL ARTÍCULO ESTÁ EN LA BASE DE DATOS */
function find_prod($id){
$productos = $this->productos;
$exist = false;
foreach($productos as $key => $producto){
if($id == $producto->id){
$exist = true;
}
}
return $exist;
}
/* ESTA FUNCIÓN AÑADE ARTÍCULOS O CAMBIA CANTIDADES AL ARTÍCULO */
function add_changue_prod($id,$nombre,$precio,$cantidad,$foto){
$productos = $this->productos;
$poner = true;
foreach($productos as $key => $producto){
if($id == $producto->id){
$poner = false;
if(!$cantidad){
$producto->cantidad++;
}else{
$producto->cantidad = $cantidad;
}
}
}
if($poner){
if(!$cantidad){
$cantidad = 1;
}
$A = $key + 1;
$this->productos[$A] = new datos_producto();
$this->productos[$A]->numArt = $A;
$this->productos[$A]->id = $id;
$this->productos[$A]->nombre = $nombre ;
$this->productos[$A]->precio = $precio ;
$this->productos[$A]->cantidad = $cantidad;
$this->productos[$A]->foto = $foto ;
}
}
/* ESTA FUNCIÓN ELIMINA ARTÍCULOS DEL CARRITO */
function del_prod($numArt){
unset($this->productos [$numArt]);
}
/* ESTA FUNCIÓN TE SACA LA CANTIDAD TOTAL DEL CARRITO */
function total_kart(){
$productos = $this->productos;
$total = 0;
foreach($productos as $producto){
$total = $total + ($producto->precio * $producto->cantidad);
}
return number_format($total,2,'.','');
}
}
Una vez tienes este archivo, añadir o restar productos a tu cesta de la compra es muy sencillo gracias a la programación orientada a objetos. Con este sencillo código tienes todo lo que escribiste antes en todo el código del post que escribiste en tu consulta.
Ten en cuenta que ya no necesitas usar la variable de sesión para todo, tan solo para guardar la clase $obj_kart y extraerla cuando lo necesites, esto te da la ventaja de que trabajas de forma mucho más sencilla con la vriable $obj_kart que tiene todo lo necesario para manejar el carrito de la compra de una forma mucho más intuitiva.
Código PHP:
<?php session_start();
/* INCLUIMOS LA CLASE DEL PEDIDO Y LA CONEXIÓN A LA BD */
require_once("./carrito.class.php");
require_once('./conexion.php');
/* COGEMOS LOS DATOS POR GET */
$id = $_GET['id'];
$cantidad = $_GET['cantidad'];
$ruta = $_GET['ruta'];
/* SI NO HAY SESION DE CARRITO CREAMOS UN OBEJTO NUEVO SI LO HAY, UNSERIALIZASMOS EN LA VARIABLE EN OBJETO CARRITO */
if(!$_SESSION['carrito']){
$obj_kart = new obj_carrito();
}else{
$obj_kart = unserialize($_SESSION['carrito']);
}
/* PREGUTAMOS SI EL ARTÍCULO ESTÁ EN EL CARRITO */
if($obj_kart->find_prod($id)){
/* SI ESTÁ, SE AÑADE LA CANTIDAD SIN NECESIDAD DE HACER LA CONSULTA */
$obj_kart->add_changue_prod($id,"","",$cantidad,"");
}else{
/* PREGUNTAMOS LOS DATOS DEL PRODUCTO A LA BASE DE DATOS */
$query =mysql_query("SELECT id, texto, precio, foto FROM ".$ruta." WHERE id='".$id."'")or die(mysql_error());
$fetch = mysql_fetch_array($query);
/* AÑADIMOS EL PRODUCTO NUEVO PUESTO QUE SABEMOS QUE NO ESTÁ EN EL CARRITO */
$obj_kart->add_changue_prod($id, $fetch['texto'],$fetch['precio'],$cantidad,$fetch['foto']);
}
/* GUARDAMOS EN LA VARIABLE DE SESSIÓN EL OBJETO DEL CARRITO SERIALIZADO */
$_SESSION['carrito'] = serialize($obj_kart);
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8"/>
<title>Carrito de Compras</title>
<link rel="stylesheet" type="text/css" href="./css/estilos.css">
<script type="text/javascript" src="../../../xampp/htdocs/php/jquery.js"></script>
<script type="text/javascript" src="./js/scripts.js"></script>
</head>
<body>
<header>
<img src="./imagenes/logo.png" id="logo">
<a href="./carritodecompras.php" title="ver carrito de compras">
<img src="./imagenes/carrito.png">
</a>
</header>
<section>
<?php
/* COMPRUEBO QUE EL TOTAL SEA MAYOR A CERO, ESO SIGNIFICA QUE HAY PRODUCTOS EN LA CESTA */
if($obj_kart->total_kart() > 0){
/* IMPRIMIMOS CADA PRODCUTO */
foreach($obj_kart->productos as $producto){
echo '
<div class="producto">
<center>
<img src="'.$producto->foto.'"><br>
<span>'.$producto->nombre.'</span><br>
<span>Precio: '.$producto->precio.'</span><br>
<span>Cantidad:
<input type="text" value="'.$producto->cantidad.'" data-precio="'.$producto->precio.'" data-id="'.$producto->id.'" class="cantidad">
</span><br>
<span class="subtotal">Subtotal:'.$producto->precio * $producto->cantidad.'</span><br>
<a href="#" class="eliminar" data-id="'.$producto->id.'">Eliminar</a>
</center>
</div>
';
}
/* IMPRIMIMOS EL TOTAL Y EL FORMULARIO DE PAYPAL */
echo '
<center><h2 id="total">Total: '.$obj_kart->total_kart().'</h2></center>
<form action="https://www.paypal.com/cgi-bin/webscr" method="post" id="formulario">
<input type="hidden" name="cmd" value="_cart">
<input type="hidden" name="upload" value="1">
<input type="hidden" name="business" value="[email protected]">
<input type="hidden" name="currency_code" value="MXN">
';
/* IMPRIMIMOS LOS PRODUCTOS EN EL FORMULARIO DE PAYPAL */
foreach($obj_kart->productos as $K => $producto){
echo '
<input type="hidden" name="item_name_'.$K.'" value="'.$producto->nombre.'">
<input type="hidden" name="amount_'.$K.'>" value="'.$producto->precio.'">
<input type="hidden" name="quantity_'.$K.'>" value="'.$producto->cantidad.'">
';
}
/* IMPRIMIMOS EL BOTÓN DE SUBMIT DEL FORMULARIO */
echo '
<center><input type="submit" value="comprar" class="aceptar" style="width:200px"></center>
</form>
';
}else{
/* SI NO HAY PRODUCTO IMPRIMIMOS QUE NO HAY PRODUCTOS Y EL TOTAL DEL CARRO QUE NOS DARÁ CERO */
echo '
<center><h2>No has añadido ningun producto</h2></center>
<center><h2 id="total">Total: '.$obj_kart->total_kart().'</h2></center>
';
}
?>
<center><a href="./">Ver catalogo</a></center>
</section>
</body>
</html>
Espero que te haya servido de ayuda, no lo he probado porque lo he escrito en el foro en un momento, pero a no ser que tenga algún error de sintaxis leve este código debería funcionarte para poder hacer lo mismo que estabas haciendo antes con un código mucho más complejo. Y seguro que no te da el error de guardar el primer artículo.
Por otro lado, yo soy partidario de guardar la cesta de la compra en la base de datos y en una cookie en lugar de una variable de sesión, pero esto es algo que va al gusto. So entiendes mucho de programación orientada a objetos te aconsejo que antes de seguir programando nada, aprendas a manejar esta útiles clases en PHP y Javascript, cuando te des cuenta de lo útiles que son, tu programación cambiará radicalmente y todo te resultará mucho mas sencillo de programar y de actualizar en un futuro.
Un saludo, espero que te sirva.