Same Cookie Shopping Cart - I can’t detect the error in the code

Asked

Viewed 27 times

-1

I’m testing a shopping cart... and I’m storing the cart items in the same cookie, but I am unable to detect the problem. I am recording the cart in a 2-dimensional array of 3 fixed items as value in the cookie which are: product name - quantity - price The problem is that by clicking on the same product the quantity is increased BUT when I click on another product the product that has more than 1 item purchased (type 4 items of the same product), ZERA. Doing a var_dump and looking at the cookie is happening, instead of continuing to increase the amount of the repeated product, this same product goes to another value in the array, I suspect the problem is in COUNT but I’m already on time here and can not solve, (IF YOU KEEP CLICKING REPEATEDLY ON THE PURCHASE OF THE SAME PRODUCT YOU INCREASE BUT BY CLICKING ON THE PURCHASE OF A DIFFERENT ITEM AND RETURNING TO THE REPEATED ITEM, THE REPEATED ITEM ZERA, BUT IT’S THERE in the cookie only with another input).... follows the code:

<?php
//pegamos o item adicionado ao carrinho//
$produto = $_GET['produto'];
$preco   = $_GET['preco'];

////////////////////////////////////////////////////////////////
// Procedimento para inserção dos itens do carrinho   //////////
if(!isset($_COOKIE['itens_carrinho'])) {     //Se NÃO existe este COOKIE CRIAMOS //
    
    //Criamos o primeiro COOKIE como primeiro ITEM do CARRINHO//
    //Criamos uma array bidimensional
    $itens_carrinho=[[]];
    //inserimos 1 item com 3 valores na array bidimensional//
    $itens_carrinho[0][0] = $produto; 
    $itens_carrinho[0][1] = 1;
    $itens_carrinho[0][2] = $preco; 
    
    //codificamos o primeiro ITEM do carrinho//
    $itens_carrinho = json_encode($itens_carrinho);
    
    //inserimos o carrinho gravado e ENCODADO dentro do COOKIE
    setcookie('itens_carrinho', $itens_carrinho, time() + 86.400 * 30); 
    
    header('Location: inserido-com-sucesso.php?produto='.$produto.'&preco='.$preco);

} 

if(isset($_COOKIE['itens_carrinho'])) {         //Se EXISTE este COOKIE//
    
    if(!empty($_COOKIE['itens_carrinho'])){     //Se este cookie nao está vazio
    
        //Pegamos o Cookie//
        $itens_carrinho = $_COOKIE['itens_carrinho'];

        //Decodificamos o item_carrinho de STRING para ARRAY novamente//
        $itens_carrinho = json_decode($itens_carrinho);
    
        //Verificamos quantos itens tem no carrinho//
                                            //NOTA: O ERRO PODE ESTAR AQUI//
        $itens = count($itens_carrinho);    // com count o valor sempre é um a mais, pois não conta o 0//          
        
        //Nome do Produto vindo de $_GET//
        $nome_do_item = $produto;
        
        //Verificamos SE este PRODUTO já EXISTE no carrinho //NOTA: O ERRO PODE ESTAR AQUI//
        for($x=0, $num_itens = $itens; $x < $num_itens; $x++){                                                                     
            if($itens_carrinho[$x][0] == $nome_do_item){
                 //SE já EXISTE este item//
                 //Procedimento de INCREMENTO da quantidade do item EXISTENTE - ATUALIZAÇÃO
                 $itens_carrinho[$x][1] = $itens_carrinho[$x][1] + 1;
                 $page_redirect = 'inserido-novamente-com-sucesso.php?produto='.$produto.'&preco='.$preco.'&quantidade='. $itens_carrinho[$x][1];
                 $existe = 'SIM';
                
            }else{
                 $existe = 'NAO';
            }
        }
        
        
        //Caso NÃO EXISTA este produto no cookie, gravamos um novo usando o COUNT, que é a última posição
        if($existe == 'NAO'){                                       
            //Criamos um NOVO ITEM no ARRAY//
                           //NO ULTIMO PONTO//
            $itens_carrinho[$itens][0] = $produto;
            $itens_carrinho[$itens][1] = 1;
            $itens_carrinho[$itens][2] = $preco;
            
            //codificamos o NOVO ITEM do carrinho//
            $itens_carrinho = json_encode($itens_carrinho); 
            //Gravamos o NOVO ITEM CODIFICADO no COOKIE
            setcookie('itens_carrinho', $itens_carrinho, time() + 86.400 * 30); 
            //Redirecionamos para a página inserido-com-sucesso.php
            header('Location:inserido-com-sucesso.php?produto='.$produto.'&preco='.$preco);
            
        //Caso NÃO EXISTA este produto no cookie, gravamos um novamente nele com o ARRAY ATUALIZADO     
        }elseif($existe == 'SIM'){ 
                               
            //codificamos o ARRAY ATUALIZADO//
            $itens_carrinho = json_encode($itens_carrinho);             
            //Gravamos o cookie novamente (ATUALIZAMOS ELE) com os dados ATUALIZADOS
            setcookie('itens_carrinho', $itens_carrinho, time() + 86.400 * 30);
            //Redirecionamos para a página de ATUALIZAÇÃO da quantidade do COOKIE
            header('Location:'. $page_redirect);
        }   
            
    }
}
?>

In the image below appears another page giving a var_dump in the cookie, and everyone is there but as I said when clicking on another product what has (several have added) goes to a new Info. inserir a descrição da imagem aqui

2 answers

0

The problem may be here in fact

$itens_carrinho[$itens][0]

Why items have the array Count.

My suggestion? The index of your array should always be cod_product, because that way it becomes easier for you to control, you wouldn’t need so much if.

Another detail, why you chose cookie and not Session ?

  • Hello Augusto, .

0

I found the error at the point I suspected....

here...

 //Verificamos SE este PRODUTO já EXISTE no carrinho //NOTA: O ERRO PODE ESTAR AQUI//
    for($x=0, $num_itens = $itens; $x < $num_itens; $x++){                                                                     
        if($itens_carrinho[$x][0] == $nome_do_item){
             //SE já EXISTE este item//
             //Procedimento de INCREMENTO da quantidade do item EXISTENTE - ATUALIZAÇÃO
             $itens_carrinho[$x][1] = $itens_carrinho[$x][1] + 1;
             $page_redirect = 'inserido-novamente-com-sucesso.php?produto='.$produto.'&preco='.$preco.'&quantidade='. $itens_carrinho[$x][1];
             $existe = 'SIM';
            
        }else{
             $existe = 'NAO';
        }
    }

It is in the loop for, he finding the repeated item did not stop (obvious...rs) and invariably he when going through the array the variable $existe took the value NO, I removed the snippet:

        }else{
             $existe = 'NAO';
        }
    }

and I put $existe = 'NO' as the default value outside the LOOP, which only changes the value when it accuses a repeated item and no, no.... and used in_array to find the value of the same product instead of == also reducing to the first dimension of the array to perform the search.

vlws hug to all.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.