Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

PHP - Carrinho de Compras

Boa tarde, estou tentando desenvolver minha primeira loja virtual e estou com problemas na hora de enviar e receber os produtos no carrinho de compras. Preciso enviar um ou mais produtos escolhidos para a pagina do carrinho de compras e exibi-los mas não estou conseguindo. Poderiam examinar meu código e me corrigir?

Este é a pagina pre-compra.php onde recebo o produto da pagina principal, o cliente escolhe a quantidade e envio para a pagina carrinho de compras:

<div class="wrapper">
    <div class="section">    
        <div class="container">
 <?php

$action = "";
$id = "";
$comando = ""; 

if (isset($_GET["id"])) {
        $id = $_GET['id'];
           $comando = "ATUALIZAR";
                $ehAtualizacao = true;
} else {
             if (isset($_POST["codigo_barras"])) {

         $id = buscaIDdoProdutoPeloCodigoInterno($conexao, $_POST["codigo_barras"]); 
             $comando = "NOVO";
             $ehAtualizacao = false;
        } else {
            $comando = "ATUALIZAR";
            $ehAtualizacao = true;

        }
    }
      $Produto->setCodigo($_POST["codigo_barras"]); 
} 
   if ($comando == "ATUALIZAR"){
     $produto = buscaProduto($conexao, $id); 
    $ehAtualizacao = true;
    $codigo = $produto->getCodigo();
    $mensagem = "Produto localizado!";
    $action = "carrinho.php";
    }

?>
<form action="<?=$action ?>" method="post">
    <input type="hidden" name="id" value="<?=$produto->getId() ?>" />

          <div class="row">
            <div class="col-md-6">
               <div class="tab-content">
                    <div class="tab-pane active" id="product-page1">
                        <img src="../cadastro/fotos/<?=$produto->getFoto() ?>" width="235px" height="245px" width="auto" height="auto"  alt="..." />
                    </div>

                </div>

                <div class="clearfix"></div>
            </div>


            <div class="col-md-6">
                <div class="product-details">
                  <a href="#">
                      <h3 class="title"><?=$produto->getMarca()->getNome() ?></h3>
                  </a>
                  <p class="description">
                   <?=$produto->getnome() ?>
                  </p>

                  <h4><span class="price">R&dollar; <?=$produto->getPreco() ?></span></h4>
                </div>
                <div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true">
                  <div class="panel panel-default">
                    <div class="panel-heading" role="tab" id="headingOne">
                      <h4 class="panel-title">
                        <a data-toggle="collapse" data-parent="#accordion" href="#collapseOne" aria-expanded="true" aria-controls="collapseOne">
                          Descrição do Produto
                        </a>
                      </h4>
                    </div>
                    <div id="collapseOne" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="headingOne">
                      <div class="panel-body">                   

                            <?=$produto->getDescricao() ?>
                      </div>
                    </div>
                  </div>
                  <div class="panel panel-default">
                    <div class="panel-heading" role="tab" id="headingTwo">
                      <h4 class="panel-title">
                        <a class="collapsed" data-toggle="collapse" data-parent="#accordion" href="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo">
                          Composição do Produto
                        </a>
                      </h4>
                    </div>
                    <div id="collapseTwo" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingTwo">
                      <div class="panel-body">
                        <ul style="padding-left: 20px;">
                            <li style="list-style-position: outside;"> 100% Porcelana</li>
                            <li style="list-style-position: outside;"> Tinta Atóxica</li>
                            <li style="list-style-position: outside;"> Modelo Americano</li>
                        </ul>
                      </div>
                    </div>
                  </div>
                </div>
                </div>
                      </div>
                </div> <!-- Acordeon  -->
            </div>
          </div>
          <div class="row">
            <div class="col-md-6 col-md-offset-6">
              <div class="actions">
                <div class="pull-left">
                  <div class="form-group">
                          <select name="huge" class="selectpicker" data-style="btn" data-menu-style="dropdown-blue">
                          <option value="en" selected="">Selecione a Quantidade</option>
                          <option value="quantidade">1</option>
                          <option value="quantidade">2</option>
                          <option value="quantidade">3</option>
                          <option value="quantidade">4</option>
                          <option value="quantidade">5</option>
                        </select>
                        <a href="carrinho.php">
                  <button type="button" class="btn btn-success btn-fill" type="submit">Adicionar ao Carrinho</button></a>
                        <a href="index.php">
                  <button type="button" class="btn btn-fill">Ver Mais Produtos</button></a>

                    </div>
                </div>
               </div>
            </div>
          </div>

        </div>
    </div>

    </form>

<?php
    $_SESSION['produto']{ $produto->getId()} = array(
    'nome' => $produto->getnome() ,
    'preço' => $produto->getPreco() ,
    'descricao' => $produto->getDescricao() ,
    'quantidade' => 'quantidade'
);

