Adicionar opções dos produtos ao carrinho de compra com php

Umas das dúvidas recorrente que recebo sobre a minha vídeoaula de carrinho de compras, é relacionado em adicionar opções aos produtos. Exemplo, vender camisas, e a pessoa ter a opção das cores.

Na vídeoaula ensino adicionar os produtos numa session, onde é atribuído um array, sendo o ID a chave desse array, e o valor será a quantidade. Dessa maneira você consegue recuperar o valor do produto do banco.

Mas como adicionar opções de cores na session, sendo que adicionamos apenas o ID do produto e quantidade?  Primeiro coisa que pensamos é estendê-lo em vez de apenas atribuir a quantidade, atribuir um array, tendo assim os valores de quantidade e cor:

$_SESSION['carrinho'][ID] = array('qtd' => 1, 'cor_id' => 5);

Conseguimos adicionar o ID da cor no carrinho, mas tem um problema. Se a pessoa quiser o mesmo produto, com cores diferentes? Como o ID do produto é o que definir no array os valores diferentes, se atribuiu outra cor com o mesmo produto, ele vai sobrescrever. Então precisamos ter um identificador único, onde vamos dizer qual o produto e cor. Podendo ter um produto com várias cores[bb]. E que tal utilizamos essas duas informações como índice desse array?

$_SESSION['carrinho'][ID:COR_ID] = 1;

Pronto, resolvemos o nosso problema, separamos com o valor por dois pontos ( : ), sendo o primeiro o ID e o segundo a ID da cor do produto. Então vamos exemplificar melhor isso. Criaremos uma classe chamado Carrinho.php, e que terá todos o processo relacionado ao carrinho de compras. O código está comentado, para facilitar a compreensão :

Carrinho.php

<?php

/**
 *
 * Implementa o carrinho de compras
 * @author David CHC
 *
 */
final class Carrinho{

	/**
	 *
	 * Método construtor
	 * Caso não existe a $_SESSION['carrinho'],
	 * ele criar atribuindo um array vazio
	 *
	 */
	public function __construct(){
		if(!isset($_SESSION['carrinho'])){
			$_SESSION['carrinho'] = array();
		}
	}

	/**
	 *
	 * Adiciona um produto ao carrinho
	 *
	 * Veja que criar uma chave, tendo a composição de 2 items:
	 * o ID do produto e o ID da cor do produto
	 * Essa maneira não irá sobreescrever quando quiser
	 * vários produtos com cores diferentes.
	 *
	 * Um detalhe, se não tiver cor, ele atribui o valor zero,
	 * facilitando na hora de verificar se tem cor ou não
	 *
	 * @param integer $id é código do produto adicionado
	 * @param integer $qtd é  quantidade
	 * @param integer $cor_id é a cor do produto
	 *
	 */
	public function adicionar($id, $qtd = 1, $cor_id=null){
		//verificar se o valor é nulo
		if(is_null($cor_id)){
			//Se for, monta o indice, sendo o valor para cor como 0
			$indice = sprintf('%s:%s', (int)$id, 0);
		}else{
			//Se existe um valor, atribui ao indice
			$indice = sprintf('%s:%s', (int)$id, (int)$cor_id);
		}
		/**
		 * Se não existir esse indice no carrinho
		 * Atribui ao carrinho com a quantidade
		 */
		if(!isset($_SESSION['carrinho'][$indice])){
			$_SESSION['carrinho'][$indice] = (int)$qtd;
		}
	}

	/**
	 *
	 * Altera a quantidade do carrinho
	 * O indice do array é a junção do ID do produto com o ID da cor
	 *
	 * @param string $indice é a chave do array
	 * @param integer $qtd é quantidade para alterar
	 */
	public function alterar($indice, $qtd){
		//verifica se existe esse indice
		if(isset($_SESSION['carrinho'][$indice])){
			//se o quantidade for maior que zero
			if($qtd > 0){
				//realiza a alteração
				$_SESSION['carrinho'][$indice] = (int)$qtd;
			}
		}
	}

	/**
	 *
	 * Excluir o produto do carrinho
	 * @param string $indice
	 */
	public function excluir($indice){
		//excluir o produto do carrinho
		unset($_SESSION['carrinho'][$indice]);
	}

