Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá a todos.
Estou fazendo um site para um supermercado.
Fiz um carrinho de compras utilizando sessão, mas estou com um problema.
Ao logar no site chamo a seguinte função:
function Logar($usuario, $senha){
$sql = "SELECT * FROM clientes WHERE email = '{$usuario}' AND senha = '{$senha}'";
$rs = $this->DB->GetRow($sql);
if(count($rs) > 0){
$_SESSION['log'] = true;
$_SESSION['usuario'] = $usuario;
$_SESSION['nome'] = $rs['nome'];
$_SESSION['id'] = session_id(); //aqui está o problema
$_SESSION['id_cliente'] = $rs['id'];
$this->Mensagem("Seja bem-vindo(a) {$rs['nome']}! ", "?pagina=principal");
}else{
$this->Mensagem("Usuário ou senha incorretos. Tente novamente.","?pagina=login");
}
}
O id do carrinho é o mesmo id do $_SESSION['id'].
A primeira compra funciona normalmente. Mas caso o cliente resolva comprar novamente (sem deslogar), o id do carrinho será o mesmo (duplicando os dados no BD).
Tentei dar um session_regenerate_id() ao finalizar a compra, mas ele nao regenera.
Alguem saberia me ajudar?
Obrigado
ps: já li os tópicos sobre carrinho de compras, regenerate_id e outros parecidos que encontrei aqui no fórum. Nao encontrei a solução.
Está no $_SESSION['cesta']
Ja estou fazendo isso
function FinalizarCompra(){
...
unset($_SESSION[cesta]); //esvazia o carrinho
session_regenerate_id(); //era pra gerar um novo id. Mas nao gera.
Acho que nao fui bem específico.
O problema está nesta linha
$sql = "INSERT INTO carrinho (sessao,id_produto,quantidade,total) VALUES ('{$_SESSION['id']}','{$item['id']}', '{$item['qtde']}', '{$item['total']}')";
Na tabela "carrinho" eu coloco no campo 'sessao' o $_SESSION['id']. Logo precisaria de um novo id para a sessao. Pois outra compra representa outro carrinhoEntendi, você além de salvar na sessão está salvando também no banco de dados.
Não há necessidade de fazer isso, ou você salva os itens do carrinho na sessão ou no BD.
Se você optar por usar apenas sessão, quando o usuário fazer o checkout (finalizar a compra) você pega os itens do carrinho e insere em uma tabela de pedidos, em seguida limpa a sessão do carrinho.
A lógica correta seria essa.
Mas é porque minha tabela de pedidos nao tem todos os itens
e sim apenas o id do carrinho (q no caso é a sessao). Nao seria esse o correto?
a tabela pedidos possui: id, id_cliente, data, id_carrinho e status.
Ficaria com id, id_cliente, data, item, e status ?
sendo o id chave primária como faria pra diferenciar os pedidos?
Acho que sua modelagem está errada. Dessa forma os itens do pedido permanecerão salvos eternamente na tabela "carrinho"?
Você deveria ter uma tabela "pedidos" e outra tabela "pedidos_itens", que relaciona os itens (produtos e quantidade) ao pedido.
O carrinho de compras ao meu ver só deve existir enquanto o usuário navega pela loja virtual, desta forma apenas sessão basta.
hmmm entendi.
Vou criar esta tabela de pedidos_itens entao e remodalar aqui.
Obrigado pela ajuda!
Em qual variável da sessão você está armazenando os itens do carrinho de compras?
Quando o cliente finalizar uma compra basta você limpar essa variável.