Maxweell 0 Denunciar post Postado Novembro 9, 2010 Veja UPDATE carrinho SET quant_car = '3', subtotal = 'Array' where id = '8' No form, eu tiro o hidden e ta aparecendo normal o valor... Compartilhar este post Link para o post Compartilhar em outros sites
William Bruno 1501 Denunciar post Postado Novembro 9, 2010 viu o erro ? você tá passando errado o valor do subtotal... tá indo 'Array' ... se tiver dúvidas, mostre onde você cria a string do UPDATE Compartilhar este post Link para o post Compartilhar em outros sites
Maxweell 0 Denunciar post Postado Novembro 9, 2010 É assim: if ($acao == "up") { $quant = $_POST['quant']; $id = $_POST['id']; $sub = $_POST['sub']; if (is_array($quant)) { foreach($quant as $id => $qtd) { if(is_numeric($id) && is_numeric($qtd)) { $sql = "UPDATE carrinho SET quant_car = '$qtd', subtotal = '$sub' where id = '$id'"; echo $sql,'<br />';mysql_query( $sql )or die( mysql_error() ); } } } } }Eu tenho que fazer mais um foreach? tipo.. foreach($sub as $id => $subtotal){ Compartilhar este post Link para o post Compartilhar em outros sites
William Bruno 1501 Denunciar post Postado Novembro 9, 2010 cara, acho que é o seguinte: $sql = "UPDATE `carrinho` SET `quant_car` = '{$qtd}', `subtotal` = '{$sub[ $id ]}' WHERE `id` = {$id}";viu ali a chave do array $sub ?isso que tava faltando. Compartilhar este post Link para o post Compartilhar em outros sites
Maxweell 0 Denunciar post Postado Novembro 10, 2010 Assim até atualiza, ficou assim: $sql = "UPDATE carrinho SET quant_car = '{$qtd}', subtotal = '{$sub[$id]}' where id = {$id}"; Ele atualiza a quantidade na primeira, mas pra poder atualizar o valor, tenho que clicar 2 vezes no botao... Ele atualiza a quantidade na primeira, mas pra poder atualizar o valor, tenho que clicar 2 vezes no botao... Alguem sabe pq acontece isso? teria como no foreach, colocar as duas variaveis que eu recebo por post? $sub / $quant Compartilhar este post Link para o post Compartilhar em outros sites
Evandro Oliveira 331 Denunciar post Postado Novembro 10, 2010 Porque gravar um carrinho de compras (não concretizado) em banco de dados se eu posso desistir da compra a qualquer momento? É que é meio complicado chegar no final e sugerir que jogue tudo fora e comece denovo mas, a melhor maneira de se evitar problemas é fazer da maneira certa. Abra um cookie identificado por UID (talvez até uma session) para armazenar o carrinho e só grave em banco quando a compra estiver em processo de pagamento. A construção do Array do carrinho também está incorreta no meu modo de ver. O índice do array poderia já ser o ID do produto no banco, enquanto seu valor seria a quantidade do mesmo. #id | descricao | valor 1 | desodorante | 9.00 2 | refrigerante | 3.00 3 | arroz 5kg | 4.90 4 | detergente | 0.60 // comprando 1 refrigerante, 3 detergentes e 2 pacotes de arroz teríamos: $carrinho = array( 2 => 1, 3 => 2, 4 => 3 ); Compartilhar este post Link para o post Compartilhar em outros sites
Maxweell 0 Denunciar post Postado Novembro 10, 2010 Entao Evandro, esse ta sendo meu grande problema, nao consigo de jeito nenhum fazer, seja com banco, seja com array...até queria fazer com array, pelo motivo que voce falou... mas eu nao sei por onde começar, se voce puder me ajudar...eu até tinha um codigo com array, mas na hora de gravar no banco, nao dava certo... Compartilhar este post Link para o post Compartilhar em outros sites
Maxweell 0 Denunciar post Postado Novembro 10, 2010 Achei um script de carrinho com array e session... produtos.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Video Aula sobre Carrinho de Compras</title> </head> <body> <?php require("conexao.php"); $sql = "SELECT * FROM item"; $qr = mysql_query($sql) or die(mysql_error()); while($i = mysql_fetch_assoc($qr)){ echo '<h2>'.$i['nome'].'</h2> <br />'; echo 'Preço : R$ '.number_format($i['unitario'], 2, ',', '.').'<br />'; echo '<a href="carrinho.php?acao=add&id='.$i['id'].'">Comprar</a>'; echo '<br /><hr />'; } ?> </body> </html> Carrinho.php <?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]); } } } } } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Video Aula sobre Carrinho de Compras</title> </head> <body> <table> <caption>Carrinho de Compras</caption> <thead> <tr> <th width="244">Produto</th> <th width="79">Quantidade</th> <th width="89">Preço</th> <th width="100">SubTotal</th> <th width="64">Remover</th> </tr> </thead> <form action="?acao=up" method="post"> <tfoot> <tr> <td colspan="5"><input type="submit" value="Atualizar Carrinho" /></td> <tr> <td colspan="5"><a href="produtos.php">Continuar Comprando</a></td> </tfoot> <tbody> <?php if(count($_SESSION['carrinho']) == 0){ echo '<tr><td colspan="5">Não há produto no carrinho</td></tr>'; }else{ require("conexao.php"); $total = 0; foreach($_SESSION['carrinho'] as $id => $qtd){ $sql = "SELECT * FROM item WHERE id= '$id'"; $qr = mysql_query($sql) or die(mysql_error()); $i = mysql_fetch_assoc($qr); $nome = $i['nome']; $preco = number_format($i['unitario'], 2, ',', '.'); $sub = number_format($i['unitario'] * $qtd, 2, ',', '.'); $total += $i['unitario'] * $qtd; echo '<tr> <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>'; } ?> </tbody> </form> </table> </body> </html> Agora eu preciso finalizar, gravando no banco...alguem pode me dar uma ideia ? eu uso foreach ? Compartilhar este post Link para o post Compartilhar em outros sites
Evandro Oliveira 331 Denunciar post Postado Novembro 10, 2010 Você entendeu cada passo que foi realizado aí ou só copiou e colou pra ver se funcionava? Eu tinha pensado e preparado algo bem similar mas, como já estava meio tarde, não cheguei a postar. Se desejar, posso realizar a postagem do que tenho aqui e creio que você será bem capaz de gravar os dados no banco sozinho se conseguir compreender o funcionamento do sistema. Compartilhar este post Link para o post Compartilhar em outros sites
Maxweell 0 Denunciar post Postado Novembro 10, 2010 Não vou te dizer que entendi 100% cada passo, Alguma coisa eu consegui entender sim... Se voce puder me ajudar, eu agradeço! quem sabe esse que voce postar eu entenda melhor.. Compartilhar este post Link para o post Compartilhar em outros sites
Evandro Oliveira 331 Denunciar post Postado Novembro 10, 2010 Primeiramente, preciso que você entenda que o conteúdo de 'produtos.php' foi gerado apenas para evitar o registro em banco de dados, consultas etc. session_start(); if(!isset($_SESSION['carrinho'])) $_SESSION['carrinho'] = Array(); $produtos = Array( Array('id' => 1001, 'nome'=>'Mouse', 'descr'=>'Laser sem fio bluetooth p/ notebook', 'valor'=>8.00), Array('id' => 1002, 'nome'=>'Teclado', 'descr'=>'ABNT Multimídia', 'valor'=>15.00), Array('id' => 1003, 'nome'=>'Caixa de som', 'descr'=>'Stereo 200w', 'valor'=>12.00), Array('id' => 1004, 'nome'=>'Monitor', 'descr'=>'LED 22" FULL HD', 'valor'=>640.00), Array('id' => 1005, 'nome'=>'Impressora', 'descr'=>'Laser 20 fls/min', 'valor'=>350.00), Array('id' => 1006, 'nome'=>'Processador', 'descr'=>'4 Núcleos @ 1.8 Ghz', 'valor'=>655.00), Array('id' => 1007, 'nome'=>'Memória', 'descr'=>'2GB DDR3 1600Mhz', 'valor'=>240.00) ); /* A função a seguir deve ser substituída por uma consulta ao banco */ function pegaProd($id){ global $produtos; foreach($produtos as $index=>$prod) if($prod['id'] == $id) return $produtos[$index]; return FALSE; } No exemplo, toda vez que for mencionado $produtos, o resultado é equivalente a uma busca geral pelo banco (select * from produtos ...). Por sua vez, quando for mencionada a função pegaProd, a referência é a uma busca específica (select * from produtos where id=00). Entendido isso, vamos aos requisitos: É imprescindível que você saiba trabalhar com sessões para o bom entendimento do exemplo. Uma compra se divide em 4 passos básicos: listagem e escolha do produto definição da quantidade de produtos confirmação da inclusão listagem do carrinho Para facilitar o entendimento, cada passo será dividido em um arquivo (index.php, comprar.php, confirma.php, carrinho.php respectivamente) que será explicado detalhadamente a seguir. Compreender também como se manipula matrizes/vetores bi-dimensionais também vai auxiliar no rápido entendimento do exemplo. Outra nota importante é que, para fins de redução, não foi tomada nenhuma medida extra de verificação de segurança ou mal uso do visitante. Em programações oficiais certifique-se de sempre testar todas as possibilidades de erro e cobri-las. A única medida de teste tomada foi a verificação da existência da variável $_SESSION['carrinho'] pois a mesma é de vital importância para funcionamento do sistema. A última nota a tomar é sobre o uso de duas notações de strings diferenciadas que foi utilizado. Caso surja alguma dúvida, você pode recorrer rapidamente ao manual. Chega de lero-lero e vamos ao que interessa: A listagem foi embutida dentro de index.php porque é de nosso interesse exibir algo como as ofertas em alta do dia, assim que o visitante acessa a página. Essas ofertas, não deixam de ser um tipo de listagem include "produtos.php"; // Inicializa a sessão, a variável do carrinho e recupera a lista de produtos. echo '<ul>'; foreach($produtos as $info) { $valor = number_format($info['valor'], 2, ",", "."); echo "\n\t<li> <h1>{$info['nome']}</h1> <p>{$info['descr']}</p> <p>R$ {$valor}</p> <p><a href=\"comprar.php?idproduto={$info['id']}\">Adicionar ao carrinho</a></p> \t</li>"; } echo '</ul>'; echo '<a href="carrinho.php">Ver meu carrinho</a>'; http://br2.php.net/manual/pt_BR/control-structures.foreach.php http://br2.php.net/manual/pt_BR/function.number-format.php Abrindo o código gerado no navegador, poderá verificar que foi criada uma lista <ul> de produtos e vários links para o próximo passo: a definição de quantidade. Esta definição reside no código que foi colocado em comprar.php include "produtos.php"; $prod = pegaProd($_GET['idproduto']); // consultamos no banco apenas pelo produto de nosso interesse echo '<h1>Compra de <i>'. $prod['nome'] . '</i></h1> <p>Valor unitário: R$ ' . number_format($prod['valor'], 2, ',', '.') . '</p> <form action="confirma.php" method="post"> <input type="hidden" name="id" value="'. $prod['id'] . '"> <label for="qtdProd">Digite o número de unidades</label> <input type="text" size="2" name="qtd" id="qtdProd"> <button type="submit">Adicionar ao carrinho!</button> </form>'; http://php.net/manual/pt_BR/reserved.variables.get.php Preparamos um formulário que enviará para a próxima página o identificador {input|hidden|id} e a quantidade {input|text|qtd} do produto desejado. Ao clicar em 'Adicionar ao carrinho!' o visitante/usuário/cliente termina o processo de compra do produto X e deverá ser enviado novamente à listagem, veremos isso com a confirmação do terceiro passo, através de confirma.php include "produtos.php"; // Fizemos o include nesse passo apenas para confirmar a existência de $_SESSION['carrinho'] $_SESSION['carrinho'][$_POST['id']] = $_POST['qtd']; header('Location: /'); http://www.php.net/manual/pt_BR/reserved.variables.post.php http://br2.php.net/manual/pt_BR/function.header.php O cabeçalho Location direciona o usuário para o endereço passado. "/" é um apelido para a página inicial do site. Queremos devolver o visitante para a página de listagem de produtos. Por fim, precisamos verificar em nosso carrinho se tudo está em ordem, a quantidade de produtos foi pedida corretamente e o principal, ver o quanto vamos gastar ;). Para isso, temos a última parte do código, carrinho.php include "produtos.php"; $subtotal = 0; // Contabilizando o carrinho foreach($_SESSION['carrinho'] as $id=>$qtd) { $prod = pegaProd($id); $subtotal += $prod['valor'] * $qtd; } $subtotal = number_format($subtotal, 2, ',', '.'); echo <<<HTML <table> <thead> <tr> <td>Produto</td> <td>Quantidade</td> <td>Valor Unit.</td> <td>Valor Total</td> </tr> </thead> <tfoot> <tr> <td colspan="3">Subtotal</td> <td>R$ {$subtotal}</td> </tr> </tfoot> <tbody> HTML; foreach($_SESSION['carrinho'] as $id=>$qtd) { $prod = pegaProd($id); $valorUnit = number_format($prod['valor'], 2, ',', '.'); $valorTot = number_format($prod['valor'] * $qtd, 2, ',', '.'); echo <<<HTML <tr> <td>{$prod['nome']}</td> <td>{$qtd}</td> <td>R$ {$valorUnit}</td> <td>R$ {$valorTot}</td> </tr> HTML; } echo ' </tbody> </table>'; Este é grande mais pela existência da tabela do que por lógica de programação. Existem maneiras de melhor performance para a listagem do carrinho, mas preferi me manter no simples para facilitar o entendimento. Creio que verificando a lógica aplicada, você seja capaz de adaptar à sua necessidade. Compartilhar este post Link para o post Compartilhar em outros sites
Maxweell 0 Denunciar post Postado Novembro 10, 2010 Vejamos se eu entendi, produtos.php Cadastrados no array manualmente. funcao pegaProd, pega os dados da array pra mostrar no index.php. index.php Chama a funcao pegaProd e mostra os produtos. O que eu nao entendi foi como vou fazer a consulta no banco nessa função... /* A função a seguir deve ser substituída por uma consulta ao banco */ function pegaProd($id){ global $produtos; foreach($produtos as $index=>$prod) if($prod['id'] == $id) return $produtos[$index]; return FALSE; } Fazendo desse jeito, até consegui mostrar os produtos, adicionei ao carrinho...mas na hora de mostrar os produtos do carrinho deu um erro no foreach Warning: Invalid argument supplied for foreach()Esse é o foreach: foreach($_SESSION['carrinho'] as $id=>$qtd) { Compartilhar este post Link para o post Compartilhar em outros sites
Evandro Oliveira 331 Denunciar post Postado Novembro 10, 2010 Primeiramente, preciso que você entenda que o conteúdo de 'produtos.php' foi gerado apenas para evitar o registro em banco de dados, consultas etc No seu caso, você tem os dados em banco para acesso. No exemplo, toda vez que for mencionado $produtos, o resultado é equivalente a uma busca geral pelo banco (select * from produtos ...). Por sua vez, quando for mencionada a função pegaProd, a referência é a uma busca específica (select * from produtos where id=00). Pro seu caso, deve ser feito algo assim: $sql = mysql_query('SELECT * FROM `produtos`'); $produtos = array(); while(false !== ($row = mysql_fetch_assoc($sql))) $produtos[] = $row; $sql = mysql_query('SELECT * FROM `produtos` WHERE `id`=' .$_GET['idproduto']); $prod = mysql_fetch_assoc($sql); Dessa forma, você exporta a verificação do carrinho session_start(); if(!isset($_SESSION['carrinho'])) $_SESSION['carrinho'] = array(); Para todos os outros arquivos e não precisa mais do arqruivo 'produtos.php' Compartilhar este post Link para o post Compartilhar em outros sites
Matheus Tavares 167 Denunciar post Postado Novembro 10, 2010 $qtd = $_POST['qtd']; $qr = mysql_query('SELECT * FROM tabela'); while ($i = mysql_fetch_assoc($qr)) { echo $qtd*$i['valor'].'<br />'; } Não é só isso q você precisa? Compartilhar este post Link para o post Compartilhar em outros sites
jango 0 Denunciar post Postado Novembro 12, 2010 cara, tbm estou tentando fazer um carrinho parecido com esse e estou com o mesmo problema pra atualiza o subtotal, tentei todas as alternativas citadas aqui e acontece a mesma coisa. simplesmente nao pega o valor do subtotal calculado. ninguem ai pode explicar porque a quantidade funciona e o subtotal que é quase parecido a forma de fazer não da certo. Compartilhar este post Link para o post Compartilhar em outros sites