Foros del Web » Programando para Internet » PHP »

Problema con cesta de la compra

Estas en el tema de Problema con cesta de la compra en el foro de PHP en Foros del Web. A ver si se explicarme o, en su defecto, si alguien me entiende: Estoy tratando de implementar un carro de la compra (con ayuda de ...
  #1 (permalink)  
Antiguo 04/09/2007, 12:41
 
Fecha de Ingreso: junio-2004
Mensajes: 232
Antigüedad: 19 años, 11 meses
Puntos: 0
Problema con cesta de la compra

A ver si se explicarme o, en su defecto, si alguien me entiende:

Estoy tratando de implementar un carro de la compra (con ayuda de alguna web y de algun usuario) pero no se por que cuando trato de introducir elementos en la cesta, no los introduce como debiera... La primera vez que meto un producto, no lo muestra al llamar al metodo imprime_carrito(); sin embargo, en la segunda ocasion en que meto el mismo producto, si lo muestra. Luego, si meto otro producto distinto, lo introduce pero dos veces.... En fin, lo mas raro del mundo. Evidentemente algo no esta bien pero no logro saber el que, asi que aqui os pongo el codigo para ver si alguno de vosotros da con la solucion:

Código PHP:
class carrito {
    
//atributos de la clase
    
var $indiceArray;
       var 
$num_productos;
    var 
$array_unidades_prod;
       var 
$array_id_prod;
       var 
$array_nombre_prod;
       var 
$array_precio_prod;
    var 
$array_borrado_prod;

    function 
__construct () {
    
//inicializamos el numero TOTAL de productos a 0
           
$this->num_productos=0;
    
//Esto va a llevar el indice del array de productos y se inicializa a 0
        
$this->indiceArray=0;
    }
    
    
//Introduce un producto en el carrito. Recibe los datos del producto
    
function introduce_producto($id$nombre$precio$unidades){
        
//verificamos si no hay productos registrados..
       
if($this->num_productos<=0)
            {
            
//registramos el producto
            
$this->array_id_prod[$this->indiceArray]=$id;
            
$this->array_nombre_prod[$this->indiceArray]=$nombre;
            
$this->array_precio_prod[$this->indiceArray]=$precio;
            
$this->array_unidades_prod[$this->indiceArray]=$unidades;
            
$this->indiceArray++;
            
$this->num_productos++;
            }else
                
//ahora verificamos si el producto enviado ya existe
                //si es asi para solo aumentar sus unidades
                    
{
                    
//le enviamos el ID y cuantas unidades va a checar si existe
                    
if($this->existeProducto((int)$id,(int)$unidades)){
                            
//aumentamos solo las unidades del producto enviado
                            
}
                            else {
                                    
//registramos un nuevo item
                                    
$this->array_id_prod[$this->indiceArray]=$id;
                                    
$this->array_nombre_prod[$this->indiceArray]=$nombre;
                                    
$this->array_precio_prod[$this->indiceArray]=$precio;
                                    
$this->array_unidades_prod[$this->indiceArray]=$unidades;
                                    
$this->indiceArray++;
                                    
$this->num_productos++;
                                    }
                    }
        } 
P.D: Dividire la consulta en varios mensajes....

Última edición por Helheim; 04/09/2007 a las 12:46
  #2 (permalink)  
Antiguo 04/09/2007, 12:45
 
Fecha de Ingreso: junio-2004
Mensajes: 232
Antigüedad: 19 años, 11 meses
Puntos: 0
Re: Problema con cesta de la compra

Aqui esta la funcion existeProducto($id,$uni) que, como vereis, se usa en el codigo de arriba:


Código PHP:
function existeProducto($id,$uni)
    {
    for (
$j=0$j<$this->indiceArray$j++){
        
//echo "Comparamos ->>".$this->array_id_prod[$j]." con ->>".$id." a ver donde hay coincidencia<br>";
        //buscamos coincidencia con el ID
        
if($this->array_id_prod[$j]==$id)
            {
            
//si encuentra el producto aumentamos unidades en su array
            
$this->array_unidades_prod[$j]+=$uni;
            
//tambien aumentamos el numero de productos
            
$this->num_productos+=$uni;
            
//lo reactivamos por si ya habia sido borrado
            
$this->array_borrado_prod[$j]=1;
            
$salida 1;
            break;
            } else 
                {
                
$salida 0;
                }
    }
    return 
$salida;

Y aqui os pongo la llamada al metodo introduce_producto():

Código PHP:
<?
include("lib_carrito.php");
$_SESSION["ocarrito"]->introduce_producto($_GET["id"], $_GET["nombre"], $_GET["precio"], $_GET["unidades"]);
?>

A ver si alguien sabe que pasa y por que no introduce bien los datos. Es como si no introdujera nada la primera vez que lo hago.
  #3 (permalink)  
Antiguo 05/09/2007, 03:06
 
Fecha de Ingreso: junio-2007
Mensajes: 37
Antigüedad: 16 años, 10 meses
Puntos: 0
Re: Problema con cesta de la compra

[QUOTE=Helheim;2118733]
Código PHP:
    //Introduce un producto en el carrito. Recibe los datos del producto
    
function introduce_producto($id$nombre$precio$unidades){
        
//verificamos si no hay productos registrados..
       
if(Carrito_vacio)
            {
            
//registramos el producto

            
}else
                
//ahora verificamos si el producto enviado ya existe
                //si es asi para solo aumentar sus unidades

                    
{
                    
//le enviamos el ID y cuantas unidades va a checar si existe

                    
if(existe_producto)){
                            
//aumentamos solo las unidades del producto enviado
                            
}
                            else {
                                    
//registramos un nuevo item

                                    
}
                    }
        } 
QUOTE]

Hola, no soy un experto en PHP pero si te puedo decir que el codigo és poco claro por la funcion existe producto. Esta funcion comprueva si existe y a la vez aumenta las unidades. Para debugar el codigo seria mas facil que hicieras una funcion que te comprovara solo si exisite y dentro del if aumentar las unidades.

Esto ademas te llevarà a eliminar la comprovacion de si el carrito esta vacio o no pq en realidad no importa, ya que elproducto existe o no existe.

Te quedara algo asi
if(prducto_exisite()){
// aumento las unidades
}else{
// creo item nuevo
// aumento num_prod

Se que no es la solucion pero si lo haces asi seguro que ves el error rapido.

Un saludo
  #4 (permalink)  
Antiguo 09/09/2007, 09:55
 
Fecha de Ingreso: septiembre-2007
Mensajes: 7
Antigüedad: 16 años, 7 meses
Puntos: 0
Re: Problema con cesta de la compra

Bueno yo creo que se como poder solucionarlo pero estoy intentando poner el código pero me dice que no hay suficiente espacio. Mi pregunta es tu desde la "clase carrito" llamas a otra clase donde hacer la funcion INSERT, otra UPDATE y DELETE? Si es así tienes que escribir una función que compruebe la existencia y luego la añades a la función INSERT, UPDATe y DELETE. Si me decís como puedo escribir el código te lo escribo.....
  #5 (permalink)  
Antiguo 09/09/2007, 13:02
 
Fecha de Ingreso: septiembre-2007
Mensajes: 7
Antigüedad: 16 años, 7 meses
Puntos: 0
Re: Problema con cesta de la compra

A ver si se eexplicarlo por ejemplo yo pienso que lo mejor es como un diseño a tres capas a continuación te pongo la clase producto:

<?php

class Productes extends DB
{
var $ErrorMsg;
var $pro_codi;
var $pro_fam_codi;
var $pro_sub_codi;
var $pro_nom;
var $pro_descripcio;
var $pro_fotografia;
var $pro_preu1;
var $pro_preu2;
var $pro_preu3;
var $pro_oferta;
var $pro_novetat;
var $pro_pes;
function getError(){
return $this->ErrorMsg;
}

function setError($value){
$this->ErrorMsg=$value;
}

function getpro_codi(){
return $this->pro_codi;
}

function setpro_codi($value){
$this->pro_codi=intval($value);
}

function getpro_fam_codi(){
return $this->pro_fam_codi;
}

function setpro_fam_codi($value){
$this->pro_fam_codi=intval($value);
}
function getpro_sub_codi(){
return $this->pro_sub_codi;
}

function setpro_sub_codi($value){
$this->pro_sub_codi=intval($value);
}


function getpro_nom(){
return $this->pro_nom;
}

function setpro_nom($value){
$this->pro_nom=trim($value);
}
function getpro_descripcio(){
return $this->pro_descripcio;
}

function setpro_descripcio($value){
$this->pro_descripcio=trim($value);
}
function getpro_fotografia(){
return $this->pro_fotografia;
}

function setpro_fotografia($value){
$this->pro_fotografia=trim($value);
}
function getpro_preu1(){
return $this->pro_preu1;
}

function setpro_preu1($value){
$this->pro_preu1=doubleval($value);
}
function getpro_preu2(){
return $this->pro_preu2;
}

function setpro_preu2($value){
$this->pro_preu2=doubleval($value);
}
function getpro_preu3(){
return $this->pro_preu3;
}

function setpro_preu3($value){
$this->pro_preu3=doubleval($value);
}
function getpro_oferta(){
return $this->pro_oferta;
}

function setpro_oferta($value){
$this->pro_oferta=intval($value);
}
function getpro_novetat(){
return $this->pro_novetat;
}

function setpro_novetat($value){
$this->pro_novetat=intval($value);
}
function getpro_pes(){
return $this->pro_pes;
}

function setpro_pes($value){
$this->pro_pes=doubleval($value);
}





function ExistCodi($value,$taula = "productes"){
$this->setError("");
$s = "SELECT pro_codi FROM ".$taula ;
$s .= " WHERE pro_codi = ".intval($value) ;
$this->query($s);

$returnTrueFalse = false;
if ($this->resultExist()) {
$returnTrueFalse = true ;
$this->setError("El codigo de producto '$value' ya existe.");
}
return $returnTrueFalse;

}


function Select($WHERE){
$this->setError("");
$s = "SELECT pro_codi,pro_fam_codi,pro_sub_codi,pro_nom,pro_des cripcio,pro_preu1,pro_preu2,pro_preu3,pro_oferta,p ro_novetat,pro_pes";
$s .= " FROM productes " ;
$s .= $WHERE ;
$this->query($s);
if ($this->resultExist()) {
$returnTrueFalse = true ;
}
else {
$this->setError("Sin registros.");
$returnTrueFalse = false ;
}
return $returnTrueFalse ;
}

function Delete($value){
$this->setError("");
$s = "DELETE FROM productes WHERE" ;
$s .= " pro_codi = '".trim($value)."'";
//echo ($s);
$this->query($s) ;
if ( $this->hasErrors() ) {
$this->setError("Error al borrar producto:<br>".$s."<br>".$this->ShowErrors().".");
$returnTrueFalse = false;
}// if
else {
$returnTrueFalse = true;
} //else
return $returnTrueFalse;
}

function Insert($aValues,$taula = "productes") {
$this->setError("");
if (!$this->ExistCodi($aValues["pro_codi"],$taula) ){
$this->setpro_codi($aValues["pro_codi"]) ;
$this->setpro_fam_codi($aValues["pro_fam_codi"]) ;
$this->setpro_sub_codi($aValues["pro_sub_codi"]) ;
$this->setpro_nom($aValues["pro_nom"]) ;
$this->setpro_descripcio($aValues["pro_descripcio"]) ;
$this->setpro_fotografia($aValues["pro_fotografia"]) ;
$this->setpro_preu1($aValues["pro_preu1"]) ;
$this->setpro_preu2($aValues["pro_preu2"]) ;
$this->setpro_preu3($aValues["pro_preu3"]) ;
$this->setpro_oferta($aValues["pro_oferta"]) ;
$this->setpro_novetat($aValues["pro_novetat"]) ;
$this->setpro_pes($aValues["pro_pes"]) ;
$s = "INSERT INTO ".$taula." (" ;
$s .= " pro_codi " ;
$s .= ", pro_fam_codi " ;
$s .= ", pro_sub_codi ";
$s .= ", pro_nom " ;
$s .= ", pro_descripcio " ;
$s .= ", pro_fotografia " ;
$s .= ", pro_preu1 " ;
$s .= ", pro_preu2 " ;
$s .= ", pro_preu3 " ;
$s .= ", pro_oferta " ;
$s .= ", pro_novetat " ;
$s .= ", pro_pes " ;
$s .= " ) VALUES ( " ;
$s .= "'".$this->getpro_codi()."'" ;
$s .= ", ".$this->getpro_fam_codi() ;
$s .= ", ".$this->getpro_sub_codi();
$s .= ", '".$this->getpro_nom()."'" ;
$s .= ", '".$this->getpro_descripcio()."'";
$s .= ", '".$this->getpro_fotografia()."'";
$s .= ", ".$this->getpro_preu1();
$s .= ", ".$this->getpro_preu2();
$s .= ", ".$this->getpro_preu3();
$s .= ", ".$this->getpro_oferta();
$s .= ", ".$this->getpro_novetat();
$s .= ", ".$this->getpro_pes();
$s .= " )" ;
//echo($s."<br>") ;
$this->query($s) ;
if ( $this->hasErrors() ){
$this->setError("Error al insertar producto:<br>".$s."<br>".$this->err.".");
return false ;
}
return true ;
}//if (!$this->ExistCodi($ext_Codi) && !$this->ExistUsuariClau($ext_Clau,$ext_Usuari,$ext_Codi ))
return false ;
}

function Update($aValues){
$this->setError("");
//if ($this->ExistCodi($aValues["pro_codi"])){
$this->setpro_codi($aValues["pro_codi"]) ;
$this->setpro_fam_codi($aValues["pro_fam_codi"]) ;
$this->setpro_sub_codi($aValues["pro_sub_codi"]) ;
$this->setpro_nom($aValues["pro_nom"]) ;
$this->setpro_descripcio($aValues["pro_descripcio"]) ;
$this->setpro_fotografia($aValues["pro_fotografia"]) ;
$this->setpro_preu1($aValues["pro_preu1"]) ;
$this->setpro_preu2($aValues["pro_preu2"]) ;
$this->setpro_preu3($aValues["pro_preu3"]) ;
$this->setpro_oferta($aValues["pro_oferta"]) ;
$this->setpro_novetat($aValues["pro_novetat"]) ;
$this->setpro_pes($aValues["pro_pes"]) ;
$s = "UPDATE productes SET " ;
$s .= " pro_codi = ".$this->getpro_codi();
$s .= " pro_fam_codi = ".$this->getpro_fam_codi() ;
$s .= " pro_sub_codi = ".$this->getpro_sub_codi() ;
$s .= " pro_nom = '".$this->getpro_nom()."'" ;
$s .= " pro_descripcio = '".$this->getpro_descripcio()."'" ;
$s .= " pro_fotografia = '".$this->getpro_fotografia()."'" ;
$s .= " pro_preu1 = '".$this->getpro_preu1()."'" ;
$s .= " pro_preu2 = '".$this->getpro_preu2()."'" ;
$s .= " pro_preu3 = '".$this->getpro_preu3()."'" ;
$s .= " pro_oferta = '".$this->getpro_oferta()."'";
$s .= " pro_novetat = '".$this->getpro_novetat()."'" ;
$s .= " pro_pes = '".$this->getpro_pes()."'";
$s .= " WHERE pro_codi = ".$this->getpro_codi() ;//pongo solo pro_codi porque es la clave primaria
//echo($s) ;
$this->query($s) ;
if ( $this->hasErrors() ){
$this->setError("Error al Modificar producto:<br>".$s."<br>".$this->err.".");
return false ;
}
return true ;
//}//if ($this->ExistCodi($ext_Codi))
return false ;
}

function EsborrarTot($taula = "productes"){
$this->setError("");
$s = "DELETE FROM ".$taula ;
$this->query($s) ;
if ( $this->hasErrors() ) {
$this->setError("Error al borrar productos:<br>".$s."<br>".$this->ShowErrors().".");
$returnTrueFalse = false;
}// if
else {
$returnTrueFalse = true;
} //else
return $returnTrueFalse;
}

}
?>
Esta es la clase producto como ves la primera función es la si existe producto y luego cuando llames a insertar modificar o borar ya lo compruebas con le primer if.
Puedes llamarla desde otra página así es más fácil porque podrás realizar to´das estas acciones y es más ordenado y fácil
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 15:09.