#Project: Toko Online Mini (Bagian 2)
Di bagian ini, kita akan menampilkan produk dari database MySQL ke halaman utama dan membuat fitur inti dari setiap toko online: Keranjang Belanja (Cart) menggunakan PHP Session.
#1. Menampilkan Katalog Produk
Buka file index.php dan tulis kode berikut:
<?php
require 'config/database.php';
// Menghitung jumlah item unik di keranjang
$jumlah_keranjang = isset($_SESSION['cart']) ? count($_SESSION['cart']) : 0;
// Query SQL untuk mengambil semua produk
$stmt = $pdo->query("SELECT * FROM produk ORDER BY id DESC");
$semua_produk = $stmt->fetchAll();
?>
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<title>Toko Online Mini</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<!-- Navbar -->
<nav>
<h2><a href="index.php">🛒 Toko Keren</a></h2>
<a href="keranjang.php">
Keranjang Belanja
<?php if($jumlah_keranjang > 0): ?>
<span class="cart-badge"><?= $jumlah_keranjang ?></span>
<?php endif; ?>
</a>
</nav>
<!-- Konten Utama -->
<div class="container">
<h2 style="margin-bottom: 20px;">Daftar Produk Terbaru</h2>
<?php if(isset($_SESSION['pesan_sukses'])): ?>
<div style="background: #2ecc71; color: white; padding: 10px; margin-bottom: 20px; border-radius: 4px;">
<?= $_SESSION['pesan_sukses'] ?>
<?php unset($_SESSION['pesan_sukses']); // Hapus pesan setelah ditampilkan ?>
</div>
<?php endif; ?>
<!-- Grid Produk -->
<div class="produk-grid">
<?php foreach($semua_produk as $produk): ?>
<div class="card">
<h3><?= htmlspecialchars($produk['nama_produk']) ?></h3>
<p><?= htmlspecialchars($produk['deskripsi']) ?></p>
<div class="harga"><?= rupiah($produk['harga']) ?></div>
<!-- Tombol Beli: Mengirim ID produk ke aksi-keranjang.php -->
<form action="aksi-keranjang.php" method="POST">
<input type="hidden" name="aksi" value="tambah">
<input type="hidden" name="produk_id" value="<?= $produk['id'] ?>">
<button type="submit" class="btn">Masukan Keranjang</button>
</form>
</div>
<?php endforeach; ?>
</div>
</div>
</body>
</html>#2. Membuat Logika Keranjang (Session)
Keranjang belanja tidak disimpan ke database (MySQL), melainkan disimpan sementara di memori server untuk user tersebut. Fitur ini menggunakan $_SESSION.
Buat file aksi-keranjang.php yang bertugas memproses form (tidak memiliki tampilan):
<?php
require 'config/database.php';
// Pastikan request menggunakan metode POST
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// Inisialisasi keranjang jika belum ada
if (!isset($_SESSION['cart'])) {
$_SESSION['cart'] = []; // Array kosong
}
$aksi = $_POST['aksi'] ?? '';
$id_produk = (int)($_POST['produk_id'] ?? 0);
if ($id_produk > 0) {
// AKSI: TAMBAH KE KERANJANG
if ($aksi === 'tambah') {
// Cek apakah produk SUDAH ADA di dalam keranjang
if (isset($_SESSION['cart'][$id_produk])) {
// Jika ada, tambah jumlahnya (Quantity) + 1
$_SESSION['cart'][$id_produk] += 1;
} else {
// Jika belum ada, masukkan dengan jumlah 1
$_SESSION['cart'][$id_produk] = 1;
}
// Berikan pesan sukses (Flash Message)
$_SESSION['pesan_sukses'] = "Produk berhasil ditambahkan ke keranjang!";
header("Location: index.php");
exit;
}
// AKSI: HAPUS DARI KERANJANG
elseif ($aksi === 'hapus') {
// Hapus item dari array session
unset($_SESSION['cart'][$id_produk]);
header("Location: keranjang.php");
exit;
}
}
}
// Jika diakses langsung tanpa POST, tendang kembali ke index
header("Location: index.php");
exit;Konsep Array pada Keranjang (Penting!):
Struktur $_SESSION['cart'] di atas akan terbentuk seperti ini:
Array
(
// ID Produk => Jumlah (Qty)
[3] => 1, // Mouse Wireless: 1 buah
[1] => 2, // Kemeja Flanel: 2 buah
[5] => 1 // Sepatu Sneakers: 1 buah
)#3. Menampilkan Halaman Keranjang
Sekarang kita buat halaman untuk membaca Session tadi dan mencocokkannya dengan harga di Database untuk menghitung Total.
Buka file keranjang.php:
<?php
require 'config/database.php';
// Ambil data keranjang dari session (jika kosong, gunakan array kosong)
$cart = $_SESSION['cart'] ?? [];
$produk_di_keranjang = [];
$total_bayar = 0;
// Jika keranjang tidak kosong, ambil detail produknya dari database
if (!empty($cart)) {
// Trik SQL IN: "SELECT * FROM produk WHERE id IN (1, 3, 5)"
$ids = implode(',', array_keys($cart));
// PENTING: Karena ini tutorial dasar, kita membolehkan query ini.
// Di aplikasi asli (Laravel), kita selalu pakai Prepared Statement untuk list IN.
$stmt = $pdo->query("SELECT * FROM produk WHERE id IN ($ids)");
$produk_di_keranjang = $stmt->fetchAll();
}
?>
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<title>Keranjang Belanja</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<!-- Navbar -->
<nav>
<h2><a href="index.php">🛒 Toko Keren</a></h2>
<a href="index.php">Lanjut Belanja →</a>
</nav>
<div class="container">
<h2>Isi Keranjang Belanja</h2><br>
<?php if (empty($produk_di_keranjang)): ?>
<div style="background: white; padding: 40px; text-align: center; border-radius: 8px;">
<h3>Keranjang Anda masih kosong 😢</h3>
<p style="margin-top:10px;"><a href="index.php" class="btn" style="width: auto;">Belanja Sekarang</a></p>
</div>
<?php else: ?>
<table>
<thead>
<tr>
<th>Produk</th>
<th>Harga Satuan</th>
<th>Jumlah</th>
<th>Subtotal</th>
<th>Aksi</th>
</tr>
</thead>
<tbody>
<?php foreach($produk_di_keranjang as $p): ?>
<?php
// Ambil quantity dari session berdasarkan ID produk
$qty = $cart[$p['id']];
$subtotal = $p['harga'] * $qty;
$total_bayar += $subtotal; // Tambahkan ke Grand Total
?>
<tr>
<td>
<strong><?= htmlspecialchars($p['nama_produk']) ?></strong>
</td>
<td><?= rupiah($p['harga']) ?></td>
<td><?= $qty ?></td>
<td><?= rupiah($subtotal) ?></td>
<td>
<!-- Tombol Hapus -->
<form action="aksi-keranjang.php" method="POST" onsubmit="return confirm('Hapus produk ini?');">
<input type="hidden" name="aksi" value="hapus">
<input type="hidden" name="produk_id" value="<?= $p['id'] ?>">
<button type="submit" class="btn btn-danger" style="width: auto; padding: 5px 10px;">Hapus</button>
</form>
</td>
</tr>
<?php endforeach; ?>
<tr class="total-row">
<td colspan="3" style="text-align: right;">TOTAL PEMBAYARAN:</td>
<td colspan="2" style="color: #e67e22;"><?= rupiah($total_bayar) ?></td>
</tr>
</tbody>
</table>
<!-- Tombol Checkout -->
<div style="text-align: right; margin-top: 20px;">
<a href="checkout.php" class="btn btn-success" style="width: auto;">
Lanjut ke Pembayaran 💳
</a>
</div>
<?php endif; ?>
</div>
</body>
</html>#Selanjutnya
Hebat! Fitur keranjang belanjamu (berbasis array session) sudah selesai dan berfungsi sempurna.
Di bagian terakhir, kita akan Membuat Form Checkout dan Membersihkan Keranjang → agar pesanan tersimpan rapi ke Database.