Forum Pplware

Versão Completa: carrinho de compras - ajuda na correcção de alguns erros
Está de momento a ver uma versão reduzida do nosso conteúdo. Ver versão completa com o formato adequado.
Boas, no desenvolver de uma loja on-line, e após uma pesquisa na internet, encontrei este tutorial (http://www.videoaulasbrasil.com.br/php/c...s-com-php/) de onde explica a parte de adicionar produtos ao carrinho de compras e visualização do carrinho de compras.

Tenho então a página onde aparecem os produtos (categoria1.php) e tem:

<?php
echo ' <a href="carrinho.php?acao=add&id='.$linha['id'].'"> <img src="../imagens/comprar.jpg" /></a>';
?>



e depois tenho a página carrinho.php com o seguinte código:


<?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]);
}
}
}
}
}
?>


<?php
include ("verifica.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>

<?php
include "../admin/ligacao.php";
?>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>

<style type="text/css">
<!--
@import url(../css.css);
-->
</style>

</head>

<body>


<div id="conteudo">

<b class="titulo">Carrinho de Compras</b>
<div id="texto">
<table border="0px" style="text-align:center">
<tr><td colspan="6" style="text-align:right"><a href="categoria1.php" class="formulario" style="text-decoration:none;"> Continuar as compras </a></td></tr>
<tr height="5px"></tr>

<tr></tr>
<tr>
<td width="200"><b>Nome do Produto</b></td>
<td width="80"><b>Imagem</b></td>
<td width="79"><b>Quantidade</b></td>
<td width="75"><b>Preço</b></td>
<td width="90"><b>Subtotal</b></td>
<td width="64"><b>Acções</b></td>

</tr>


<form action="?acao=up" method="post">




<?php
if (count($_SESSION['carrinho'])== 0){
echo '<tr> <td colspan="5"> Não há produtos no carrinho </td></tr>';
}else{

foreach ($_SESSION['carrinho'] as $id => $qtd){
$sql = "SELECT * FROM produtos WHERE id= '$id'";
$sql = mysql_query($sql) or die (mysql_error());
$linha = mysql_fetch_assoc($sql);

$nome_produto = $linha['nome_produto'];
$imagem = $linha['imagem'];
$preco = number_format ($linha ['preco'], 2, ',', '');
$sub = number_format ($linha ['preco'] * $qtd, 2, ',', '');

$total += $sub;

echo '<tr>
<td> '.$nome_produto.' </td>
<td><img src="../imagens/'.$imagem.'" style="max-width:60px; max-height:60px;" border="0px" /> </td>
<td> <input type="text" size="3" name="prod['.$id.']" value="'.$qtd.'" style="text-align:center"/> </td>
<td> '.$preco.' €</td>
<td> '.$sub.' € </td>
<td> <a href="?acao=del&id='.$id.'"><span class="formulario"> Apagar</span> </a> </td>
</tr>';
}
$total = number_format ($total, 2, ',', '');
echo '<tr></tr><tr>
<td colspan ="3"></td>
<td><b>Total</</td>
<td> '.$total.' € </td>
</tr><tr></tr>';
}

?>
<tr>
<td colspan="4"></td>
<td colspan="2"><input type="submit" value="Actualizar Encomenda" class="formulario" style="text-align:right" /></td>
</tr>
<tr>
</tr>
<tr>
<td colspan="4"></td>
<td colspan="2"> <a href="finalizar_encomenda.php"><span class="formulario">Finalizar a encomenda</span></a></td>
</tr>
<tr height="15px"></tr>
</form>
</table>



mas acontecem alguns problemas:

• Após adicionar um produto ao carrinho de compras se carregar F5 ele aumenta uma unidade ao último produto inserido
• Não esta a fazer o total bem (se tiver 8.50 ele totaliza 8€)


É possível alaguem me ajudar sff?
Podia-te sugerir utilizar AJAX para adicionar os itens ao carrinho, mas estás a utilizar tabelas para layout, html dentro de variáveis (sem ob_start(), etc.), e muitas outras coisas que com o tempo verás que são péssimas, por isso deduzo que seria algo que não te interessaria para já, visto que terias de alterar basicamente tudo.

Dentro do que tu tens, as soluções mais "rápidas":

1. Quando adicionas o produto, antes de fazeres output de HTML, fazes um redireccionamento para a página, sem variáveis no URL, assim ao fazer refresh não adiciona nada.

2. Utiliza o round() com duas casas decimais enquanto fazes cálculos, só no final é que deves aplicar o number_format().
muito obrigada pela ajuda, de facto tenho vindo a observar que este fórum é bom por 1 coisa: tipo noutros fórum ja me estavam a insultar a dizer que não percebia nada, muito obrigada por toda a ajuda prestada.

pelo que vi sobre o round() arredonda, tipo se tiver 7,5 coloca 8, mas isso ele já está a fazer eu queria era que n fizessem iso, porque se o produto custa 8.50€ como está, o total aparece 8€ e assim a loja ficaria a perder
Estamos aqui para ajudar... ao ritmo das pessoas que pedem ajuda Smile
Boas

acho que se utilizares qualquer coisa assim parecida é possivel resolver o teu problema. Tipo, tens que introduzir o header e no nome da página que incrementa o valor.

if ( isset($_GET['comprar']) ) {
$_SESSION['ultimo']=$_GET['comprar'];
header("Location: carrinho.php");
}

cumps
isso para não arredondar?!
(14-06-2011 15:59)Suesana Escreveu: [ -> ]isso para não arredondar?!

nao percebi?
Não Suesana, o round() recebe um parâmetro que é o número de casas decimais a arredondar. Lê o que eu disse outra vez. O que o Canha disse foi para fazer o redirect.
eu disse aquilo porque vi uma explicação do round aqui http://www.arquivodecodigos.net/dicas/ph...-3161.html e lá dizem que arredonda
URL's de Referência