Foros del Web » Programando para Internet » PHP »

Carrito de compra

Estas en el tema de Carrito de compra en el foro de PHP en Foros del Web. Buenas noches, llevo con este proyecto personal un tiempo y me ha surgido este "fallo". La primera que le das a un producto no actúa ...
  #1 (permalink)  
Antiguo 18/07/2015, 18:11
 
Fecha de Ingreso: julio-2014
Ubicación: España
Mensajes: 83
Antigüedad: 10 años, 3 meses
Puntos: 2
Carrito de compra

Buenas noches, llevo con este proyecto personal un tiempo y me ha surgido este "fallo". La primera que le das a un producto no actúa bien y no se el motivo, el resto de los productos que añadas si lo hace bien.

Adjunto aqui la foto:



Aqui adjunto el código que tengo, si me lo pueden corregir en cuanto a fallos y explicarme el porque lo agradecería:

Código PHP:
<?php
    $id
=$_GET['id'];
    
$ruta=$_GET['ruta'];
//isset — Determina si una variable está definida y no es NULL
    //Inicio sesión a la base de datos incluyendo el archivo de conexión.php
    
session_start();
    include 
'./conexion.php';
    
//Si hay sesión establecida con la base de datos...
    
if(isset($_SESSION['carrito'])){
        
//Compruebo si hemos recogido por método $_GET el id del objeto
        
if(isset($_GET['id'])){
            
//Paso la estancia de sesión a la variable $arreglo para poder trabajar con una local
                    
$arreglo=$_SESSION['carrito'];
                    
//Inicio encontró a false porque por ahora no ha encontrado objeto ni hay búsqueda de objetos
                    
$encontro=false;
                    
//Inicio la variable en 0 para que se puedan añadir las cantidad de cada objeto
                    
$numero=0;
                    
//Con este for recorremos todos los elementos de la sesión "Carrito"
                    
for($i=0;$i<count($arreglo);$i++){
                        
//Si el id obtenido por $_GET es igual al obtenido en el for, entonces lo guardamos
                        
if($arreglo[$i]['Id']==$_GET['id']){
                            
//Si encuentro el objeto por el ID cambio $encontro a true
                            
$encontro=true;
                            
//Metemos el ID en número para después unirlo a la cantidad de ese elemento
                            
$numero=$i;
                        }
                    }
                    if(
$encontro==true){
                        
//Después de enconrar el elemento por ID, añadimos +1 a la cantidad que haya.
                        
$arreglo[$numero]['Cantidad']++;
                        
//Introducimos la cantidad junto al ID en la variable de sesión.
                        
$_SESSION['carrito']=$arreglo;
                        
                    }else{
//Si no encuentra el objeto...establezco las variables principales del objeto en null
                        
$nombre="";
                        
$precio=0;
                        
$imagen="";
                        
//Desde aqui, proceso a buscar toda la información de los objetos a través de sus ID
                        
$re=mysql_query("select * from ".$ruta." where id='".$id."'")or die(mysql_error());
                        while (
$f=mysql_fetch_array($re)) {
                            
//Mientras encuentre el objeto en cuestión voy añadiendo la información restante del objeto.
                            
$id=$f['id'];
                            
$precio=$f['precio'];
                            
$foto=$f['foto'];
                            
$nombre=$f['texto'];
                        }
                        
//Establezco un array para ir "uniendo" lo recogido a su nombre de uso en el array
                        
$datosNuevos=array('Id'=>$_GET['id'],
                                        
'id'=>$id,
                                        
'Precio'=>$precio,
                                        
'foto'=>$foto,
                                        
'nombre'=>$nombre,
                                        
'Cantidad'=>1);
                        
                        
//array_push — Inserta uno o más elementos al final de un array
                        //Añado todo lo recogido en el array variable local '$arreglo' establecida para la conexión
                        
array_push($arreglo$datosNuevos);
                        
//Meto todo lo añadido en $arreglo a la sesión de la bd global
                        
$_SESSION['carrito']=$arreglo;
                    }
        }
    
//En el caso de no haber encontrado sesión establecida...
    
}else{
        
//Compruebo si hay algun tipo de ID recogido por método $_GET
        
if(isset($_GET['id'])){//Establezco todas las variables en NULL del objeto en cuestión
                
$id=$f['id'];
                
$precio=$f['precio'];
                
$foto=$f['foto'];
                
$nombre=$f['texto'];
            
//Hago una búsqueda de todo lo relacionado con ese objeto a través de su ID
            
$re=mysql_query("select * from ".$ruta." where id='".$id."'")or die(mysql_error());
            while (
$f=mysql_fetch_array($re)) {
                
//Mientras encuentre resultados en la búsqueda los voy añadiendo en sus respectivas variables
                
$id=$f['id'];
                
$precio=$f['precio'];
                
$foto=$f['foto'];
                
$nombre=$f['texto'];
            }
            
//Establezco el nombre local a la variable que tiene los datos para poder acceder a ellos desde el array
            
$arreglo[]=array('Id'=>$_GET['id'],
                            
'id'=>$id,
                            
'Precio'=>$precio,
                            
'foto'=>$foto,
                            
'nombre'=>$nombre,
                            
'Cantidad'=>1);
            
//Añado toda la información del array $arreglo en la sesión establecida a la bd
            
$_SESSION['carrito']=$arreglo;
        }
    }
