Ir para conteúdo
rodolfo_alves

Gravar dados de uma lista de session em um bd. ex.: Carrinho de Compras

Recommended Posts

Olá pessoas, sou novato em PHP, estou estudando a linguagem e ao mesmo tempo tentando criar algo com o que aprendi. Quando tenho dúvidas procuro na net, tópicos e ou scripts já prontos que me façam entender. Todavia desta vez não encontrei algo claro.

Estou criando um mini sistema de vendas, do qual me permite adicionar uma lista de itens. Daí está o problema, como não tenho um conhecimento avançado de arrays não estou sabendo pegar os dados da lista criada e passar para o BD. Só consigo passar a última informação criada na lista.

 

image.thumb.png.6b30876b06c6d40aa0200fcbfe9651da.png

Aqui está o exemplo.

 

<?php
 	// inicio consulta url
    if(!isset($_SESSION['itens'])){
    	$_SESSION['itens'] = array();
    }

    if(isset($_GET['acao'])){

    	$id = $_GET['id'];

    	// Adiciona ao carrinho
    	if($_GET['acao'] == 'add'){
    		if(!isset($_SESSION['itens'][$id])){
    			$_SESSION['itens'][$id] = 1;
    		}else{
    			$_SESSION['itens'][$id] += 1;
    		}
    	}


    	// Diminui carrinho
    	if($_GET['acao'] == 'dim'){
    		if(!isset($_SESSION['itens'][$id])){
    			$_SESSION['itens'][$id] = 1;
    		}else{
    			if($_SESSION['itens'][$id] > 1)
    			$_SESSION['itens'][$id] -= 1;
    		}
    	}


    	//deleta item do carrinho
    	if($_GET['acao'] == 'del'){
    		$id = intval($_GET['id']);
    		if(isset($_SESSION['itens'][$id])){
    			unset($_SESSION['itens'][$id]);
    		}
    	}


    	
    }

 	// fim consulta url 

 	// inicio consulta para adicionar
 	if(count($_SESSION['itens']) == 0){

 ?>

                              <br>
                              <div class="alert alert-danger alert-dismissible">
                                <button type="button" class="close" data-dismiss="alert">&times;</button>
                                <strong>LISTA VAZIA:</strong> Para adicionar produtos/servicos realize a busca.
                              </div>
                              <br>

<?php
	}else{
		require_once('db.class.php');
		$objDb = new db();
		$link = $objDb -> conecta_mysql();

		$total = 0;
		foreach ($_SESSION['itens'] as $idProdutos => $quantidade) {
			$sql = "SELECT * FROM produtos WHERE id='$idProdutos'";
			$consultado = mysqli_query($link, $sql) or die(mysql_error());
			$linha = mysqli_fetch_array($consultado);

			$id = $linha['id'];
			$codigo = $linha['codigo'];
			$produto = $linha['produto'];
			$quantidade_disp = $linha['qtd'];
			$valor = $linha['valor'];
			$subTotal = $linha['valor'] * $quantidade;

			$total += $linha['valor'] * $quantidade;

?>
						<tr>
                          <td><input type="hidden" name="codigo_produto" value=""><?= $codigo; ?></td>

                          <td><input type="hidden" name="nome_produto" value=""><?= $produto; ?></td>
                          
                          <td><input type="hidden" name="qtd_produto" value=""><?= $quantidade_disp; ?></td>
                          
                          <td>
                          	
                          	<a href="gerar_pedidos_admin.php?acao=dim&id=<?= $id; ?>"><span class="glyphicon glyphicon-minus" style="color: red"></span></a>
                          	<input type="number" name="qtd_produto1" min="1" max="<?= $quantidade_disp; ?>" value="<?= $quantidade; ?>">
                          	<a href="gerar_pedidos_admin.php?acao=add&id=<?= $id; ?>"><span class="glyphicon glyphicon-plus" style="color: green"></span></a>


          
                          </td>
                          
                          <td><input type="hidden" name="valor_produto" value="">R$ <?= number_format($valor,2,",", "."); ?></td>

                          <td>R$ <?= number_format($subTotal,2,",", ".");?></td>
                        
                        <td><a href="gerar_pedidos_admin.php?acao=del&id=<?= $id; ?>"><span class="glyphicon glyphicon-remove" style="color: red;"></span></a></td>
                        </tr>
<?php
		}

?>
<tr>
                         	<td></td>
                         	<td></td>
                         	<td></td>
                         	<td></td>
                         	<td></td>
                         	<td></td>
                         	<td><label>Total</label><br>R$ <input type="hidden" name="total_pedido" value=""><?= number_format($total,2,",", ".");?></td>
                         </tr>

<?php

	}
