PHP - Post-Redirect-Get (PRG)

Hai pengguna muda yang bersemangat! Hari ini, kita akan mendalami pola penting dalam pengembangan web yang disebut Post-Redirect-Get, atau PRG untuk pendek. Jangan khawatir jika Anda baru dalam programming; saya akan mengarahkan Anda melalui konsep ini secara berperingkat, sama seperti yang saya lakukan untuk ribuan murid dalam tahunajaran pengajaran saya. Jadi, ambil secangkir kopi (atau minuman favorit Anda), dan mari kita mulai perjalanan menarik ini bersama!

PHP - Post-Redirect-Get (PRG)

Apa Itu Post-Redirect-Get (PRG)?

Bayangkan Anda mengisi formulir untuk memesan pizza secara online. Anda mengklik 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 membantu untuk mengatasi.

PRG adalah pola desain pengembangan web yang mencegah pengiriman formulir ganda saat pengguna refresh halaman setelah mengirimkan formulir. Itu seperti petugas lalu lintas untuk aplikasi web Anda, memastikan bahwa data mengalir mulus dan tidak secara tak sengaja terduplikasi.

Bagaimana PRG Bekerja

  1. Pengguna mengirimkan formulir menggunakan permintaan POST.
  2. Server memproses data formulir.
  3. Daripada mengirimkan tanggapan langsung, server mengirimkan pengalihan ( biasanya ke halaman sukses).
  4. Browser pengguna mengikuti pengalihan dengan permintaan GET.
  5. Server menanggapi permintaan 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>Warna Favorit Anda Mana?</h1>
<form action="process.php" method="post">
<input type="text" name="color" required>
<input type="submit" value="Submit">
</form>
</body>
</html>

Formulir ini mengirimkan permintaan POST ke process.php saat dikirimkan.

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 langsung, redirect mereka ke formulir
header('Location: form.php');
exit;
}

mari kitauraikan ini:

  1. Kita mulai session untuk menyimpan data antar halaman.
  2. Kita memeriksa jika metode permintaan adalah POST.
  3. Jika itu benar, kita simpan warna yang dikirim ke session.
  4. Kita kemudian redirect pengguna ke result.php.
  5. Jika seseorang mencoba mengakses halaman ini langsung (tidak melalui POST), kita redirect mereka 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:

  1. Kita mulai session lagi untuk mengakses data yang disimpan.
  2. Kita memeriksa jika warna favorit disimpan di session.
  3. Jika ya, kita menampilkan dan kemudian kosongkan variabel session.
  4. Jika tidak, kita menampilkan pesan default.

Sekarang, bahkan jika 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 implementasi PRG untuk mencegah pesanan ganda.

Langkah 1: Formulir Pesanan (order_form.php)

<!DOCTYPE html>
<html>
<head>
<title>Formulir Pesanan 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">Menengah</option>
<option value="large">Besar</option>
</select>
<br><br>
<input type="submit" value="Place Order">
</form>
</body>
</html>

Langkah 2: Memproses Pesanan (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

// Hubungi database (Anda biasanya memasukkannya dalam file terpisah)
$db = new PDO('mysql:host=localhost;dbname=pizza_shop', 'username', 'password');

// Masukkan 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 langsung, redirect mereka ke formulir
header('Location: order_form.php');
exit;
}

Skrip ini:

  1. Memproses data formulir.
  2. Memasukkan pesanan ke database.
  3. Menyimpan ID pesanan di session.
  4. Redirect ke halaman konfirmasi.

Langkah 3: Konfirmasi Pesanan (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 akan menampilkan ID pesanan
$message = "Pesanan Anda (ID: $order_id) telah diterima dengan sukses!";
} else {
$message = "Tidak ada pesanan terbaru ditemukan. Silakan buat pesanan lain.";
}
?>

<!DOCTYPE html>
<html>
<head>
<title>Konfirmasi Pesanan</title>
</head>
<body>
<h1>Konfirmasi Pesanan</h1>
<p><?php echo htmlspecialchars($message); ?></p>
<a href="order_form.php">Buat pesanan lain</a>
</body>
</html>

Halaman konfirmasi ini:

  1. Mengambil ID pesanan dari session.
  2. Menampilkan pesan konfirmasi.
  3. Kosongkan variabel session untuk mencegah menampilkan pesan yang sama saat refresh.

Dengan demikian, bahkan jika pengguna refresh halaman konfirmasi, mereka tidak akan secara tak sengaja mengirimkan pesanan lagi.

Mengapa PRG Penting

  1. Mencegah Pengiriman Ganda: Jika pengguna refresh halaman konfirmasi, mereka tidak secara tak sengaja mengirimkan pesanan lagi.
  2. Meningkatkan Pengalaman Pengguna: Pengguna melihat URL yang bersih di bar alamat, bukan string panjang data formulir.
  3. Mengikuti Prinsip REST: Permintaan GET digunakan untuk mengambil data, sedangkan permintaan 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 permintaan HTTP (GET, POST, dll.)
header('Location: ...') Mengirimkan header redirect ke browser
exit Memastikan tidak ada kode lain yang 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 padawan muda, pola PRG adalah seperti menggunakan Force dalam pengembangan web. Itu membawa keseimbangan ke aplikasi Anda, mencegah dark side dari pengiriman formulir ganda. May the code be with you!

Dalam kesimpulan, pola Post-Redirect-Get adalah alat kuat dalam peralatan pengembangan web Anda. Itu membantu membuat aplikasi yang lebih robusta dan user-friendly dengan mencegah pengiriman ganda secara tak sengaja. Sepanjang Anda terus melanjutkan perjalanan Anda dalam PHP dan pengembangan web, Anda akan menemukan banyak situasi lain di mana PRG dapat menyelamatkan hari. Terus latih, tetap bersemangat, dan selamat coding!

Credits: Image by storyset