?>
<!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
            
//Establezco la cantidad de objetos a null
            
$total=0;
            
//Compruebo que haya conexión a la bd y la guardo en "$datos" para poder trabajar con una variable local
            
if(isset($_SESSION['carrito']))
            {
                
$datos=$_SESSION['carrito'];
                
                
$total=0;
                
//Recorro todos los objetos añadidos con anterioridad para imprimirlos con un estilo determinado en pantalla
                //Al tenerlos añadidos con un nombre en el array anteriomente y al haberlo añadido al igual en la bd
                //Recorro cada objeto con su nombre para sacar la información determinada en cada momento
                //$datos[$i]['nombre-en-el-array']
                
for($i=0;$i<count($datos);$i++)
                {        
        
?>
                    <div class="producto">
                        <center>
                            <img src="<?php echo $datos[$i]['foto'];?>"><br>
                            <span ><?php echo $datos[$i]['nombre'];?></span><br>
                            <span>Precio: <?php echo $datos[$i]['Precio'];?></span><br>
                            <span>Cantidad: 
                                <input type="text" value="<?php echo $datos[$i]['Cantidad'];?>"
                                data-precio="<?php echo $datos[$i]['Precio'];?>"
                                data-id="<?php echo $datos[$i]['Id'];?>"
                                class="cantidad">
                            </span><br>
                            <span class="subtotal">Subtotal:<?php echo $datos[$i]['Cantidad']*$datos[$i]['Precio'];?></span><br>
                            <a href="#" class="eliminar" data-id="<?php echo $datos[$i]['Id']?>">Eliminar</a>
                        </center>
                    </div>
                    <?php
                        
//En esta ocasión voy haciendo los cálculos de la cantidad final
                        
$total=($datos[$i]['Cantidad']*$datos[$i]['Precio'])+$total;
                }    
            }else
            {
                echo 
'<center><h2>No has añadido ningun producto</h2></center>';
            }
            echo 
'<center><h2 id="total">Total: '.$total.'</h2></center>';
            
//Compruebo que la cantidad TOTAL sea superior a 0 para proceder al pago por paypal
            
if($total>0)
            {
                    
?>
                <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">
                    <?php 
                        
//Hago un bucle para dejar todos los datos en una tabla en el pago a paypal
                        
for($i=0;$i<count($datos);$i++)
                        {
                    
?>
                        <input type="hidden" name="item_name_<?php echo $i+1;?>" value="<?php echo $datos[$i]['nombre'];?>">
                        <input type="hidden" name="amount_<?php echo $i+1;?>" value="<?php echo $datos[$i]['Precio'];?>">
                        <input    type="hidden" name="quantity_<?php echo $i+1;?>" value="<?php echo $datos[$i]['Cantidad'];?>">    
                    <?php 
                        
}
                    
?>
                    <center><input type="submit" value="comprar" class="aceptar" style="width:200px"></center>
                </form>
        <?php
            
}
        
?>
        <center><a href="./">Ver catalogo</a></center>
    </section>
</body>
</html>
El botón de eliminar por el momento no funciona.

Gracias por su ayuda :)
  #2 (permalink)  
Antiguo 19/07/2015, 14:43
 
Fecha de Ingreso: enero-2015
Ubicación: Cordoba, Andalucía
Mensajes: 111
Antigüedad: 9 años, 10 meses
Puntos: 15
Respuesta: Carrito de compra

Mirando por encima no se ve nada

pero te recomiendo que utilices print_r() a los arrays y vas investigando

seguro que tienes el fallo en un array en la posicion 0

Un saludo
  #3 (permalink)  
Antiguo 20/07/2015, 13:26
Avatar de manuparquegiralda  
Fecha de Ingreso: junio-2012
Ubicación: Barcelona
Mensajes: 241
Antigüedad: 12 años, 4 meses
Puntos: 39
Respuesta: Carrito de compra

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.
__________________
Diseño Web - Arisman Web

Última edición por manuparquegiralda; 20/07/2015 a las 15:41
  #4 (permalink)  
Antiguo 23/07/2015, 12:42
 
Fecha de Ingreso: julio-2014
Ubicación: España
Mensajes: 83
Antigüedad: 10 años, 3 meses
Puntos: 2
Respuesta: Carrito de compra

Me es un poco lioso al principio, he programado en JAVA durante unos años y tengo hecho algún videojuego en ese lenguaje...PHP me gusta menos, lo veo menos vistoso.

He visto un problema por tal y como lo tengo diseñado en la base de datos, y es que, si meto cualquier otro objeto de otra tabla, si tiene el mismo ID que uno de los que ya, solo aumenta la cantidad, no se añade el nuevo objeto.

Voy a ver si soy capaz de solucionarlo, Gracias por el código, 100% operativo :)

Última edición por yesod91; 23/07/2015 a las 14:21

Etiquetas: carrito, compra, formulario, html, select, sql, tabla, variable
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:34.