Membuat Polling dan Voting dengan PHP dan MySQL

10
Membuat Polling dan Voting dengan PHP dan MySQL

Polling online sebagian besar digunakan untuk mengetahui pilihan pengguna di web. Survei atau polling online banyak digunakan di web saat ini, dan ada banyak layanan yang tersedia yang menyediakan sistem polling built-in. Tetapi jika kamu ingin membuat Polling dan Voting dengan PHP sendiri, tutorial ini akan membantumu.

Tutorial ini akan membahas cara membuat polling dan voting dengan PHP dan MySQL. Kita akan menggunakan PHP dan MySQL untuk membuat sistem polling tanpa JavaScript atau jQuery. Juga, Script voting ini menggunakan PHP dan MySQL untuk menyimpan data polling, pilihan polling dan jumlah voting ke dalam database.

Kegunaan Script Polling

Data polling akan tersimpan dalam database MySQL. Pertanyaan polling dan voting masing-masing akan diambil dari database dan ditampilkan kepada pengguna. Pengguna dapat dapat memilih salah satu pilihan dan mengirimkan vote mereka.

Setelah suara dikirimkan, itu akan disimpan dalam database dengan pilihan polling yang bersangkutan. Juga, kita akan menggunakan PHP COOKIE untuk membatasi pengguna agar tidak mengirimkan suara untuk beberapa kali. Hasil poling dengan total voting dihitung dan voting pada masing-masing pilihan akan ditampilkan di halaman hasil.php. Hasil pilihan polling akan ditampilkan sebagai persentase bar.

Membuat table database

Sistem polling ini menggunakan 3 tabel database MySQL: poll, pilihan_poll, dan poll_vote.

Tabel poll ini berisi pertanyaan polling.

CREATE TABLE `poll` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `tanya` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 `dibuat` datetime NOT NULL,
 `diubah` datetime NOT NULL,
 `status` enum('1','0') COLLATE utf8_unicode_ci NOT NULL DEFAULT '1',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Tabel pilihan_poll ini berisi pilihan-pilhan polling dan ID polling yang berkaitan.

CREATE TABLE `pilihan_poll` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `id_poll` int(11) NOT NULL,
 `nama` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 `dibuat` datetime NOT NULL,
 `diubah` datetime NOT NULL,
 `status` enum('1','0') COLLATE utf8_unicode_ci NOT NULL DEFAULT '1',
 PRIMARY KEY (`id`),
 KEY `id_poll` (`id_poll`),
 CONSTRAINT `pilihan_poll_ibfk_1` FOREIGN KEY (`id_poll`) REFERENCES `poll` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Tabel poll_vote ini berisi jumlah hitungan voting dari pilihan polling. Kolom id_pilihan_poll dan id_poll berelasi.

CREATE TABLE `poll_vote` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `id_poll` int(11) NOT NULL,
 `id_pilihan_poll` int(11) NOT NULL,
 `jumlah_vote` bigint(10) NOT NULL,
 PRIMARY KEY (`id`),
 KEY `id_poll` (`id_poll`),
 KEY `id_pilihan_poll` (`id_pilihan_poll`),
 CONSTRAINT `poll_vote_ibfk_1` FOREIGN KEY (`id_poll`) REFERENCES `poll` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION,
 CONSTRAINT `poll_vote_ibfk_2` FOREIGN KEY (`id_pilihan_poll`) REFERENCES `pilihan_poll` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

ibfk diatas maksudnya InnoDB Foreign Key, ini hanya penamaan saja kok.

Memasukkan polling dan pilihan data yang terkait ke dalam database untuk tujuan percobaan.

INSERT INTO `poll` (`id`, `tanya`, `dibuat`, `diubah`, `status`) VALUES
(1, 'Apa bahasa pemrograman yang pertama kali Anda pelajari?', '2017-02-23 08:00:00', '2017-02-23 08:00:00', '1');