// adicionar itens ao carrinho
if(isset($_GET['produto']) && isset($_GET['a'])){
  if($_GET['a'] == 'adicionar'){
    if(!empty($_SESSION['carrinho'])){
      foreach($_SESSION['carrinho'] as $item => $produto){
        if($item == $_GET['produto']){
          $_SESSION['carrinho'][$item]['quantidade'] = $produto['quantidade'] + 1;
          break;
        } else {
          foreach($produtos as $produto){
            if($produto['id'] == $_GET['produto']){
              $_SESSION['carrinho'][$produto['id']] = ['nome'=>$produto['nome'], 'preco'=>$produto['preco'], 'descricao'=>$produto['descricao'],'quantidade'=>1];
              break;
            }
          }
        }
      }
    } else {
      foreach($produtos as $produto){
        if($produto['id'] == $_GET['produto']){
          $_SESSION['carrinho'][$produto['id']] = ['nome'=>$produto['nome'], 'preco'=>$produto['preco'],'descricao'=>$produto['descricao'], 'quantidade'=>1];
        }
      }
    }
  }
}
  ?>

Esta é a pagina carrinho.php onde recebo os produtos e faço as exibições:

<form action="checkout.php" method="POST">

 <?php
 if(!empty($_SESSION['carrinho'])){
    $total = 0;
    print "<strong> carrinho (" . count($_SESSION['carrinho']) . ")</strong><br>";
    foreach($_SESSION['carrinho'] as $item => $detalhes){
        print $detalhes['nome'] . " x " . $detalhes['quantidade'] . $detalhes['descricao'] ."<br>";
        $total += $detalhes['quantidade'] * $detalhes['preco'];
    }
    print "<strong>total: </strong>" . number_format($total, 2);
} else {

    print "<center><h4><br><br>carrinho vazio</h4></center>";
}


?>
<div class="row">
                <div class="col-md-8">
                    <center><h2>Seu Carrinho de Compras</h2></center>
                </div>
                <div class="col-md-10 col-md-offset-1">
                    <div class="table-responsive">
                    <table class="table table-shopping">
                        <thead>
                            <tr>
                                <th class="text-center"></th>
                                <th >Produto</th>
                                <th class="th-description">Descricao</th>
                                <th class="text-right">Preco</th>
                                <th class="text-right">Quantidade</th>
                                <th class="text-right">Valor</th>
                                <th></th>
                            </tr>
                        </thead>
                        <tbody>
                            <tr>
                                <td>
                                    <div class="img-container">
                                        <img src="assets/img/shopping.jpg" alt="...">
                                    </div>
                                </td>
                                <td class="td-name">
                                    'Moleskine Agenda'
                                </td>
                                <td>
                                    <b>Meeting Notes</b>
                                    <p>
                                    Most beautiful agenda for the office, really nice paper and black cover. Most beautiful agenda for the office.</p>
                                </td>

                                <td class="td-number">
                                    <small>R&dollar;</small>49
                                </td>
                                <td class="td-number">
                                    <small>x</small>25
                                </td>
                                <td class="td-number">
                                    <small>R&dollar;</small>1,225
                                </td>
                                <td class="td-actions">
                                           <button type="button" rel="tooltip" data-placement="left" title="Remover item" class="btn btn-danger btn-simple btn-icon ">
                                        <i class="fa fa-times"></i>
                                    </button>                                    
                                </td>
                            </tr>

                                <tr>
                                     <td class="td-actions">
                                         <div class="info info-horizontal">
                                                <div class="icon icon-blue icon-sm">
                                                    <i class="fa fa-shopping-cart"></i>

                                                </div>
                                        </div>
                                    </td>

                         <td>


                            <div class="description">

                                <h4> Digite seu CEP: </h4>                                   

                                            <a href="javascript: void(0);">Buscar Cep</a>

                            </div>
                        </td>

                        <td>
                        <div class="form-group has-success">
        <input type="text" value="" class="form-control" placeholder="00000-000"/>

    </div>
    </td>

    <td class="td-number">
                                  <button class="btn btn-primary btn-fill">Consultar</button>
                                </td>
                                <td class="td-number">
                                    <p>Valor do Envio Sedex</p>
                                </td>

                            <td class="td-number">
                                    <small>R&dollar;</small>5,99
                                </td>    
       </div>

     </div>
            </td>
            </tr>

                            <tr>
                                <td colspan="2"></td>
                                <td></td>
                                <td class="td-total">
                                   Total
                                </td>
                                <td class="td-price">
                                    <small>R&dollar;</small>12,999
                                </td>
                                <td> <button type="submit" class="btn btn-info btn-fill btn-l" ahref="login.php">Finalize seu Pedido <i class="fa fa-chevron-right"></i>
                             </button></td>

                                <td></td>
                            </tr>



                        </tbody>
                    </table>

                    </div>

                </div>
            </div>

        </div><!-- end container -->
5 respostas

Sergio, bom dia.

Não sei se você já está utilizando, mas, enquanto em desenvolvimento,é recomendado colocar em todas as páginas o comando "error_reporting(E_ALL);" para que todas as mensagens de erro sejam exibidas.

Primeiramente, ao trabalhar com sessões, você deve garantir sua iniciação em todas as páginas. Apenas para garantir, certifique-se que session_start sempre esteja presente no seu código.