	/**
	 *
	 * Retorna um array com os dados dos produtos no carrinho
	 * @return array $result
	 */
	public function listarProdutos(){
		//inicia a variável com array
		$result = array();
		foreach($_SESSION['carrinho'] as $indice => $qtd){
			//Separa o ID do produto do ID da cor
			list($id, $cor_id) 		= explode(':', $indice);

			//Realizar a busca pelo produto, selecionado apenas o nome do produto e preço
			$query_product       		= mysql_query("SELECT produto, preco FROM produtos WHERE id = '$id'");

			//retorna os itens do tabela produtos
			$row_product         		= mysql_fetch_assoc($query_product);

			/**
			 * Adicionar ao array o nome do produto, preço , quantidade, subtotal e a cor
			 * È importante reparar que indice desse array será o mesmo
			 * do carrinho.
			 */

			$result[$indice]['produto'] = $row['produto'];
			$result[$indice]['preco']   = $row['preco'];
			$result[$indice]['qtd']     = $row['qtd'];
			$result[$indice]['subtotal']= $row['preco'] * $row['qtd'];
			$result[$indice]['cor']     = '';

			//Verifica se existe cor para o produto
			if($cor_id > 0) {
				//Faz a busca pela cor , seleciona apenas o nome da cor
				$query_cor   			= mysql_query("SELECT cor FROM cores WHERE id = '$cor_id'");

				//retorna os itens do tabela cores
				$row_cor     			= mysql_fetch_assoc($query_cor);
				//Adiciona o nome da cor
				$result[$indice]['cor'] = $row_cor['cor'];
			}
		}

		return $result;
	}
	
	/**
	 * 
	 * Retorna o valor total do carrinho
	 * Aqui apenas listaremos o produtos
	 * somaremos o subtotal, que é
	 * o preço vezes a quantidade
	 * Isso já foi calculado no método listarProdutos
	 */
	public function valorTotal(){
		//listar todos os produtos
		$produtos = $this->listarProdutos();
		//inicia a variável
		$total    = 0;
		//listar os produtos, para resgatar o subtotal
		
		foreach($produtos as $indice => $row){
			//realiza a soma
			$total += $row['subtotal'];
		} 
		
		return $total;
		
	}
}
?>

Veremos como seria utilizado essa classe, lembrando que não irei mostrar todo os processos desse carrinho do compras, porque tem uma videoaula que explica o mesmo procedimento, estou apenas mostrando como usar a classe. Antes os valores eram enviado por GET , mesmo na hora da alteração, agora será enviado por POST. Vamos ao código :

carrinho.php

<?php
//Inicia a Session
session_start();

//inclui a conexão
require('config/conexao.php');

//Include a classe Carrinho.php
require('classes/Carrinho.php');

//Instancia o Carrinho
$cart = new Carrinho();

//Verifica se irá adicionar produto ao carrinho
if(isset($_POST['acao']) && $_POST['acao'] == 'add'){
	/**
	 *
	 * Resgata o ID do produto
	 * Resgata o ID da cor
	 * Resgata a Quantidade
	 *
	 */
	$id	    = $_POST['id'];
	$cor_id     = (isset($_POST['cor_id'])) ?$_POST['cor_id'] : null;
	$qtd	    = $_POST['qtd'];
	//Adicionar o produto no carrinho
	$cart->adicionar($id, $qtd, $cor_id);
}

//Verifica se vai alterar o produto
if(isset($_POST['acao']) && $_POST['acao'] == 'alterar'){
	//Percorre o array da quantidade para resgatar
	// o indice e valor da quantidade
	foreach($_POST['qtd'] as $indice => $valor){
		$cart->alterar($indice, $valor);
	}
}

//Verifica para excluir o produto
if(isset($_GET['apagar'])){
	$cart->excluir($_GET['apagar']);
}

//retorna todos produtos do carrinho
$produtos = $cart->listarProdutos();

//retorna valor do total do carrinho
$total    = $cart->valorTotal();

Agora vamos a parte de mostrar os produtos no carrinho, será continuação do arquivo carrinho.php, estou colocando separado para ficar mais fácil de visualizar:

<table>
	<thead>
		<tr>
			<th>Produto</th>
			<th>Quantidade</th>
			<th>Preço</th>
			<th>SubTotal</th>
			<th>Excluir</th>
		</tr>
	</thead>

	<form action="" method="post">
		<tfoot>
			<tr>
				<td colspan="5">
                                 <input type="submit" value="Alterar o Carrinho" /> 
                                 <input type="hidden" name="acao" value="alterar" />
				</td>
			</tr>
		</tfoot>

		<tbody>
		<?php foreach($produtos as $indice => $valor) :?>
			<tr>
				<td><?php echo $row['produto']. ' - '.$row['cor']?></td>
				<td><input type="text" name="qtd[<?php echo $indice?>]"	value="<?php echo $valor['qtd']?>" /></td>
				<td>R$ <?php echo number_format($valor['preco'], 2, ',', '.')?></td>
				<td>R$ <?php echo number_format($valor['subtotal'], 2, ',', '.')?></td>
				<td><a href="carrinho.php?apagar=<?php echo $indice?>">Excluir</a></td>
			</tr>
		<?php endforeach;?>
		</tbody>

	</form>


</table>

