Carrinho de compras PHP Mysql

Código de carrinho de compras PHP e Mysql
Voltar

Pré-requisitos

XAMPP executando, criar diretório no htdocs para armazenar os arquivos. 1º execute o .sql no Phpmyadmin, após isso, utilize os códigos informados abaixo.

Neste caso, simplifiquei os códigos sql e alguns casos PHP, com o objetivo de trazer um código mais limpo e focado. Entretanto, SEMPRE utilize das boas práticas de programação: Nos casos SQL, utilize chaves primárias e estrangeiras, assim como a limitação dos tipos primitivos. A relação entre os dados e a organização do código são pontos fundamentais para a integridade do sistema!

banco.sql


CREATE DATABASE carrinho;
CREATE TABLE item (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nome TEXT NOT NULL,
    preco FLOAT NOT NULL
);
CREATE TABLE pedido (
    id INT AUTO_INCREMENT PRIMARY KEY,
    dia DATETIME NOT NULL DEFAULT NOW(),
    cpf TEXT,
    endereco TEXT,
    precoTotal FLOAT,
    finalizado BOOLEAN NOT NULL DEFAULT 0
);
CREATE TABLE item_pedido (
    idPedido INT,
    idItem INT,
    qtd INT NOT NULL
);
INSERT INTO item(nome,preco) VALUES ("item1",29.90),("item2",90),("item3",10.65);

conect.php


<?php
$db = new PDO('mysql:host=localhost;dbname=carrinho;charset=utf8','root','');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

itensPedido.php


<a href="addItem.php">Adicionar item</a>
<?php
    require_once 'conect.php';
    session_start();
    $totPedido = 0;

    // Itens do pedido
    $r = $db->prepare("SELECT * FROM item_pedido WHERE idPedido=?");
    $r->execute(array($_SESSION['id']));
    $linhas = $r->fetchAll(PDO::FETCH_ASSOC);
    foreach($linhas as $l) {
        $r2 = $db->prepare("SELECT * FROM item WHERE id=?");
        $r2->execute(array($l['idItem']));
        $linhas2 = $r2->fetchAll(PDO::FETCH_ASSOC);
        foreach($linhas2 as $l2) {
            $totItem = $l['qtd']*$l2['preco'];
            $totPedido += $totItem;
            echo "
                <br>
                ".$l2['nome']."- ".$l['qtd']."(R$ ".$l2['preco']."un) - R$ ".$totItem."
                <a href='edItem.php?item=".$l['idItem']."'>Editar<a>
                <a href='remItem.php?item=".$l['idItem']."'>Excluir<a>
            ";
        }
        $_SESSION['totPedido'] = $totPedido;
    }

    // Dados do pedido
    $r = $db->prepare("SELECT * FROM pedido WHERE id=?");
    $r->execute(array($_SESSION['id']));
    $linhas = $r->fetchAll(PDO::FETCH_ASSOC);
    foreach($linhas as $l) {
        echo "<br><hr>Pedido ".$l['id']."<br>Data: ".$l['dia']."<br>Cpf: ".$l['cpf']."<br>Total: R$ ".$totPedido."<br>Endereço: ".$l['endereco'];
    }
?>

<form action="canPedido.php" method="post">
    <input type="hidden" name="can" value="1">
    <input type="submit" value="Cancelar Pedido">
</form>
<form action="fimPedido.php" method="post">
    <input type="hidden" name="fim" value="1">
    <input type="submit" value="Confirmar Pedido">
</form>

addItem.php


<?php
    require_once 'conect.php';
    session_start();

    if((!empty($_POST['item'])) and (!empty($_POST['qtd']))) {
        $r = $db->prepare("INSERT INTO item_pedido(idItem,idPedido,qtd) VALUES (?,?,?)");
        $r->execute(array($_POST['item'],$_SESSION['id'],$_POST['qtd']));
        header("location: itensPedido.php");
    }
?>

<form action="addItem.php" method="post">
    Adicionar item:
    <select required name="item">
        <?php
            $r = $db->query("SELECT * FROM item");
            $linhas = $r->fetchAll(PDO::FETCH_ASSOC);
            foreach($linhas as $l) {
                $r = $db->prepare("SELECT * FROM item_pedido WHERE idItem=? AND idPedido=?");
                $r->execute(array($l['id'],$_SESSION['id']));
                if($r->rowCount()==0) {echo "<option value=".$l['id'].">".$l['nome']."</option>";}
            }
        ?>
    </select>
    <input type="number" required name="qtd" min=1 max=99 placeholder="Qtd">
    <a href="itensPedido.php">Cancelar</a>
    <input type="submit" value="Adicionar">
</form>

remItem.php


<?php
require_once 'conect.php';
session_start();
$r = $db->prepare("DELETE FROM item_pedido WHERE idItem=? AND idPedido=?");
$r->execute(array($_GET['item'],$_SESSION['id']));
header("location: itensPedido.php");

