Project: Toko Online Mini (Bagian 3 - Selesai)

Ini adalah tahap akhir dari Toko Online Mini kita. Saat pengguna menekan "Lanjut ke Pembayaran", mereka harus mengisi alamat pengiriman, dan kita akan menyimpan total belanja mereka ke dalam tabel pesanan di Database, lalu mengosongkan keranjang belanja.

1. Membuat Halaman Checkout

Halaman ini berisi gabungan dari HTML Form dan logika PHP untuk menangani input dari pengguna.

Buat file checkout.php:

<?php
require 'config/database.php';

// Redirect jika keranjang kosong (Tidak ada yang bisa dibeli)
if (empty($_SESSION['cart'])) {
    header("Location: index.php");
    exit;
}

// 1. Menghitung Total Harga (Logika yang sama seperti di keranjang.php)
$cart = $_SESSION['cart'];
$ids = implode(',', array_keys($cart));
$stmt = $pdo->query("SELECT id, harga FROM produk WHERE id IN ($ids)");
$produk_beli = $stmt->fetchAll();

$total_bayar = 0;
foreach($produk_beli as $p) {
    $qty = $cart[$p['id']];
    $total_bayar += ($p['harga'] * $qty);
}

// 2. Proses Form saat tombol "Bayar Sekarang" ditekan
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    
    // Ambil input form dan bersihkan dari injeksi HTML/XSS
    $nama = htmlspecialchars($_POST['nama_pembeli'] ?? '');
    $alamat = htmlspecialchars($_POST['alamat'] ?? '');

    if (!empty($nama) && !empty($alamat)) {
        
        try {
            // INSERT pesanan ke tabel database
            $sql = "INSERT INTO pesanan (nama_pembeli, alamat, total_harga) VALUES (?, ?, ?)";
            $stmt = $pdo->prepare($sql);
            $stmt->execute([$nama, $alamat, $total_bayar]);

            // KUNCI PENTING: Kosongkan keranjang setelah sukses beli
            unset($_SESSION['cart']);

            // Berikan pesan flash dan redirect ke halaman sukses
            $_SESSION['pesan_sukses'] = "Terima kasih, <b>$nama</b>! Pesanan Anda sebesar <b>" . rupiah($total_bayar) . "</b> sedang diproses dan akan dikirim ke alamat Anda.";
            
            header("Location: checkout.php?status=sukses");
            exit;

        } catch(PDOException $e) {
            $error = "Terjadi kesalahan sistem: " . $e->getMessage();
        }
    } else {
        $error = "Nama dan Alamat wajib diisi!";
    }
}
?>

<!DOCTYPE html>
<html lang="id">
<head>
    <meta charset="UTF-8">
    <title>Checkout - Toko Online</title>
    <link rel="stylesheet" href="css/style.css">
    <style>
        .checkout-box { background: white; padding: 30px; border-radius: 8px; max-width: 500px; margin: 0 auto; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
        .form-group { margin-bottom: 15px; }
        .form-group label { display: block; margin-bottom: 5px; font-weight: bold; }
        .form-group input, .form-group textarea { width: 100%; padding: 10px; border: 1px solid #ccc; border-radius: 4px; font-size: 15px; }
    </style>
</head>
<body>

    <nav>
        <h2><a href="index.php">🛒 Toko Keren</a></h2>
    </nav>

    <div class="container">
        
        <!-- JIKA CHECKOUT BERHASIL (Menampilkan ucapan terima kasih) -->
        <?php if(isset($_GET['status']) && $_GET['status'] === 'sukses'): ?>
            
            <div class="checkout-box" style="text-align: center;">
                <h1 style="color: #2ecc71; margin-bottom: 15px;">🎉 Transaksi Berhasil!</h1>
                
                <?php if(isset($_SESSION['pesan_sukses'])): ?>
                    <p style="font-size: 16px; line-height: 1.6; margin-bottom: 25px;">
                        <?= $_SESSION['pesan_sukses'] ?>
                    </p>
                    <?php unset($_SESSION['pesan_sukses']); ?>
                <?php endif; ?>

                <a href="index.php" class="btn">Kembali ke Beranda</a>
            </div>

        <!-- JIKA SEDANG MENGISI FORM (Belum selesai) -->
        <?php else: ?>

            <div class="checkout-box">
                <h2 style="margin-bottom: 20px;">Form Pengiriman 📦</h2>

                <!-- Menampilkan Error jika ada -->
                <?php if(isset($error)): ?>
                    <div style="background: #e74c3c; color: white; padding: 10px; margin-bottom: 20px; border-radius: 4px;">
                        <?= $error ?>
                    </div>
                <?php endif; ?>

                <div style="background: #ecf0f1; padding: 15px; margin-bottom: 20px; border-radius: 4px;">
                    <strong>Total yang harus dibayar:</strong> 
                    <h3 style="color: #e67e22; margin-top: 5px;"><?= rupiah($total_bayar) ?></h3>
                </div>

                <form method="POST">
                    <div class="form-group">
                        <label>Nama Lengkap Pembeli</label>
                        <input type="text" name="nama_pembeli" required placeholder="Masukkan nama Anda">
                    </div>

                    <div class="form-group">
                        <label>Alamat Lengkap Pengiriman</label>
                        <textarea name="alamat" rows="4" required placeholder="Jalan, RT/RW, Kecamatan, Kota, Kode Pos..."></textarea>
                    </div>

                    <div style="margin-top: 25px;">
                        <button type="submit" class="btn btn-success">✅ Bayar Sekarang</button>
                    </div>
                </form>
                
                <div style="margin-top: 15px; text-align: center;">
                    <a href="keranjang.php" style="color: #7f8c8d; text-decoration: none;">← Kembali ke Keranjang</a>
                </div>
            </div>

        <?php endif; ?>

    </div>

</body>
</html>

Evaluasi Akhir

Selamat! Kamu baru saja membuat sistem e-commerce dasar menggunakan PHP dari awal (from scratch).

Aplikasi yang baru saja kamu bangun mengimplementasikan banyak konsep penting:

  1. Session Management: Untuk menyimpan aktivitas keranjang belanja.
  2. Koneksi Database (PDO): Secara aman mengambil dan memasukkan data.
  3. PRG Pattern (Post/Redirect/Get): Menghindari proses kirim ulang saat merefresh halaman form.
  4. Relasi Data: (Tabel produk & Kategori)
  5. Keamanan Sederhana: Menghindari input nakal menggunakan htmlspecialchars().

Apa Langkah Selanjutnya?

Toko online ini adalah fondasi. Jika kamu ingin mengembangkannya lagi, fitur ini bisa ditambahkan:

  • Halaman Khusus Admin untuk mengelola produk dan melihat daftar pesanan.
  • Menyimpan "Detail Pesanan" (Barang apa saja yang dibeli pada pesanan ID ke-X).
  • Integrasi Payment Gateway (Seperti Midtrans atau Xendit).
  • Fitur Login untuk Pembeli.

Namun, untuk menambahkan semua fitur rumit di atas, menggunakan PHP Native (manual) sangat melelahkan.

Itulah sebabnya Framework PHP diciptakan. Untuk langkah berikutnya, mari melangkah dari PHP mentah (Native) ke keajaiban PHP modern dengan masuk ke bab Jembatan ke Laravel →.