?>

A pergunta e dúvida é como posso pegar os dados da lista e adicionar ao BD. Eu sei que é para usar um foreach ou um while, todavia só consigo passar a última informação da lista de modo repetido. Gostaria de uma ajuda. Não precisa faz de acordo com o meu código, gostaria de um exemplo prático.

 

Abçs.

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, para adicionar ao seu BD creio que você precisa do id do produto(índice do array) e a quantidade(valor do array)..

 

pega o índice: 

array_keys()

pega o valor:

array_values()

agora basta usar com INSERT.

 

2 horas atrás, rodolfo_alves disse:

foreach

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, infelizmente não consegui...

Fiz o mesmo exemplo é um código menor, para um melhor entendimento.

<?php
session_start();
if(!isset($_SESSION['itens'])){
   $_SESSION['itens'] = array();
}

if(isset($_GET['acao'])){

   $id = $_GET['id'];

   if($_GET['acao'] == 'add'){
      if(!isset($_SESSION['itens'][$id])){
         $_SESSION['itens'][$id] = 1;
      }else{
         $_SESSION['itens'][$id] += 1;
      }
   }
 

  //REMOVER CARRINHO
   if($_GET['acao'] == 'del'){
      $id = intval($_GET['id']);
      if(isset($_SESSION['itens'][$id])){
         unset($_SESSION['itens'][$id]);
      }
   }


}



?>





<form method="post" action="carrinho.php">
<table style="width: 900px">     
   <tr>
      <td>ID</td>
      <td>Produto</td>
      <td>Qtd Disponível</td>
      <td>Qtd Desejada</td>
      <td>Valor</td>
      <td>Sub-Total</td>
      <td>Excluir</td>
   </tr>

// EXIBE O CARRINHO



<?php
      if(count($_SESSION['itens']) == 0){
         echo '<tr><td colspan="5">Não há produto no carrinho</td></tr>';
      }else{
         require_once('db.class.php');
         $objDb = new db();
         $link = $objDb -> conecta_mysql();
         $total = 0;
         foreach($_SESSION['itens'] as $idProdutos => $quantidade){
               $sql   = "SELECT *  FROM testando WHERE id= '$idProdutos'";
               $qr    = mysqli_query($link, $sql) or die(mysql_error());
               $ln    = mysqli_fetch_assoc($qr);
                 
               $id = $ln['id'];
               $nome  = $ln['produto'];
               $qtd_disponivel  = $ln['qtd'];
               $preco   = $ln['valor'];
               $subTotal = $ln['valor'] * $quantidade;
               
?>

   
   <tr>
      <td><input type="hidden" name="idProd" value="<?= $id; ?>"><?= $id; ?></td>
      <td><input type="hidden" name="nome" value="<?= $nome; ?>"><?= $nome; ?></td>
      <td><?= $qtd_disponivel; ?></td>
      <td><input type="number" name="qtd_escolhida" value="<?= $quantidade; ?>" min="1" max="<?= $qtd_disponivel; ?>"></td>
      <td><input type="hidden" name="preco" value="<?= $preco; ?>"><?= number_format($preco,2,",", "."); ?></td>
      <td><input type="hidden" name="subTotal" value="<?= $subTotal; ?>"><?= number_format($subTotal,2,",", "."); ?></td>
      <td><a href="carrinho.php?acao=del&id=<?= $idProdutos?>">Excluir</a></td>
   </tr>
<?php
      }         
   }
