PHP - Post-Redirect-Get (PRG)
Halo sana, para pemrogram yang sedang belajar! Hari ini, kita akan mendalami pola penting pengembangan web yang disebut Post-Redirect-Get, atau PRG untuk pendeknya. Jangan khawatir jika Anda baru dalam dunia pemrograman; saya akan mengarahkan Anda melalui konsep ini secara langkah demi langkah, seperti yang saya lakukan untuk ribuan murid dalam tahun-tahun mengajar saya. Jadi, ambil secangkir kopi (atau minuman favorit Anda), dan mari kita mulai perjalanan menarik ini bersama!
Apa Itu Post-Redirect-Get (PRG)?
Bayangkan Anda mengisi formulir untuk memesan pizza secara online. Anda mengklik tombol submit, dan kemudian... oops! Anda secara tak sengaja refresh halaman. Tiba-tiba, Anda memesan dua buah pizza bukannya satu! Ini adalah jenis masalah yang pola PRG membantunya untuk diselesaikan.
PRG adalah pola desain pengembangan web yang mencegah pengiriman formulir ganda saat pengguna refresh halaman setelah mengirimkan formulir. Itu seperti polisi lalu lintas untuk aplikasi web Anda, memastikan bahwa data mengalir mulus dan tidak terduplikasi secara tidak sengaja.
Bagaimana PRG Kerja
- Pengguna mengirimkan formulir menggunakan permohonan POST.
- Server memproses data formulir.
- Daripada mengirimkan tanggapan langsung, server mengirimkan pengalihan (biasanya ke halaman sukses).
- Browser pengguna mengikuti pengalihan dengan permohonan GET.
- Server merespon permohonan GET dengan halaman akhir.
Sekarang, mari kita lihat ini dalam tindakan dengan beberapa contoh kode!
Contoh 1: Implementasi PRG Sederhana
Mari kita mulai dengan contoh dasar bagaimana PRG bekerja dalam PHP. Kita akan membuat formulir sederhana yang memungkinkan pengguna mengirimkan warna favorit mereka.
Langkah 1: Formulir HTML (form.php)
<!DOCTYPE html>
<html>
<head>
<title>Formulir Warna Favorit</title>
</head>
<body>
<h1>Apa Warna Favorit Anda?</h1>
<form action="process.php" method="post">
<input type="text" name="color" required>
<input type="submit" value="Submit">
</form>
</body>
</html>
Formulir ini mengirimkan permohonan POST ke process.php
saat dikirim.
Langkah 2: Memproses Formulir (process.php)
<?php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$color = $_POST['color'];
// Simpan warna ke session
$_SESSION['favorite_color'] = $color;
// Redirect ke halaman hasil
header('Location: result.php');
exit;
} else {
// Jika seseorang mencoba mengakses halaman ini secara langsung, redirect ke formulir
header('Location: form.php');
exit;
}
mari kitauraikan ini:
- Kita memulai session untuk menyimpan data antar halaman.
- Kita memeriksa jika metode permohonan adalah POST.
- Jika ya, kita simpan warna yang dikirim ke session.
- Kita kemudian redirect pengguna ke
result.php
. - Jika seseorang mencoba mengakses halaman ini secara langsung (tidak melalui POST), kita mengarahkan mereka kembali ke formulir.
Langkah 3: Menampilkan Hasil (result.php)
<?php
session_start();
if (isset($_SESSION['favorite_color'])) {
$color = $_SESSION['favorite_color'];
// Kosongkan variabel session untuk mencegah menampilkan data lama saat refresh
unset($_SESSION['favorite_color']);
} else {
$color = 'Tidak ada warna yang dikirim';
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Warna Favorit Anda</title>
</head>
<body>
<h1>Warna Favorit Anda</h1>
<p>Anda katakan warna favorit Anda adalah: <?php echo htmlspecialchars($color); ?></p>
<a href="form.php">Kirim warna lain</a>
</body>
</html>
Di sini apa yang terjadi:
- Kita memulai session lagi untuk mengakses data yang disimpan.
- Kita memeriksa jika warna favorit disimpan di session.
- Jika ya, kita menampilkan dan kemudian kosongkan variabel session.
- Jika tidak, kita menampilkan pesan default.
Sekarang, meskipun pengguna refresh halaman hasil, mereka tidak akan mengirimkan data formulir lagi. Menarik, kan?
Contoh 2: PRG dengan Interaksi Database
Mari kita majukan contoh kita dan bayangkan kita menjalankan sistem pemesanan pizza. Kita akan menggunakan database untuk menyimpan pesanan dan implementasikan PRG untuk mencegah pesanan ganda.
Langkah 1: Formulir Pemesanan (order_form.php)
<!DOCTYPE html>
<html>
<head>
<title>Formulir Pemesanan Pizza</title>
</head>
<body>
<h1>Pesan Pizza Anda</h1>
<form action="process_order.php" method="post">
<label for="pizza_type">Tipe Pizza:</label>
<select name="pizza_type" id="pizza_type" required>
<option value="margherita">Margherita</option>
<option value="pepperoni">Pepperoni</option>
<option value="veggie">Veggie</option>
</select>
<br><br>
<label for="size">Ukuran:</label>
<select name="size" id="size" required>
<option value="small">Kecil</option>
<option value="medium">Medium</option>
<option value="large">Besar</option>
</select>
<br><br>
<input type="submit" value="Place Order">
</form>
</body>
</html>
Langkah 2: Memproses Pemesanan (process_order.php)
<?php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$pizza_type = $_POST['pizza_type'];
$size = $_POST['size'];
// Dalam aplikasi nyata, Anda ingin mensanitasi dan memvalidasi input ini
// Hubungkan ke database (Anda biasanya memasukkannya dalam file terpisah)
$db = new PDO('mysql:host=localhost;dbname=pizza_shop', 'username', 'password');
// Sisipkan pesanan
$stmt = $db->prepare("INSERT INTO orders (pizza_type, size) VALUES (?, ?)");
$stmt->execute([$pizza_type, $size]);
// Dapatkan ID pesanan
$order_id = $db->lastInsertId();
// Simpan ID pesanan di session
$_SESSION['last_order_id'] = $order_id;
// Redirect ke halaman konfirmasi
header('Location: order_confirmation.php');
exit;
} else {
// Jika seseorang mencoba mengakses halaman ini secara langsung, redirect ke formulir
header('Location: order_form.php');
exit;
}
Skrip ini:
- Memproses data formulir.
- Menyisipkan pesanan ke database.
- Menyimpan ID pesanan di session.
- Redirect ke halaman konfirmasi.
Langkah 3: Konfirmasi Pemesanan (order_confirmation.php)
<?php
session_start();
if (isset($_SESSION['last_order_id'])) {
$order_id = $_SESSION['last_order_id'];
// Kosongkan variabel session
unset($_SESSION['last_order_id']);
// Dalam aplikasi nyata, Anda ingin mengambil detail pesanan dari database di sini
// Untuk contoh ini, kita hanya menampilkan ID pesanan
$message = "Pesanan Anda (ID: $order_id) telah dipesan secara sukses!";
} else {
$message = "Tidak ada pesanan terbaru ditemukan. Silakan pesan lagi.";
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Konfirmasi Pemesanan</title>
</head>
<body>
<h1>Konfirmasi Pemesanan</h1>
<p><?php echo htmlspecialchars($message); ?></p>
<a href="order_form.php">Pesan lagi</a>
</body>
</html>
Halaman konfirmasi ini:
- Mengambil ID pesanan dari session.
- Menampilkan pesan konfirmasi.
- Kosongkan variabel session untuk mencegah menampilkan pesan yang sama saat refresh.
Mengapa PRG Penting
- Mencegah Pengiriman Ganda: Jika pengguna refresh halaman konfirmasi, mereka tidak akan secara tak sengaja mengirimkan pesanan lagi.
- Meningkatkan Pengalaman Pengguna: Pengguna melihat URL yang bersih di bar alamat, bukan string panjang data formulir.
- Mengikuti Prinsip REST: Permohonan GET digunakan untuk mengambil data, sedangkan permohonan POST digunakan untuk mengirimkan data.
Metode PRG Umum
Berikut adalah tabel metode umum yang digunakan dalam pola PRG:
Metode | Deskripsi |
---|---|
$_SERVER['REQUEST_METHOD'] |
Memeriksa metode permohonan HTTP (GET, POST, dll.) |
header('Location: ...') |
Mengirimkan header redirect ke browser |
exit |
Memastikan tidak ada kode selanjutnya dieksekusi setelah redirect |
session_start() |
Memulai session baru atau melanjutkan session yang ada |
$_SESSION |
Menyimpan dan mengambil data session |
isset() |
Memeriksa jika variabel diatur dan bukan NULL |
unset() |
Menghapus variabel yang ditentukan |
Ingat, para pemrogram muda, pola PRG adalah seperti menggunakan Kuasa dalam pengembangan web. Itu membawa keseimbangan ke aplikasi Anda, mencegah sisi gelap pengiriman formulir ganda. Semoga kode Anda berada bersama Anda!
Dalam kesimpulan, pola Post-Redirect-Get adalah alat kuat dalam peralatan pengembangan web Anda. Itu membantu membuat aplikasi yang lebih kuat dan ramah pengguna dengan mencegah pengiriman ganda. Sebagai Anda terus melanjutkan perjalanan Anda dalam PHP dan pengembangan web, Anda akan menemukan banyak situasi di mana PRG dapat menyelamatkan hari Anda. Tetap berlatih, stay curious, dan selamat coding!
Credits: Image by storyset