edItem.php


<?php
    require_once 'conect.php';
    session_start();

    if(!empty($_GET['item'])) {
        $r = $db->prepare("SELECT qtd FROM item_pedido WHERE idItem=? AND idPedido=?");
        $r->execute(array($_GET['item'],$_SESSION['id']));
        $linhas = $r->fetchAll(PDO::FETCH_ASSOC);
        foreach($linhas as $l) {$qtd = $l['qtd'];}
    }

    if((!empty($_GET['idNovo'])) and (!empty($_POST['qtd']))) {
        $r = $db->prepare("UPDATE item_pedido SET qtd=? WHERE idItem=? AND idPedido=?");
        $r->execute(array($_POST['qtd'],$_GET['idNovo'],$_SESSION['id']));
        header("location: itensPedido.php");
    }

    $r = $db->prepare("SELECT nome FROM item WHERE id=?");
    $r->execute(array($_GET['item']));
    $linhas = $r->fetchAll(PDO::FETCH_ASSOC);
    foreach($linhas as $l) {echo "Editar ".$l['nome'];}
?>

<form action="edItem.php?idNovo=<?=$_GET['item']?>" method="post">
    <input type="number" name="qtd" placeholder="Qtd" required min=1 max=99 value=">?=$qtd?>">
    <a href="itensPedido.php">Cancelar</a>
    <input type="submit" value="Atualizar">
</form>

canPedido.php


<?php
require_once 'conect.php';
session_start();

$r = $db->prepare("DELETE FROM item_pedido WHERE idPedido=?");
$r->execute(array($_SESSION['id']));
$r = $db->prepare("DELETE FROM pedido WHERE id=?");
$r->execute(array($_SESSION['id']));
unset($_SESSION['id']);
unset($_SESSION['totPedido']);
header("location: index.php");

fimPedido.php


<?php
require_once 'conect.php';
session_start();

$r = $db->prepare("SELECT count(idItem) FROM item_pedido WHERE idPedido=?");
$r->execute(array($_SESSION['id']));
$linhas = $r->fetchAll(PDO::FETCH_ASSOC);
foreach($linhas as $l) {
    if($l['count(idItem)']>0) {
        // Pedido com itens adicionados finaliza
        $r = $db->prepare("UPDATE pedido SET dia=now(),precoTotal=?,finalizado=1 WHERE id=?");
        $r->execute(array($_SESSION['totPedido'],$_SESSION['id']));
        unset($_SESSION['id']);
        unset($_SESSION['totPedido']);
        header("location: index.php");
    } else {header("location: itensPedido.php");}
}

index.php


<?php
    require_once 'conect.php';
    session_start();

    if((!empty($_POST['cpf'])) and (!empty($_POST['endereco']))) {
        $r = $db->prepare("INSERT INTO pedido(cpf,endereco) VALUES (?,?)");
        $r->execute(array($_POST['cpf'],$_POST['endereco']));

        $r = $db->query("SELECT id,cpf FROM pedido WHERE finalizado IS FALSE");
        $linhas = $r->fetchAll(PDO::FETCH_ASSOC);
        foreach($linhas as $l) {
            $_SESSION['id'] = $l['id'];
            $_SESSION['cpf'] = $l['cpfCliente'];
        }
        header("location: itensPedido.php");
    }
?>

<form action="index.php" method="post">
    Novo pedido
    <input type="text" name="cpf" placeholder="Cpf(xxx.xxx.xxx-xx)" pattern="\d{3}\.\d{3}\.\d{3}-\d{2}">
    <input type="text" name="endereco" placeholder="Endereço">
    <input type="submit" value="Avançar">
</form>

<h1>Pedidos</h1>
<?php
    $r = $db->query("SELECT * FROM pedido");
    $linhas = $r->fetchAll(PDO::FETCH_ASSOC);
    foreach($linhas as $l) {
        echo "<br>--- Pedido ".$l['id']." (".$l['dia'].") ---<br>";
        echo "Cpf: ".$l['cpf']." Endereço: ".$l['endereco']." Total: R$ ".$l['precoTotal']."<br>";
        $r = $db->prepare("SELECT * FROM item_pedido WHERE idPedido=?");
        $r->execute(array($l['id']));
        $linhas2 = $r->fetchAll(PDO::FETCH_ASSOC);
        foreach($linhas2 as $l2) {
            $r = $db->prepare("SELECT * FROM item WHERE id=?");
            $r->execute(array($l2['idItem']));
            $linhas3 = $r->fetchAll(PDO::FETCH_ASSOC);
            foreach($linhas3 as $l3) {
                echo "Item ".$l3['nome']."- ".$l2['qtd']."(R$ ".$l3['preco'].") - R$ ".($l3['preco']*$l2['qtd'])."<br>";
            }
        }
    }
?>

Elaborado por Mateus Schwede
ubsocial.github.io