INSERT INTO `pilihan_poll` (`id`, `id_poll`, `nama`, `dibuat`, `diubah`, `status`) VALUES
(1, 1, 'C++', '2017-02-23 09:00:00', '2017-02-23 09:00:00', '1'),
(2, 1, 'Java', '2017-02-23 09:00:00', '2017-02-23 09:00:00', '1'),
(3, 1, 'Pascal', '2017-02-23 09:00:00', '2017-02-23 09:00:00', '1'),
(4, 1, 'Lainnya', '2017-02-23 09:05:00', '2017-02-23 09:05:00', '1');

Class Poll

Class Poll digunakan untuk menangani semua permintaan untuk seluruh sistem polling dan voting. Class ini melakukan fungsi-fungsi berikut.

__construct() » Menghubungkan dan memilih database

ambilQuery() » Mengeksekusi query SQL pada database MySQL dan mengembalikan data. Ini adalah fungsi private yang hanya digunakan di class ini.

ambilPoll() » Mengambil polling dan pilihan yang terkait. Selain itu, dapat mengambil beberapa data polling berdasarkan permintaan.

vote() » Memasukkan atau meng-update penghitungan polling ke dalam database.

ambilHasil() » Memberikan hasil polling dengan jumlah vote dari pilihan polling.

<?php
/*
 * Class pengelolaan Polling
 * Class ini digunakan untuk mengelola sistem polling & voting secara online
 */
class Poll{
    private $hostDb  = 'localhost';
    private $userDb  = 'root';
    private $pwdDb   = '';
    private $namaDb  = 'sistem_poll';
    private $db      = false;
    private $tblPoll = 'poll';
    private $tblPlh  = 'pilihan_poll';
    private $tblVote = 'poll_vote';

    public function __construct(){
        if(!$this->db){
            // Menghubungkan ke database
            $conn = new mysqli($this->hostDb, $this->userDb, $this->pwdDb, $this->namaDb);
            if($conn->connect_error){
                die("Gagal terhubung ke MySQL: " . $conn->connect_error);
            }else{
                $this->db = $conn;
            }
        }
    }

    // Menjalankan query ke database
    private function ambilQuery($sql,$returnType = ''){
        $data = '';
        $hasil = $this->db->query($sql);
        if($hasil){
            switch($returnType){
                case 'hitung':
                    $data = $hasil->num_rows;
                    break;
                case 'single':
                    $data = $hasil->fetch_assoc();
                    break;
                default:
                    if($hasil->num_rows > 0){
                        while($row = $hasil->fetch_assoc()){
                            $data[] = $row;
                        }
                    }
            }
        }
        return !empty($data)?$data:false;
    }

    // Mengambil data polling
    public function ambilPoll($pollType = 'single'){
        $dataPoll = array();
        $sql = "SELECT * FROM ".$this->tblPoll." WHERE status = '1' ORDER BY dibuat DESC";
        $hasilPoll = $this->ambilQuery($sql, $pollType);
        if(!empty($hasilPoll)){
            if($pollType == 'single'){
                $dataPoll['poll'] = $hasilPoll;
                $sql2 = "SELECT * FROM ".$this->tblPlh." WHERE id_poll = ".$hasilPoll['id']." AND status = '1'";
                $hasilPilihan = $this->ambilQuery($sql2);
                $dataPoll['options'] = $hasilPilihan;
            }else{
                $i = 0;
                foreach($hasilPoll as $prow){
                    $dataPoll[$i]['poll'] = $prow;
                    $sql2 = "SELECT * FROM ".$this->tblPlh." WHERE id_poll = ".$prow['id']." AND status = '1'";
                    $hasilPilihan = $this->ambilQuery($sql2);
                    $dataPoll[$i]['options'] = $hasilPilihan;
                }
            }
        }
        return !empty($dataPoll)?$dataPoll:false;
    }