Repare que o principio é o mesmo que foi utilizado na videoaula, apenas adicionamos mais uma informação. Caso você tenha muitas opções ao pedido, você pode realizar o mesmo procedimento, mas em vez de você colocar id da cor, você iria utilizar o array com todas as opções, utilizando o serialize no array, e Codifica dados (criptografar) com base64_encode , podendo reverter:

<?php 
  $options     = array('cor_id' => 1, 'tamanho_id' => 5);
  $id          = 1;
  $indice      = $id.':'.base64_encode(serialize($options));
?>

Depois para usar os itens é só reverter:

<?php
  list($id, $options) = explode(':', $indice); 
  $items     = unserialize(base64_decode($options));
?>

A partir dai você consegue com facilitada atribuir opções a seus produtos utilizando a session. Espero ter ajudado, e até a próxima




Se o conteúdo foi relevante para você, e desejar, você pode incentivar fazendo uma doação.

89 thoughts on “Adicionar opções dos produtos ao carrinho de compra com php

  1. Só não entendi três coisas:
    1. Algum motivo especial pra tornar a classe Final? Isso atrapalha um bocado na reutilização de componentes.
    2. Por que serializar o array com as opções? Se elas vão ser amazenadas em Session, o PHP já não faz isso automaticamente?
    3. Qual a utiliadade do base64_encode/base64_decode nesse exemplo?

    Bom tutorial!

    1. Blz Eduardo, então vou tentar expor pq fiz essas decisões:

      1 – No caso dessa classe, sua reutilização, por composição ou herança, na minha visão, não se encaixaria. Um caso de reutilização, seria definição de que tipo de armazenamento, e modo de exibição, no caso seria o ideal criar uma interface, ou classe abstrata com essas definições, essas classes filhas tomasse essa decisão. Essa classe seria esse “resultado”. Outro motivo de ser final, como ela seria esse “resultado”, isso me garante evitar gambiarras como já vi, classes de carrinho com definições do banco de dados, definição de conexão , etc, e partir dai utilizar ele para acesso ao banco. Então sendo final, estou dizendo, nesse caso , que ele é o resultado final desse processo.

      2,3 – As questões 2 e 3 estão ligadas. Veja que no tutorial, minha sugestão de solução para essas opções é adicionar essas informações fazendo parte do indice desse array junto com Id do produto. Preciso transformar esse array associativo. Então serializar esse array é mais facil de trabalhar, já que vai transformar numa string, e posso retorna sua forma original pra trabalhar como array. E a utilização do base_64, é porque estou utilizando os dois pontos ( : ) para separar o ID do produto das opções, como estou serializando essa array, ele terá tanto esse caractere ( : ), podendo causar algum problema.

      vlw, abrs

      1. Olá,
        Preciso da seguinte solução:

        Tenho um produto que é um caixa de presente com 6 alfajores dentro.

        Só que em meu site possuo 5 sabores diferentes de alfajores.

        O internauta que quiser comprar esta caixa de presente, terá a sua disposição a opção de personalizar a quantidade de alfajores de cada sabor.

        Preciso que,….a listagem de sabores seja integrada,…de forma que, caso o internauta ultrapasse o limite de 6 unidades, receba um aviso…..

        Conseguem me ajudar

  2. Queria saber o seguinte, cada produto tem 1 Cor e tamanho. Como eu faria para dar baixa no Banco, eu teria que abrir 1 codigo para cada produto e lista-lo na hora de exibir o produto Modelo? Eu criaria um Select e através desse select jogaria o ID do produto? seria algo desse tipo?

    1. Vc pode colocar na tabela produtos, a quantidade de produto, e na hora de finalizar o pedido, e vc diminui com quantidade solicitada

  3. Boa tarde David,
    Fiz tudo conforme o tutorial, só que estou com um problema:
    Eu não tenho que inicializar a sessão, ou seja, session_start();
    Quando eu coloco isso e vou deletar, o mesmo não faz nada.
    Você pode me ajudar?
    No aguardo.
    Grato.

    1. Guilherme, vc precisa trabalhar iniciar a session , com session_start, eu não tinha colocado pq o pre-requisito do tutorial a videoaula sobre carrinho de compras. Sobre não está excluindo, retire o is_numeric q eu coloquei. Eu fiz alterações , removendo is_numeric e iniciando com session_start()

  4. Boa noite David,
    Então lembro que a uns 3 anos atrás me deu a maior força para solucionar exatamente esta dúvida: Adicionar opções ao carrinho de compras, na época além de cor tinha que o tamanho.
    Foi muito bom para o entendimento e hoje vejo que até você já está utilizando CMS´s para facilitar a vida e nesse barco segue eu agora deixei de criar sistemas de e-commerce do zero e utilizo além do OpenCart o Magento que são magníficos, deixando os códigos para softwares que necessitam realmente construções do início.
    Conforme passou o tempo adotei frameworks para facilitar e estou utilizado o CI como principal e o Zend como secundário. Seria interessante que pessoas como você que tem uma grande influência além de respeito começar a propagar mais estas vias.
    Como sempre termino dizendo: Com o auxílio de suas vídeo aulas me tornei um profissional.
    Obrigado.

    1. Blz Junior, realmente, talvez da maneira q mostrei naquela época, era mais complicado do que fiz nesse tutorial :D. A escolher de usar cms ou não, vai ser qual é mais fácil, rápido de criar e manter. Provavelmente vou começar a fazer tutorial sobre cms, e-commerce e framework. Fico realmente feliz e ter poder ajudado um pouco no seu aprendizado. abrs

  5. Esta aplicação se adapta ao Opencart?
    Desculpe-me se a pergunta for muito primária, uma vez que não domino php.
    Estou com esse problema de tamanho e cor, uma vez que não consigo adicionar uma certa quantidade de P da camisa rosa(por exemplo) e uma certa quantidade de P da camisa azul, de mesma estampa. Não sei se está bem explicado.

    Poderia me dar uma luz?
    Obrigado

    1. Eduardo, esse tutorial não se aplica ao opencart. No caso do opencart, você consegue informar a quantidade de cada item, exemplo camisas tamanho P. Mas quando vc precisa mescla, tipo, camisas tamanho p, e cor azul, acho q vc não consegue juntas as duas opções e defini quantidade desse produto especifico.

      1. Obrigado!
        Você teria alguma solução para minha necessidade? Mesmo que eu tenha que pagar, preciso resolver isso. Ou teria uma indicação de quem possa fazer a programação para mim?
        No aguardo.

        1. Eduardo, realmente não conheço uma solução, só realmente teria que mudar algo no opencart mesmo. Mas vc pode pesquisar os módulos no site do opencart , as vezes já tem uma solução

  6. Olá David,

    Eu tenho uma página com a lista dos produtos, ex: produtos.php, no link do botão comprar o
    <a href="carrinho.php?acao=add&cod=”>Comprar

    No script está chamando por post, neste caso como devo fazer esta chamada do arquivo que lista os produtos.

    Agradeço a atenção.

  7. Olá David,

    muito obrigada pela paciência.
    Gente pequena querendo fazer trabalho de gente grande não dá certo…

    1. Naiara, ultimamente está muito complicado fazer videoaula, mas conseguindo um tempo, eu faço sim. abrs

  8. David,

    Estou tentando pela primeira vez (e na milesima tentativa) implantar um carrinho de compras pagseguro no meu blog. Estou fazendo so com html que e o maximo que a minha capacidade de programadora pode ir. Com muitas tentativas consegui inserir um dropdown com tamanho e cor. O botao esta funcionando, porem cada vez que e clicado ele adiciona o novo produto ao carrinho pagseguro mas so mostra o ultimo produto. Voce poderir ajudar uma pessoa desesperada!!!

    Muito obrigada
    Bianca

    1. Bianca, no caso vc precisará utilizar uma linguagem de programação, no caso utilizei o PHP, só com HTML fica complicado. Talvez se não for para estudo, e sim para um negocio seu, seria interessante utilizar e-commerce pronto, como o opencart que é bem leve e facil de mexer, e tem já módulos de pagamento. Se quiser algo mais robusto, tem o magento. Se tiver utilizando wordpress, tem wp-ecommerce.

  9. olá, amigo
    segui todos os seus passos, mas não consegui recuperar nenhum valor em

    $valor) >

    <input type="text" name="qtd[]” value=”” />
    R$
    R$
    <a href="carrinho.php?apagar=”>Excluir

    seria possível um exemplo mais detalhado?

    Meu problema é enviar, além do id_produto e quantidade, uma outra quantidade (informada pelo usuario) para que eu possa calcular um valor final para cada produto

    Att

  10. olá, amigo
    segui todos os seus passos, mas não consegui recuperar nenhum valor no foreach{ […] }

    seria possível um exemplo mais detalhado?

    Meu problema é enviar, além do id_produto e quantidade, uma outra quantidade (informada pelo usuario) para que eu possa calcular um valor final para cada produto

    Att

    1. Junior, vc chegou assistir a video aula sobre carrinho de compras ? Nesse seu caso, vc pode fazer mais simples:

      $_SESSION['carrinho'][$id_produto] = array('qtdPadrao' => 1, 'qtdUsuario' => 5);
      

      Veja q criei um array multidimensional, onde antes guardava apenas a quantidade, agora guardo o array onde posso colocar a quantidade padrão, e a quantidade definida pelo usuário

  11. Obrigado pelo tutorial, muito bom!

    Minha duvida é a seguinte, vi que algumas pessoas querem apenas fazer algo simples, continuando com o script do carrinho anterior, mas adicionando essa feature nova.

    Estou com a mesma duvida, vi que tu fala pra criar um array multidimensional, mas eu não entendi aonde isso deve ser aplicado, pode ajudar?

  12. Olá,

    tenho carrinho de compras funcionando perfeitamente conforme seu primeiro tutorial… agora estou fazendo para colocar opções nos produtos mas estou com problemas.

    Tem uma parte do seu código (segue abaixo) que não está fechando.

    $valor) >

    <input type="text" name="qtd[]” value=”” />
    R$
    R$
    <a href="carrinho.php?apagar=”>Excluir

    Erro que aparece:
    Parse error: parse error, unexpected ‘<' in C:\wamp\www\latinahaus\carrinho2.php on line 73

    Até já tentei algumas formas mas ai gera erro no

    Preciso de sua ajuda.

    Muito obrigado.
    Ronaldo

  13. Olá,

    Preciso de sua ajuda… segui o tutorial e não funciona, ou seja, não estou conseguindo… ele está dando erro no foreach($produtos as $indice => $valor) com o final … os itens não entram no carrinho…

    Tem uma forma de enviar os arquivos para me ajudar?

      1. Sim coloquei… já tenho o carrinho funcionando conforme o outro tutorial, uso com pagseguro e tudo funciona bem, tanto para pagar quanto para o retorno.

        O meu problema esta em adicionar opções nos produtos. Tem como mandar o código para você olhar?

  14. Olá David!
    Peguei seus scripts e montei o exemplo no meu servidor local, quase tudo funcionou. O que acho estranho é que a qtd que é definida como 1 dentro da class – public function adicionar($id, $qtd = 1, $cor_id= 0){ – aparece sempre zerada como podes ver nesse print_r Array ( [1:1] => Array ( [produto] => img_7776 [preco] => 9 [qtd] => 0 [subtotal] => 0 [cor] => 15×21 ) ). Podes me dar um help? Abs. Parabéns pelo trabalho.

  15. Bom dia , teria os fontes para baixar, pois nesse novo modelo, não estão sendo exibidos os produtos adicionados ao carrinho, no código da video aula funciona legal, mas esse com a classe não está aprecendo, o que poderia ser, carrinho fica em branco?

    1. Desculpe, favor esquecer a pergunta, consegui resolver!

      Só gostaria de saber se teria como adicionar a opção de tamanho, seria complicado adicionar essa opção?

      1. Dartanhan, vc pode fazer da mesma maneira, adicionando mais um item no como :

        public function adicionar($id, $qtd = 1, $cor_id=null, $tamanho_id=null){
        
        1. David, cnsegu fazer todo o carrinho, muti obrigado mesmo, sua ajuda foi fundamental, só preciso de uma coisa, como eu faria para adicionar ao meu carrinho o valor do frete, uma vez que ele já está todo montado, tentei fazer assim, criei uma função na classe carrinho de calcular frete mas não tive muito sucesso, fiz assim:

          public function calcularFrete($cod_servico, $cep_origem, $cep_destino, $peso, $altura, $largura, $comprimento, $valor_declarado){
          $correios = “http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx?nCdEmpresa=&sDsSenha=&sCepOrigem=”.$cep_origem.”&sCepDestino=”.$cep_destino.”&nVlPeso=”.$peso.”&nCdFormato=1&nVlComprimento=”.$comprimento.”&nVlAltura=”.$altura.”&nVlLargura=”.$largura.”&sCdMaoPropria=n&nVlValorDeclarado=”.$valor_declarado.”&sCdAvisoRecebimento=n&nCdServico=”.$cod_servico.”&nVlDiametro=0&StrRetorno=xml”;
          $xml = simplexml_load_file($correios);
          if($xml->cServico->Erro == ‘0’){
          // return $xml->cServico->Valor;

          //inicia a variável com array
          $result = array();
          foreach($_SESSION[‘carrinho’] as $indice){
          $result[$indice][‘frete’] = $xml->cServico->Valor;
          }
          }else{
          return false;
          }
          }

          Tentei seguir a mesma lógica do listarProdutos(), mas não tive sucesso, como posso adicionar e pegar esse valor?

  16. Ola David, primeiramente gostaria de lhe dar os parabéns pelo tutorial. Sou novo em php, mas eu tenho que desenvolver uma loja de camisetas e o mais rapido possível. Eu consegui implementar o código da video aula, mas como eu preciso inserir opçoes de tamanho e cor, dei uma olhada nesse tutorial, mas não consegui centender como é que eu vo fazer a implementação…não teria como você me passar o código completo da loja por email? ou me explicar melhor como é que eu adiciono opções de cor?

  17. Ola David, você me indicou este tutorial para solucionar o problema de opções para os produtos, gostei muito consegui fazer obrigado!, mas tenho uma dúvida sobre o uso da função Sprintf neste trecho,
    if(is_null($cor_id)){
    $indice = sprintf(‘%s:%s’, (int)$id, 0);
    }else{
    $indice = sprintf(‘%s:%s’, (int)$id, (int)$cor_id);

    Poderia me explicar mais detalhadamente,pois quero inserir a opção de tamanho e sexo da mesma maneira que a da cor, pois acho mais fácil…

  18. Ei David consegui entender esquece a pergunta anterior,

    if(is_null($cor_id)){
    $indice = sprintf(‘%s:%s’, (int)$id, 0);
    }else{
    $indice = sprintf(‘%s:%s’, (int)$id, (int)$cor_id);

    No caso, a fução coloca a $cor_id ao lado de $id dentro do $indice, como coloquei o tamanho(tamanho_id)
    ficou assim
    if(is_null($tamanho_id)){
    $indice = sprintf(‘%s:%s:%s’, (int)$id, (int)$cor_id, 0);
    }else{
    $indice = sprintf(‘%s:%s:%s’, (int)$id, (int)$cor_id, (int)$tamanho_id);
    }
    Fiz o mesmo com a parte do sexo(sexo_id) e depois so separei os 3 do $id usando explode, e copiei as outras partes, deu certo.
    Obrigado!

  19. Ola novamente David, agora que implementei opções ao carrinho estou com dificuldades na integração com o pág seguro, o problema se encontra na hora de selecionar e adcionar os produtos ao pag seguro, nesta passagem :
    * Iremos nessa parte selecionar os produtos e adicionar
    $ids = implode(‘, ‘,array_keys($_SESSION[‘carrinho’]));
    $sql = sprintf(“SELECT * FROM produtos WHERE id IN (%s)”, $ids);
    $query = mysql_query($sql);
    while ($row = mysql_fetch_assoc($query)){
    $id = $row[‘id’];
    $produto = $row[‘produto’];
    $qtd = $_SESSION[‘carrinho’][$id];
    $preco = $row[‘preco’];
    $peso = $row[‘peso’];
    No caso ele utiliza a sessão carrinho para resgatar os valores, mas no carrinho “com opções” não funciona, até pq é diferente, ja tentei utilizar a instancia $cart, e a variável $valor de exibição, e montar uma sessao para substituir a do carrinho, mas não deu certo.., pode me dar uma luz?? desde ja, obrigado!

    1. Diego , vc já tem todos os produtos chamando o listarProdutos

      <?php 
      
      session_start();
      
      //Instancia o Carrinho
      $cart = new Carrinho();
      $produtos = $cart->listarProdutos();
      
      foreach ($produtos as $key => $row){
              list($id, $cor_id)      = explode(':', $key);
              $produto = $row['produto'];
              $qtd     = $row['qtd'];
              $preco   = $row['preco'];
              $peso    = $row['peso'];
              $pagseguro->addItem($id, $produto, $qtd, $preco, $peso);
      }
      
      
  20. Ola David, ja estava com essa duvida faz um bom tempo…hoje vim conferir se tinha me respondido, e logo que vi sua resposta, fui ao problema e resolvi em apenas alguns minutos, muito obrigado e até mais!

  21. Desculpa por não ter agradecido antes, obrigado David, graças a você consegui o que queria, e acabei entendendo melhor! Obrigado.

  22. Olá David!
    Primeiramente, agradeço pela força de sempre. Graças as suas vídeo aulas aprendi muita coisa.

    Estava precisando de um sistema que pudesse me trazer os valores dos atributos dos produtos e encontrei seu exemplo.

    Tenho só uma pequena dúvida.

    Você setou o $result[$indice][‘qtd’] como $row=[‘qtd’]

    Minha dúvida é o seguinte, mesmo que eu tenha o campo ‘qtd’ que é o valor de produtos em estoque no banco de dados, o valor deste ‘qtd’ não seria o que esta passando pelo $_GET ou pelo $_POST ?

    Ficaria assim:
    $result[$indice][‘qtd’] = $qtd;

    Abraço.

  23. David, curto muito seus artigos e seus tutoriais principalmente aprendi muito pegando e fazendo mesmo, boa parte deles.

    Ontem usando novamente este artigo me surgiu uma questão que pode ajudar o pessoal também.

    Pelo que eu entendi estou enviando o valor da cor apenas uma vez, e caso eu queira troca-lá, como devo fazer?

    Retiro o índice para não repetir e incluo novamente com o novo valor?

    1. No caso, seu indice é composto de o ID do Produto e a COR. O q vc pode fazer, quando ter q alterar a COR, vc exclui esse indice, e adiciona esse novo, com ID e nova cor.

  24. David, obrigado pelo tutorial. Eu fiz meu carrinho me baseando na sua video-aula. Agora gostaria de atualizar para esse modelo novo. Só que não consigo entender o que do antigo permanece e o que deve ser alterado ou excluido. Outra duvida: quanto a classe Carrinho.php, vc colocou algumas variaveis, por exemplo nessa passagem: ”public function adicionar($id, $qtd = 1, $cor_id=null)…” As variais $ID e $COR_ID . de onde está vindo o valor dessas variaveis? Abraço mestre! ^^

    1. Ao invés de tentar fazer modificação, tente refazer, assim fica mais facil.

      Se lembra na videoaula, q eu usava o ID do Produto pra ser chave de um array na SESSION ? É esse ID pra informar, veja q no proprio codigo coloco um comentário, informando quais são os valores:


      @param integer $id é código do produto adicionado
      @param integer $qtd é quantidade
      @param integer $cor_id é a cor do produto

      Assim ficaria a index.php, para adicionar o produto ao carrinho:

      http://pastebin.com/3dCiuJMX

  25. Olá David, só uma dúvida que fiquei mas não consegui resolver, portanto vou postar aqui pra quem sabe auxiliar mais gente: como fazer com que o carrinho fique na mesma página, logo abaixo das seleções de produtos?

    exemplo:
    combobox 01 – produtos
    combobox 02 – característica do produto
    ————–
    listagem do carrinho (igual a sua aula)
    item 01 – qtde, cor, etc…
    item 02 – qtde, cor, etc…

    Obrigado, abraços

      1. exato! desta forma eu posso selecionar os itens, jogar na lista dos escolhidos (pra fazer mais uma triagem) e poder fazer a comparação, esta na verdade é a complicação. valeu pela ajuda

  26. Boa tarde David, incrível e simples o funcionamento do seu carrinho é excelente é um dos melhores que consegui encontrar para dar norteamento para o meu projeto, porém já tentei muito aqui para fazer o carrinho de compras enviar todos os dados para o API do pag seguro, por acaso você tem um exemplo para me ajudar, não sei mais o que fazer se puder ajudar ficarei grato, desde já agradeço pela compreensão e o apoio.

  27. Salve David! Cara, tenho certeza que vai poder me ajudar…
    Estou tentando dar uma quebra de linha/ou ocultar(, 2, ‘,’, ‘.) os 2 números depois da vírgula.
    Como podemos fazer isso?
    Já tentei colocar um span após , 2, ‘,’, ‘. e não deu certo.
    Grato desde já.

  28. Como ficaria com variações de preços, tipo tem um preço para cada tamanho, pequeno, medio, grande como ficaria o total do produto com essas variações?

  29. Olá david caso eu adicione um produto X tamanho P cor Verde
    e clique em continuar compraro e adiciono novamente
    produto X tamanho P cor Verde

    ele nao atualiza a quantidade sozinho…

    apenas manual?

    1. Willian, sim, no caso só manual, mas vc pode alterar fazendo assim:

       if(!isset($_SESSION['carrinho'][$indice])){
          $_SESSION['carrinho'][$indice] = (int)$qtd;
        }else{
          $_SESSION['carrinho'][$indice] += ;
      }
      

      Se não tiver o produto, e adicionar, se tiver e soma +1 pra quantidade

  30. Array
    (
    [cor_id] => Array
    (
    [0] => 4
    [1] => 3
    )

    )

    Notice: Array to string conversion in C:\xampp\htdocs\carrinhoOO\classes\Carrinho.class.php on line 61

    Array
    (
    [0] => Array
    (
    [0] => 4
    [1] => 3
    )

    )

    Notice: Trying to get property of non-object in C:\xampp\htdocs\carrinhoOO\classes\Carrinho.class.php on line 66

    if($items[‘cor_id’] > 0){
    $query_cor = BD::conn()->prepare(“SELECT * FROM `cores` WHERE id = ?”);
    $query_cor->execute(array($items[‘cor_id’])); /* linha 61 */
    $fetchCor = $query_cor->fetchObject();

    $retorno[$indice][‘cor’] = $fetchCor->cor; /* linha 66 */
    }

      1. Fernando, a quantidade cores, e opções pode ser ilimitados.

        TABELA opcoes (CORES, TAMANHO)
        TABELA opcoes_valores (azul, vermelho, grande, pequeno)
        TABELA produto_opcoes => aqui relaciona q opcoes terao os produtos
        TABELA produto_opcoes_valores => aqui relacionao os valores da opcoes com produto

    1. Fernando, verifica se referencia no array existe

      if(isset($items['cor_id']) &gt; &amp;&amp; is_numeric($items['cor_id']) &amp;&amp; $items['cor_id']  &gt; 0){
      $query_cor = BD::conn()-&gt;prepare(“SELECT * FROM `cores` WHERE id = ?”);
      $query_cor-&gt;execute(array($items['cor_id'])); /* linha 61 */
      $fetchCor = $query_cor-&gt;fetchObject();
      
      $retorno[$indice]['cor'] = $fetchCor-&gt;cor; /* linha 66 */
      }
      
  31. Boa tarde David,
    Assisti o vídeo que vc fez sobre o carrinho de compras e agora gostaria de implementar a cor no código relacionado com o carrinho de compras.
    Eu tenho uma dúvida relacionada com o Banco de Dados, ex:
    O campo cor_id é a coluna de uma tabela chamada cores ou uma coluna da própria tabela produtos?
    Quais campos preciso adicionar no Banco de Dados.
    Outra dúvida é relacionada a página Index.php, como vai ficar?
    Desde já, obrigado!

    1. Lucas, nesse caso, se for cor, vc teria o seguinte:

      TABELA cores => aqui teria todas cores cadastradas
      idCor
      nomeCor
      TABELA produto_cores => aqui teria o ID da cor e o ID do produto.
      idProdutoCor
      idCor
      idProduto

      Esse idProdutoCor, q será relacionado ao carrinho, dessa forma vc consegue pesquisar, qual a cor q pertence ao produto

  32. Boa Tarde blz, tentei de todas maneira copiando o seu script, digitando e nao da certo, poderia disponibilicar o codigo funcionando, e eu somente mudo as tabelas ak para a minha, fico no aguardo, obrigado

  33. Boa tarde, David. Tudo bem?

    Estou tendo um problema que não chega a ser relacionado com o post, mas lá vai.

    Os produtos da minha loja seguem o padrão do bloco k, onde cada variação de cor x tamanho do produto é tratado como um produto separado, sendo assim preciso que cada variação de cor seja um produto diferente.

    Ex.: Manta para sofá 230cm x 250cm laranja = Cod: masof230250lr1
    Manta para sofá 230cm x 270cm azul = Cod: masof230270az1

    Eu gostaria de saber se há algum módulo que faça com que as opções de cores ou tamanhos direcionem para links diferentes.

    Existe uma maneira de resolver isso?

    Uso opencart 2.1.0.1. Vlw

    1. Leonardo, pra vc fazer isso com OpenCart, por padrão, infelizmente não tem como. Isso vc consegue se cadastrar cada variação como produto, mas se vc tiver muitos, fica inviável.

  34. David, eu segui o primeiro tutorial, e estou tendo muita dificuldades de adaptar em incluir a opção de cor com este segundo, teria uma solução mais simples apenas para exibir o valor da cor no titulo do produto no carrinho com base no primeiro tutoral ?

    Na verdade preciso inlcuir tamanho e cor.

  35. Boa tarde, David.
    Não entendi como passar a cor da descrição para o carrinho, como tenho que mandar a variável da cor para o carrinho?

    Parabéns , estou usando todas as suas informações!!!

  36. Boa noite, David.
    Resolvi o meu problema, agora outro: como faço para recuperar de novo a variável da cor para gravar no banco de dados finalizando o carrinho.

    Espero que vc veja, estou no final do meu prazo e gostaria de finalizar usando sua solução que gostei muito!!!

    Abraço

    1. Luiz, no caso se pressupõe que esse atributo (cor) seja um campo de um tabela, exemplo:

      TABELA cores
      id
      nome
      codigo

      TABELA produtos
      id
      nome
      preco

      TABELA produtos_cores
      produto_id
      cor_id

      São 3 tabelas, uma dos produtos, um das cores, q uma tabela que vai relacionar a tabela dos produtos com as cores, pq um produto poderia ter mas de uma cor.

      Então com isso, você consegue ver essa parte:

      $_SESSION['carrinho'][ID:COR_ID] = 1;
      

      Usando o codigo, para salvar produto com cor no carrinho

      $carrinho = new Carrinho();
      
      $produto_id = $_POST['produto_id'];
      $cor_id     = $_POST['cor_id'];
      
      $carrinho->adicionar($produto_id, 1, $cor_id);
      

      Na hora de salvar no banco de dados, vc pode utilizar o método listarProdutos, que vai retornar o nome da cor, na variavel cor. Você pode incrementar, add também o id da cor, se preferir ao salvar no banco de dados.

      Na sua tabela pra salvar os produtos do pedido, vc pode salvar com cor do pedido,se não tiver cor, vc pode deixar em branco

      1. David, veja se entendi, desculpe minha ignorância, na pagina finalizar chamo novamente listarPedidos sem as atualizações do carrinho, ok? pego os indeces da função (exemplo: $result[$indice][‘preco’] = $row[‘preco’];) e passo para uma variável, aí faço um insert dentro do foreach, é isso?

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *