PHP Session

Boa noite, estou tentando desenvolver meu primeiro ecommerce mas não consigo passar os dados de uma pagina para outra utilizando sessions. Consigo trazer o produto escolhido da pagina index para a pagina precompra mas na hora de passar para o carrinho estou encontrando dificuldade de montar o script. Agradeceria, se possivel, me mostrar onde estou errando:

esta é a pagina precompra onde eu trago o codigo do produto e faço a exibição, pego a quantidade do item exibido e estou tentando enviar os dados para montar a pagina carrinho mas não estou conseguindo:

    <div class="container">
    <?php

$action = “”;
$id = “”;
$comando = “”; //Nova variavel!

if (isset($_GET[“id”])) {
$id = $_GET[‘id’];
$comando = “ATUALIZAR”;
$ehAlteracao = true;
} else {
if (isset($_POST[“codigo_barras”])) {

     $id = buscaIDdoProdutoPeloCodigoInterno($conexao, $_POST["codigo_barras"]); //Funcao que pesquisa o codigo e retorna o ID do registro no banco (se existir)
         $comando = "NOVO";
         $ehAlteracao = false;
    } else {
        $comando = "ATUALIZAR";
        $ehAlteracao = true;
    }
}

if ($comando == “NOVO”){
$mensagem = “Produto não localizado!”;
$action = “index.php”;
$produto = new Produto("", “”, “”, “”, “”);

//Alteração - Preencher automaticamente o código
$Produto->setCodigo($_POST["codigo_barras"]); 

}
if ($comando == “ATUALIZAR”){
$produto = buscaProduto($conexao, $id);
$ehAlteracao = true;
$codigo = $produto->getCodigo();
$mensagem = “Produto localizado!”;
$action = “carrinho.php”;
}

?>

      <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="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() ,
'imagem' => $produto->getFoto() ,
'quantidade' => $produto->getquantidade()
);
  // 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'];
      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'=>$produto['quantidade']];
          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'=>$produto['quantidade']];
    }
  }
   }
 }
}
 ?>

essa é a pagina do carrinho onde estou tentando pegar os dados da precompra mas também não estou conseguindo:

 <?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>";
}


?>
<tbody>
                            <tr>
                                <td>
                                    <div class="img-container">
                                    <img src="../cadastro/fotos/<? $detalhes['imagem']?>"alt="Foto" />
                                    </div>
                                </td>
                                <td class="td-name">
                                   <? $detalhes['nome']?>
                                </td>
                                <td>
                                    
                                    <p>
                                  <? $detalhes['descricao']?></p>
                                </td>

                                <td class="td-number">
                                    <small>R&dollar;</small><?$detalhes['preco']?>
                                </td>
                                <td class="td-number">
                                    <small>x</small><?$detalhes['itens']?>
                                </td>
                                <td class="td-number">
                                    <small>R&dollar;</small><?$total += $detalhes['itens'] * $detalhes['preco'];?>
                                </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">
                                                    <h3><i class="fa fa-shopping-cart"></i></h3>

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

                         <td>

Alguns pontos a considerar…

Sempre que usar a super global SESSION, deve chamar uma função antes, de preferência no topo da página assim…

<?php
session_start();
....

Essa linha…

if (isset($POST["codigobarras"])) {

Não seria…

if (isset($_POST["codigo_barras"])) {

Alguma mensagem de erro?

Obrigado Rodevops, eu reescrevi o codigo, fiz alguns progressos utilizando o script que encontrei na internet. Mas minha maior duvida é que em uma parte (do script que copiei) ele mostra os produtos utilizando echo e eu consigo exibir a quantidade. E na parte que eu escrevi bucaproduto (orientado a objetos) consigo exibir a imagem, nome, descrição e preço do produto. A pagina tem duas informações separadas que precisam estar juntas. Ta terrivel isso e não consigo avançar.

Segue o novo codigo:

<div class="row">
<?php $produto = buscaProduto($conexao, $id); $id = $_SESSION['carrinho']; ?>
            <div class="col-md-8">
                <h2>Seu Carrinho de Compras</h2>
            </div>
            <form action="?acao=up" method="post">
Continuar Comprando
            <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>
                    <?php
                     if(count($_SESSION['carrinho']) == 0){
                        echo '
                     <tr>
                     <td colspan="2">Carrinho Vazio</td>
                     </tr>';
                     }else{
                              $total = 0;
                        foreach($_SESSION['carrinho'] as $id => $qtd){                                  
                                 $produto = buscaProduto($conexao, $id);                        
                               
                              $nome  = $ln['nome'];
                              $preco = number_format($ln['preco'], 2, ',', '.');
                              $sub   = number_format($ln['preco'] * $qtd, 2, ',', '.');
                               
                              $total += $ln['preco'] * $qtd;
                            
                           echo '
   <tr>
   <td>
   <div class="img-container">
    <img src="../cadastro/fotos/<?=$produto->getFoto() ?>" width="235px" height="200px" 
    </div>
     </td>                                         
   <td>'.$nome.'</td> 
   <td><input type="text" size="3" name="prod['.$id.']" value="'.$qtd.'" /></td>
   <td>R$ '.$preco.'</td> 
    <td>R$ '.$sub.'</td> 
     <td><a href="?acao=del&id='.$id.'">Remove</a></td>
   </tr> 
     ';
    }
  $total = number_format($total, 2, ',', '.');
   echo '
 <tr>                                         
 <td colspan="4">Total</td> 
 <td>R$ '.$total.'</td>
  </tr> 

';
?>

                        <tr>
                            <td>
                                <div class="img-container">
                               <img src="../cadastro/fotos/<?=$produto->getFoto() ?>" width="235px" 
                                height="200px" 
                                </div>
                            </td>
                            <td class="td-name">
                               <?=$produto->getnome() ?>
                            </td>
                            <td>
                                
                                <p>
                               <?=$produto->getDescricao() ?>
                            </td>
                            <td class="td-number">
                                <small>R&dollar; <?=$produto->getPreco() ?>
                            </td>
                            <td class="td-number">
                                <small>x</small>
                                <input type="text" size="3" name="prod['.$id.']" value="'.$qtd.'"/>
                            </td>
                            <td class="td-number">
                                <small>R&dollar;</small><?$total += <?=$produto->getQuantidade() ?> * <?
                             =$produto->getPreco() ?>
                            </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">
                                                <h3><i class="fa fa-shopping-cart"></i></h3>
                                            </div>
                                    </div>
                                </td>
                     <td>
             <?php
          }
        ?>

Nesse caso vamos por partes, qual seria o trecho que você pretende guardar o produto na sessão?

oi Rodrigo é esse aqui que faz parte do que eu copiei da internet:

<?php session_start(); if(!isset($_SESSION['carrinho'])){ $_SESSION['carrinho'] = array(); } //adiciona produto if(isset($_GET['acao'])){ //ADICIONAR CARRINHO if($_GET['acao'] == 'add'){ $id = intval($_GET['id']); if(!isset($_SESSION['carrinho'][$id])){ $_SESSION['carrinho'][$id] = 1; }else{ $_SESSION['carrinho'][$id] += 1; } } //REMOVER CARRINHO if($_GET['acao'] == 'del'){ $id = intval($_GET['id']); if(isset($_SESSION['carrinho'][$id])){ unset($_SESSION['carrinho'][$id]); } } //ALTERAR QUANTIDADE if($_GET['acao'] == 'up'){ if(is_array($_POST['prod'])){ foreach($_POST['prod'] as $id => $qtd){ $id = intval($id); $qtd = intval($qtd); if(!empty($qtd) || $qtd <> 0){ $_SESSION['carrinho'][$id] = $qtd; }else{ unset($_SESSION['carrinho'][$id]); } } } } } ?>

Bom se bem entendi, você quer unificar tanto os dados do produto quanto a quantidade na sessão certo, nesse caso o trecho do acao == add poderia ficar assim,…

if($_GET['acao'] == 'add'){
    $id = intval($_GET['id']);
    if(!isset($_SESSION['carrinho'][$id])){
        $produto = buscaProduto($conexao, $id);
        $_SESSION['carrinho'][$id]['produto'] = $produto;
        $_SESSION['carrinho'][$id]['qtd'] = 1;
    }else{
        $_SESSION['carrinho'][$id]['qtd'] += 1;
    } 
}

Isso estou imaginando que o objeto $produto vindo da função buscaProduto… não tem um método getQuantidade… agora se ele tiver você pode fazer dessa forma…

if($_GET['acao'] == 'add'){
    $id = intval($_GET['id']);
    if(!isset($_SESSION['carrinho'][$id])){
        $produto = buscaProduto($conexao, $id); // pega do banco 1 unica vez
        $produto->setQuantidade(1); // atualiza quantidade
        $_SESSION['carrinho'][$id] = $produto; // guarda na sessão
    }else{
        $produto = $_SESSION['carrinho'][$id]; // pega da sessão
        $produto->setQuantidade($produto->getQuantidade() + 1); // atualiza quantidade
        $_SESSION['carrinho'][$id] = $produto; // devolve ao carrinho atualizado
    } 
}

Dessa ultima forma você consegue ajustar na listagem, mantendo tudo orientado a objetos chamando os métodos getFoto, getDescricao, etc… espero ter ajudado

Isso mesmo Rodrigo, eu não tenho a quantidade no getProduto porque eu acho que eu poderia fazer uma nova função para receber os parâmetros e enviar ao BD. você acha que isso é o correto?

Troquei a função e não sei onde errei seguem os erros que houveram: (eu acho que batemos na trave)

otice: A session had already been started - ignoring session_start() in C:\Bitnami\wampstack-5.6.30-5\apache2\htdocs\florencabasico\carrinho.php on line 14
Notice: Undefined variable: ln in C:\Bitnami\wampstack-5.6.30-5\apache2\htdocs\florencabasico\carrinho.php on line 198
linha 198-> $nome = $ln[‘nome’];

Notice: Undefined variable: ln in C:\Bitnami\wampstack-5.6.30-5\apache2\htdocs\florencabasico\carrinho.php on line 199
linha 199-> $preco = number_format($ln[‘preco’], 2, ‘,’, ‘.’);

Notice: Undefined variable: ln in C:\Bitnami\wampstack-5.6.30-5\apache2\htdocs\florencabasico\carrinho.php on line 200
linha 200-> $sub = number_format($ln[‘preco’] * $qtd, 2, ‘,’, ‘.’);

Fatal error: Unsupported operand types in C:\Bitnami\wampstack-5.6.30-5\apache2\htdocs\florencabasico\carrinho.php on line 200