?>


<?

if(isset($_POST['enviar'])){
   require_once('db.class.php');

   isset($_SESSION['itens']);


   foreach ($_SESSION['itens'] as $indice => $valor) {
      require_once('db.class.php');
      $objDb = new db();
      $link = $objDb -> conecta_mysql();

      $sql_insere = "INSERT INTO salvando(nome, qtd_escolhida, valor, subTotal) VALUES('$nome', '$quantidade', '$idProdutos', '$idProdutos')";
      $inserido = mysqli_query($link, $sql_insere);
   }

}

?>


</table>
<input type="submit" value="enviar" name="enviar">
</form>

 

 

Sendo que o modo que fiz foi dessa forma, dessa forma ele consegue pegar o valor do ID e da Quantidade de Sessões, todavia só salva valores repetidos.

 

<?

if(isset($_POST['enviar'])){
   require_once('db.class.php');

   isset($_SESSION['itens']);


   foreach ($_SESSION['itens'] as $indice => $valor) {
      require_once('db.class.php');
      $objDb = new db();
      $link = $objDb -> conecta_mysql();

      $sql_insere = "INSERT INTO salvando(nome, qtd_escolhida, valor, subTotal) VALUES('$nome', '$quantidade', '$preco', '$subTotal')";
      $inserido = mysqli_query($link, $sql_insere);
   }

}

 

 

 

 