    // Mengirimkan vote
    public function vote($data = array()){
        if(!isset($data['id_poll']) || !isset($data['id_pilihan_poll']) || isset($_COOKIE[$data['id_poll']])) {
            return false;
        }else{
            $sql = "SELECT * FROM ".$this->tblVote." WHERE id_poll = ".$data['id_poll']." AND id_pilihan_poll = ".$data['id_pilihan_poll'];
            $preVote = $this->ambilQuery($sql, 'hitung');
            if($preVote > 0){
                $query = "UPDATE ".$this->tblVote." SET jumlah_vote = jumlah_vote+1 WHERE id_poll = ".$data['id_poll']." AND id_pilihan_poll = ".$data['id_pilihan_poll'];
                $update = $this->db->query($query);
            }else{
                $query = "INSERT INTO ".$this->tblVote." (id_poll,id_pilihan_poll,jumlah_vote) VALUES (".$data['id_poll'].",".$data['id_pilihan_poll'].",1)";
                $insert = $this->db->query($query);
            }
            return true;
        }
    }

    // Mengambil hasil polling
    public function ambilHasil($IDpoll){
        $hasilData = array();
        if(!empty($IDpoll)){
            $sql = "SELECT p.tanya, SUM(v.jumlah_vote) as total_vote FROM ".$this->tblVote." as v LEFT JOIN ".$this->tblPoll." as p ON p.id = v.id_poll WHERE id_poll = ".$IDpoll;
            $hasilPoll = $this->ambilQuery($sql,'single');
            if(!empty($hasilPoll)){
                $hasilData['poll'] = $hasilPoll['tanya'];
                $hasilData['total_vote'] = $hasilPoll['total_vote'];
                $sql2 = "SELECT o.id, o.nama, v.jumlah_vote FROM ".$this->tblPlh." as o LEFT JOIN ".$this->tblVote." as v ON v.id_pilihan_poll = o.id WHERE o.id_poll = ".$IDpoll;
                $hasilPlh = $this->ambilQuery($sql2);
                if(!empty($hasilPlh)){
                    foreach($hasilPlh as $orow){
                        $hasilData['options'][$orow['nama']] = $orow['jumlah_vote'];
                    }
                }
            }
        }
        return !empty($hasilData)?$hasilData:false;
    }
}

Tampilan Polling (index.php)

File ini yang menampilkan pertanyaan dan pilihan polling. Untuk memilih salah satu pilihan, tombol radio ditempatkan dengan masing-masing label pilihan. Di bagian bawah, tombol kirim disediakan untuk mengirimkan voting dan link untuk melihat hasil polling.

<?php
    //Mengambil polling and data pilihan polling
    $dataPoll = $poll->ambilPoll();
?>

<form class="form-poll" action="" method="post" name="pollFrm">
    <div class="title">
        <h3>
        <?php echo !empty($statuPsn)?'<p class="stsPsn">'.$statuPsn.'</p>':''; ?>
        <?php echo $dataPoll['poll']['tanya']; ?>
        </h3>
    </div>
    <div class="element-radio">
        <ul>
            <?php foreach($dataPoll['options'] as $opt){
                echo '<li><input required type="radio" name="voteOpt" value="'.$opt['id'].'" >'.$opt['nama'].'</li>';
            } ?>
        </ul>
    </div>
    <div class="submit">
        <input type="hidden" name="IDpoll" value="<?php echo $dataPoll['poll']['id']; ?>">
        <input type="submit" name="submitVote" class="button" value="Vote">
        <input type="button" value="Hasil" onclick="location.href='hasil.php?IDpoll=<?php echo $dataPoll['poll']['id']; ?>'"/>
    </div>
</form>

Setelah pilihan yang dipilih dikirimkan, vote dimasukkan dengan menggunakan class Poll. Juga, PHP COOKIE digunakan untuk menandakan pengguna telah memVote dan status akan ditampilkan kepada pengguna.

<?php
//Menyertakan dan menginisialisasi class Poll
include 'Poll.php';
$poll = new Poll;

