N
G
Content Management System

Portal Berita Gamifikasi.

PHP Native Gamification Logic Reward System PDF Generation

The Challenge

Problem Statement: Portal berita konvensional seringkali membosankan dan gagal mempertahankan retensi pembaca (User Retention). Pengunjung biasanya hanya membaca satu artikel lalu pergi yang mengakibatkan Bounce Rate tinggi.

Tantangannya adalah menciptakan ekosistem membaca yang interaktif dan menguntungkan bagi pengguna, sehingga mereka termotivasi untuk membaca lebih banyak artikel setiap harinya.

Technical Solution

Saya membangun Portal Berita berbasis PHP Native yang diintegrasikan dengan logika Sistem Gamifikasi.

  • Read-to-Earn: Algoritma otomatis memberikan 10 Poin setiap kali user selesai membaca artikel secara penuh (validasi durasi).
  • Reward Exchange: Poin yang terkumpul dapat ditukarkan secara real-time dengan hadiah digital (Pulsa, Voucher) melalui katalog hadiah.
  • Security First: Login aman dengan enkripsi MD5 dan proteksi input ketat untuk mencegah serangan XSS/SQL Injection.

Database Gamification Schema

Berdasarkan struktur database, saya merancang tabel khusus yang saling berelasi untuk menangani logika poin dan sistem penukaran hadiah agar integritas data tetap terjaga.

  • tb_user: Menyimpan total akumulasi poin pengguna (kolom poin).
  • tb_berita: Menyimpan master konten artikel yang menjadi sumber poin.
  • tb_riwayat: Mencatat riwayat/history baca agar pengguna tidak bisa mengakali sistem untuk mendapat poin ganda dari artikel yang sama.
  • tb_tukar_poin: Menjadi log transaksi untuk penukaran poin menjadi hadiah (berfungsi sebagai bukti transaksi).

Gamification Logic Flow:

IF (User Read Article ID: X) AND (Not in tb_riwayat)
THEN:
1. INSERT INTO tb_riwayat (id_user, id_berita, waktu)
2. UPDATE tb_user SET poin = poin + 10
3. SHOW NOTIFICATION "Selamat! +10 Poin"
BacaBeritaController.php (Point Injection Logic)

Berikut adalah implementasi logika backend PHP untuk memberikan poin kepada pengguna secara otomatis saat validasi syarat membaca artikel telah terpenuhi.

// Cek apakah user sudah pernah baca artikel ini sebelumnya?
$cekRiwayat = mysqli_query($koneksi, "SELECT * FROM tb_riwayat 
                                      WHERE id_user='$uid' AND id_berita='$id_berita'");

if(mysqli_num_rows($cekRiwayat) == 0) {
    // 1. Catat Riwayat Baca agar tidak ada double-claim
    mysqli_query($koneksi, "INSERT INTO tb_riwayat (id_user, id_berita, tanggal) 
                            VALUES ('$uid', '$id_berita', NOW())");
    
    // 2. Tambah Poin User (+10) secara real-time
    mysqli_query($koneksi, "UPDATE tb_user SET poin = poin + 10 WHERE id_user='$uid'");
    
    // 3. Berikan Feedback Positif ke User
    $alert = "Artikel selesai dibaca! Poin Anda bertambah +10.";
} else {
    $alert = "Anda sudah membaca artikel ini sebelumnya.";
}