Editado por rodolfo_alves
erro

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por martinazzo
      Olá pessoal,
       
      sou novo por aqui e não sei bem como funciona, mas sei que preciso de uma ajuda kkkkk
      se puderem me dar uma mão ficaria grato;
       
      Estou tendo problemas em como pegar id de uma linha clicada em uma table, que já recebe os dados de um bd. Eu gostaria de poder editar os campos e salvar no banco de dados usando o ID da linha clicada;
       
      Vou colar o código abaixo, não reparem na bagunça kkkkk
       
      conexao.php
       
      <?php
      $server = "XXXXX";         Conferido e esta correto;
      $username = "XXXXX";  Conferido e esta correto;
      $password = "XXXXX";  Conferido e esta correto;
      $dbname = "XXXXX";     Conferido e esta correto;
      $conn = mysqli_connect($server, $username, $password, $dbname);
      ?>
       
      altera.php
       
      <?php 
      $link = mysqli_connect("XXXXXX", "XXXXX", "XXXXX", "XXXXXX"); Conferido
      $sql = "SELECT * FROM interface ";
      $consulta = mysqli_query($link, $sql);
      ?>
      <!DOCTYPE html>
      <html>
      <head>
      <meta charset="UTF-8">
      <meta http-equiv="refresh" content="30">
      <link rel="stylesheet" type="text/css" href="style.css">
      <script src="sorttable.js"></script>
      <title>Dashboard</title>
      <?php 
      session_start();
      if(!isset($_SESSION['login']) and !isset ($_SESSION['senha'])){
          session_destroy();
        unset($_SESSION['login']);
        unset($_SESSION['senha']);
        header('location:index.html');
        
        }
        
      ?>

      </head>
      <body>
      <a href="index.php"><img src="img/ditec_smart_hor_150px.png"></a>
      <div class="borda_titulo">
      <h2><center>DIMILK | Equipamentos</font></h2></center></div><br /><br />
      <form name="equipamento" action="salva.php" method=post>
      <center><table id="minhaTabela" border="3" class="sortable" bgcolor="#1E90FF">
        <tr>
        <th><center>ID </center></th>
        <th><center>MAC</center></th>
        <th><center>Habilitado</center></th>
        <th><center>Descrição</center></th>
        <th><center>Altura Tarro</center></th>
        <th><center>Área Tarro</center></th>
        <th><center>Alterar</center></th>
        </tr>
        
          <?php while($registro = mysqli_fetch_assoc($consulta)){
              echo '<tr bgcolor="#ADD8E6" scope="row">';
              echo '<td name="id"><center>'.$registro["id"].'</center></td>';
              echo '<td name="mac"><center>'.$registro["mac"].'</center></td>';
              echo '<td><center><input type="checkbox" name="status" value="$teste"><br></center></td>';
              echo '<td id="linha_desc"><textarea name="desc" type=text placeholder="'.$registro["descricao"].'" /></textarea></td>';
              echo '<td><input name="altura" type=text style="width: 70px;" placeholder="'.$registro["altura_latao"].' cm" /></td>';
              echo '<td><input name="area" type=text style="width: 70px;" placeholder="'.$registro["area_latao"].' cm" /></td>';
              
              echo '<td><form method="get" action="salva.php"><center><button class="voltar" type="submit">Salvar</button></center></form><br />';
              echo '</tr>';
              }
          echo '</tbody></table></form>';
          
          ?></center><br />
          
              <div>            
                  <form method="get" action="index.html">        
                  <center><button class="voltar" type="submit">Voltar</button></center></form>
              </div>
                      
                      <br />
                      <footer class="borda_texto"><center>
                      <img src="img/rodape_logo.png">
                          2019 © <b>DITEC - Smart Solutions</b> - Todos os Direitos Reservados.
                      <a class="px-4" href="https://www.ditecsc.com.br" target="_blank">Ditec - Smart Solution</a>
                      </center></footer>
      </body>
      </html>
       
      salva.php
       
      <?php
      include('conexao.php');
      include_once('altera.php');
       
      // declaração de variáveis
      $id = 22;
      /*$id = $_GET['id'];
      $status = $_POST['status'];*/
      $descricao = $_POST['desc'];
      $altura = $_POST['altura'];
      $area = $_POST['area'];
       
      $up = mysqli_query($conn, "UPDATE interface SET descricao='$descricao', altura_latao='$altura', area_latao='$area' WHERE id=$id"); 
       
      if(mysqli_affected_rows($conn) > 0){
        echo '<center><h1><b>Sucesso</b></h1><br /> <h2>Atualizado!</h2></center>';
        header("Refresh: 2;url=equipamentos.php");
      }else{
          echo '<center><h1><b>Erro</b></h1><br /> <h2>Não foi atualizado!</h2></center>';
        header("Refresh: 2;url=altera.php");
      }
       
      mysqli_close($conn);
      ?>
       
      Do jeito que esta eu consigo alterar o id=22, mas não consegui pegar o id da linha sequente;
       
       
    • Por LuanMartinsTI
      Eu gostaria de saber se existe algum problema relacionado a seguranca criando uma funcao assim, no exemplo sempre que eu crio uma funcao pre reutilizar os dados sao passados direto na chamada da funcao dentro do php, o usuario nao insere nenhum dado, quando o usuario vai inserir dados eu nao trabalho dessa forma, entao minha duvida [e, se mesmo o parametro da funcao sendo informado dentro do php no codigo pode existir algum problema.
      public function contar_cadastro($tabela, $sql){ try { if($sql == null){ $this->Select = $this->Conn->prepare("SELECT * FROM $tabela"); $this->Select->execute(); return $this->Select->rowCount(); }else{ $this->Select = $this->Conn->prepare("SELECT * FROM $tabela". " " ." $sql"); $this->Select->execute(); return $this->Select->rowCount(); } } catch (PDOException $exc) { exibeMensagens($Msg, $ErrNo); } } E as chamadas das funcoes assim
       
      $cmsPDO = new CmsPDO(); $r_userStaff = $cmsPDO->contar_cadastro('usuarios', ' where cargo > 2'); $r_userVip = $cmsPDO->contar_cadastro('usuarios', ' where cargo = 2'); $r_userBan = $cmsPDO->contar_cadastro('usuarios', " where ban = '1'"); $r_usuarioPDO = $cmsPDO->contar_cadastro('usuarios', null); $r_servVip = $cmsPDO->contar_cadastro('servidores', " where vipfree = 'V'"); $r_servFree = $cmsPDO->contar_cadastro('servidores', " where vipfree = 'F'"); $r_servInat = $cmsPDO->contar_cadastro('servidores', " where verificado = '1'"); $r_servOff = $cmsPDO->contar_cadastro('servidores', " where estado = 'Off'"); $r_servOn = $cmsPDO->contar_cadastro('servidores', " where estado = 'On'"); $r_servidores = $cmsPDO->contar_cadastro('servidores', null); Eu normalmente crio as funcoes assim:
      public function cadastrar_usuario($usuario){ try { if($this->veriricarnick($usuario) == false){ if($this->verificiarEmail($usuario) == false){ $query = 'INSERT INTO usuarios ' . '(id, nome, senha, email, cargo, ip)' . 'value(null,:nome, :senha, :email, :cargo, :ip)'; $this->Criar = $this->Conn->prepare($query); $this->Criar->bindValue(':nome' , $usuario->getNome() , PDO::PARAM_STR); $this->Criar->bindValue(':senha' , $usuario->getSenha(), PDO::PARAM_STR); $this->Criar->bindValue(':email' , $usuario->getEmail(), PDO::PARAM_STR); $this->Criar->bindValue(':cargo' , $usuario->getCargo(), PDO::PARAM_INT); $this->Criar->bindValue(':ip' , $usuario->getIp() , PDO::PARAM_STR); $this->Criar->execute(); if($this->Criar->rowCount() == 1){ return 1; }else{ return false; } }else{ return false; } }else{ return false; } } catch (PDOException $exc) { exibeMensagens("<b> Erro ao inserir.</b> Mensagem:{$exc->getMessage()} Código: {$exc->getCode()}", WS_ERROR); } }  
    • Por nosredna
      Olá amigos,
       
      tenho o seguinte código:
      <html> <script type="text/javascript"> function Soma(){ var soma = 0; var ipts = document.querySelectorAll('input[oninput="Soma()"]'); for(var x=0; x<ipts.length; x++){ var valorItem = parseFloat(ipts[x].value); !isNaN(valorItem) ? soma += parseFloat(valorItem) : null; } document.querySelector('#final').value = soma.toFixed(2); } </script> <form action=""> Total produto1: <input type="text" oninput="Soma()" value="0"><br> Total produto2: <input type="text" oninput="Soma()" value="0"><br> <br> Total todos os produtos12: <input type="text" id="final"> </form> </html> Bom...para essas duas inputs funciona corretamente.
      Porém, se eu quiser colocar mais inputs como: Total produto3 + Total produto4 = Total todos os produtos34, Total produtoX + Total produtoY = Total todos os produtosXY, ...
      e usar o mesmo código JS, é possível? alguém poderia me dar uma dica de como eu faço para fazer isso? já tentei de várias maneiras, mas não estou tendo sucesso...
       
      Fico agradecido. 
    • Por moreaux
      Tenho um apache2 configurado para a minha pasta /var/www/meusite , porem quando clonaram, usaram https e nao SSH, fiz o clone do novo projeto, todos os arquivos estão iguais, porem quando renomeio as pastas para ir para o meu novo projeto, me da o erro :
       
      This page isn’t working
      Dando o erro de HTTP ERROR 500, ja tentei verificar no LOG do apache, porem não esta logando nada, alguem poderia me ajudar? 
    • Por Philippe Luis
      Galera boa noite.
      Bom tenho um sistema em php onde uso sessions.
      Bom quando acesso meu site através do pc cria se uma session na pasta  /tmp no meu servidor, bom até ai tranquilo.
      Mais quando acesso o mesmo site pelo meu Smartphone, cria-se 4 arquivos de sessoes no minha pasta /tmp.
      Isso é um erro ou é comum acontecer ? Se for um erro como posso resolver?
       
      A foto a seguir mostra o ocorrido. Lembrando que nesse momento da foto só declarei apenas uma sessão .
       

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.