//Memeriksa apakah vote dikirimkan
if(isset($_POST['submitVote'])){
    $dataVote = array(
        'id_poll' => $_POST['IDpoll'],
        'id_pilihan_poll' => $_POST['voteOpt']
    );
    //Mengirim vote dengan class Poll
    $submitVote = $poll->vote($dataVote);
    if($submitVote){
        //menyimpan dalam $_COOKIE untuk menandakan pengguna telah memvote
        setcookie($_POST['IDpoll'], 1, time()+60*60*24*365);
        $statuPsn = 'Voting Anda telah berhasil dikirim.';
    }else{
        $statuPsn = 'Anda sudah mengirim voting.';
    }
}
?>

Hasil Polling (hasil.php)

Dalam file ini, hasil polling diambil dari database dan hasilnya akan ditampilkan kepada pengguna. Jumlah vote untuk setiap pilihan dikonversi ke format persentase dan ditampilkan sebagai persentase bar.

<?php
//Menyertakan dan menginisialisasi class Poll
include 'Poll.php';
$poll = new Poll;
?>
    <?php
      //Mengambil data hasil polling
      $hasilPoll = $poll->ambilHasil($_GET['IDpoll']);
    ?>
    <h3><?php echo $hasilPoll['poll']; ?></h3>
    <p><b>Total Vote:</b> <?php echo $hasilPoll['total_vote']; ?></p>
    <?php
    if(!empty($hasilPoll['options'])){ $i=0;
      //Pilihan warna bar dalam array
      $warnaBarArr = array('merah','kuning','hijau','ungu','red');
      //Menghasilkan bar dengan jumlah hitungan vote
      foreach($hasilPoll['options'] as $opt=>$vote){
        //Menghitung vote dalam persen
        $votePercent = round(($vote/$hasilPoll['total_vote'])*100);
        $votePercent = !empty($votePercent)?$votePercent.'%':'0%';
        //Mendefinisikan class warna bar
        if(!array_key_exists($i, $warnaBarArr)){
            $i=0;
        }
        $warnaBar = $warnaBarArr[$i];
    ?>
    <div class="container-bar-utama <?php echo $warnaBar; ?>">
        <div class="teks"><?php echo $opt; ?></div>
        <div class="wrap">
          <div class="persentase-bar"><?php echo $votePercent; ?></div>
          <div class="container-bar">
            <div class="bar" style="width: <?php echo $votePercent; ?>;"></div>
          </div>
        </div>
    </div>
    <?php $i++; } } ?>
    <div class="kembali">
    <input type="button" value="Kembali" onclick="location.href='index.php'"/>
    </div>
</div>

Kesimpulan

Di sini saya telah menunjukkan cara membuat Polling dan Voting dengan PHP dan MySQL. Kamu dapat dengan mudah mengembangkan sistem script PHP polling dan voting sederhana ini sesuai kebutuhanmu. Semoga tutorial voting online ini membantu untuk memahami cara membuat sistem polling secara online dan polling web Anda sendiri menggunakan PHP dan MySQL. Untuk CSS tidak saya sertakan di postingan, karena akan terlalu banyak kode.

BAGIKAN
Subscribe
Beritahu
guest
10 Comments
terlama
terbaru vote teratas
Inline Feedbacks
View all comments
alfarido
alfarido
Oktober 1, 2017 01:42

gan cara agar pengguna bisa menginput/mengisi terus gimana ya??

david
david
Januari 13, 2018 00:14

mantap gan..

ardi
ardi
Maret 13, 2018 17:46

gan cara hiden index dengan htaccess gimana ya gan?

wahyu
wahyu
Juli 3, 2018 13:02

cara next ke pertanyaan berikutnya gimana bosku?

Dewi Maliana
Agustus 1, 2018 00:49

Terimakasih untuk informasinya sangat bermanfaat sekali

Relawan
Maret 29, 2019 07:06

kalau berbasis html. bisa apa tidak?

riski
riski
Juni 13, 2019 16:30

ini nama databases nya apa ya gan?

tenten
tenten
April 14, 2021 07:28

Link download mati gan