Se o problema não for o session_start, você pode nos passar mais informações sobre o seu problema?

Em que momento ocorre o problema? Aparece alguma mensagem de erro? A tela fica em branco?

Oi Diego obrigado pelo retorno. Fiz como você sugeriu e inseri a linha de error em todas as paginas. Vou tentar explicar o problema que ocorre e minha forma de pensar para você me corrigir, se possível, onde eu estiver errando:

1) na pagina precompra.php eu trago o id do produto escolhido e mostro para o usuário. isto eu consigo. ok. Estou tentando passar para o carrinho o item escolhido através de uma session. (você verá abaixo nos codigos que todas as paginas estão iniciando com session) 2) Na pagina carrinho.php não estou conseguindo exibir o produto (com a quantidade escolhida). Eu montei uma session para ver se o item aparecia e também para ver se escolhido outro item ele somava, mas não estou conseguindo segue o erro que aparece:

carrinho vazio

Este é o que eu quero que mostre quando não houver sido enviado o item para o carrinho, ou seja, eu não estou conseguindo receber o item no carrinho

Você poderia me ajudar? Obrigado!

Seguem os códigos para você verificar onde estou errando:

precompra.php (onde eu deveria colocar o produto incluindo a quatidade escolhida na session e enviar para o carrinho):

<?php"error_reporting(E_ALL);"?>
<?php require_once ("head.php") ?>
<?php require_once ("../cadastro/conecta.php") ?>
<?php require_once ("../cadastro/banco-produto.php") ?>
<?php require_once ("../cadastro/banco-categoria.php") ?>
<?php require_once ("../cadastro/banco-marca.php") ?>
<?php require_once ("../cadastro/produto.php") ?>
<?php require_once ("../cadastro/categoria.php") ?>
<?php require_once ("../cadastro/marca.php") ?>
<?php require_once ("../cadastro/subcategoria.php") ?>
<?php require_once ("../cadastro/produtoDAO.php") ?>

<?php

session_start();

$_SESSION['carrinho'] = null;

if(!isset($_SESSION['carrinho'])){
  $_SESSION['carrinho'] = array();
}
?>
<body class="product-page">
<?php
    $_SESSION['produto']{ $produto->getId()} = array(
    'nome' => $produto->getnome() ,
    'preço' => $produto->getPreco() ,
    'descricao' => $produto->getDescricao() ,
    'itens' => $produto->getitens()
);

// adicionar itens ao carrinho
if(isset($_GET['produto']) && isset($_GET['a'])){
  if($_GET['a'] == 'adicionar'){
    if(!empty($_SESSION['carrinho'])){
      foreach($_SESSION['carrinho'] as $item => $produto){
        if($item == $_GET['produto']){
          $_SESSION['carrinho'][$item]['itens'] = $produto['itens'] + 1;
          break;
        } else {
          foreach($produtos as $produto){
            if($produto['id'] == $_GET['produto']){
              $_SESSION['carrinho'][$produto['id']] = ['nome'=>$produto['nome'], 'preco'=>$produto['preco'], 'descricao'=>$produto['descricao'],'itens'=>1];
              break;
            }
          }
        }
      }
    } else {
      foreach($produtos as $produto){
        if($produto['id'] == $_GET['produto']){
          $_SESSION['carrinho'][$produto['id']] = ['nome'=>$produto['nome'], 'preco'=>$produto['preco'],'descricao'=>$produto['descricao'], 'itens'=>1];
        }
      }
    }
  }
}
  ?>

Esta é o carrinho.php na parte onde deveria receber o item:

<?php"error_reporting(E_ALL);"?>
<?php require_once ("head.php") ?>

<?php session_start(); ?>

<body class="product-page">
<form action="checkout.php" method="POST">

 <?php
 if(!empty($_SESSION['carrinho'])){
    $total = 0;
    print "<strong> carrinho (" . count($_SESSION['carrinho']) . ")</strong><br>";
    foreach($_SESSION['carrinho'] as $item => $detalhes){
        print $detalhes['nome'] . " x " . $detalhes['itens'] . $detalhes['descricao'] ."<br>";
        $total += $detalhes['itens'] * $detalhes['preco'];
    }
    print "<strong>total: </strong>" . number_format($total, 2);
} else {

    print "<center><h4><br><br>carrinho vazio</h4></center>";
}


?>

Sergio, bom dia.

O controle de erros deve estar sem aspas.

<?php error_reporting(E_ALL); ?>

No momento não consigo testar o código. Assim que chegar em casa testo para ver se consigo lhe ajudar.

Muito obrigado Diego.

solução!

Pessoal, boa tarde segue link de video aula sobre como fazer o carrinho de compras e também integração com pagseguro, espero que ajuda a quem estiver com duvidas:

http://www.davidchc.com.br/video-aula/php/carrinho-de-compras-com-php/

Quem precisar do cálculo do Frete via Sedex segue link do topico que trata deste assunto:

http://www.davidchc.com.br/video-aula/php/carrinho-de-compras-com-php/#comment-615