Membuat Aplikasi Perhitungan Suara (Real Count) dengan PHP dan MySQL (Part. 2/Selesai)


Bismillahirrohmanirrohim. Melanjutkan postingan sebelumnya dan sekaligus menunaikan janji diakhir postingan tersebut, kali ini kita akan lanjutkan tahapan pembuatan aplikasi perhitungan suara (Real Count) dengan PHP dan MySQL bagian kedua. Pada bagian ini kita akan membahas pembuatan modul-modul aplikasi.

Tanpa banyak basa-basi lagi, sebelum membuat modul aplikasi saatnya kita akan buat menyiapkan assets website, terdiri dari file css dan gambar-gambar yang dibutuhkan.

Membuat file kpu/assets/css/style.css

Pertama silakan teman-teman buat folder baru bernama css didalam folder assets. Didalam folder css tersebut silakan buat satu file baru bernama style.css yang isinya sebagai berikut:

* {
	margin: 0;
	padding: 0;
	line-height: 1.5em;
	font-family: "Comic Sans MS";
}

.header {
	background: darkorange;
	color: #fff;
	padding: 30px 20px 0 20px;	
}

.container {
	width: 900px;
	margin: 0 auto;
	/*border: 1px solid red;*/
}


.menu {
	list-style: none;
	background: #fff;
	margin-top: 20px;
	padding: 10px;
}

.menu li {
	display: inline;
}

.menu li a {
	text-decoration: none;
	font-weight: bold;
	color: darkorange;
	padding: 10px;
}


.main {
	padding: 0 20px 20px 20px;
	min-height: 500px;
	background: #fff;
}


.copy {
	padding: 20px;
	background: darkorange;
	font-size: small;
	color: #fff;
}

/* ------------ content ---------------- */
h2.title {
	border-bottom: 1px dashed #333;
	margin-bottom: 10px;
	padding-bottom: 10px;
}

form {
	margin: 20px 0;
}

table.data {
	min-width: 350px;
}

table.data tr td {
	border: 1px solid #333;
}

table.data tr td:nth-child(1) {
	width: 15px;
}

Setelah itu, kita akan persiapkan assets lainnya yaitu berupa 3 buah gambar yang akan dijadikan sebagai grafik bar yang menunjukkan banyaknya perolehan suara maupun suara tidak sah. Ketiga gambar tersebut silakan letakkan didalam folder assets/images yang mana ketiganya dapat didownload disini

Membuat modul “home”

Modul ini ialah modul yang pertama kali diakses oleh pengunjung website, pun juga dapat dilihat oleh admin dan superadmin. Modul ini berguna untuk menampilkan grafik hasil pilpres yang kita buat.

Untuk membuat modul ini, silakan buat folder baru bernama mod_home didalam folder modules. Didalam folder mod_home ini silakan buat satu buah file bernama home.php dengan isi sebagai berikut:

<h2 class="title"&gt;Home</h2&gt;
<p&gt;Perolehan suara untuk kandidat</p&gt;<br/&gt;

<?php
$query = "SELECT sum(suara1) as s1, sum(suara2) as s2, sum(suara_tidak_sah) as tidak_sah, (sum(suara1) + sum(suara2) + sum(suara_tidak_sah)) as total 
				FROM suara
				WHERE validasi = '1'";
$result = mysqli_query($koneksi, $query) or die(mysqli_error($koneksi));
$data = mysqli_fetch_object($result);

// tampilkan hasil sampai 2 digit dibelakang koma
$suara1 = ($data-&gt;total &gt; 0) ? round($data-&gt;s1 / $data-&gt;total * 100, 2) : 0;
$suara2 = ($data-&gt;total &gt; 0) ? round($data-&gt;s2 / $data-&gt;total * 100, 2) : 0;
$tidak_sah = ($data-&gt;total &gt; 0) ? round($data-&gt;tidak_sah / $data-&gt;total * 100, 2) : 0;
?&gt;

<table&gt;
	<tr&gt;
		<td width="200"&gt;Suara Kandidat 1</td&gt;
		<td&gt;<img src="assets/images/__01.png" width="<?php echo $suara1; ?&gt;" height="35"&gt; <?php echo $suara1; ?&gt;% (<?php echo $data-&gt;s1; ?&gt; suara)</td&gt;
	</tr&gt;
	<tr&gt;
		<td&gt;Suara Kandidat 2</td&gt;
		<td&gt;<img src="assets/images/__02.png" width="<?php echo $suara2; ?&gt;" height="35"&gt; <?php echo $suara2; ?&gt;%  (<?php echo $data-&gt;s2; ?&gt; suara)</td&gt;
	</tr&gt;
	<tr&gt;
		<td&gt;Suara Tidak Sah</td&gt;
		<td&gt;<img src="assets/images/__x.png" width="<?php echo $tidak_sah; ?&gt;" height="35"&gt; <?php echo $tidak_sah; ?&gt;%  (<?php echo $data-&gt;tidak_sah; ?&gt; suara)</td&gt;
	</tr&gt;

	<tr&gt;
		<td height="35"&gt;Total Suara Masuk</td&gt;
		<td&gt;<?php echo ($data-&gt;total &gt; 0) ? $data-&gt;total : 0; ?&gt; Suara</td&gt;
	</tr&gt;
</table&gt;

Membuat modul Login

Modul ini sesuai namanya berguna untuk menyediakan halaman login yang dapat digunakan oleh admin dan superadmin ketika akan masuk kedalam dashboard. Untuk membuat halaman login (login.php), silakan buat folder bernama mod_login dan didalamnya terdapat file bernama login.php dengan isi sebagai berikut:

<h2 class="title"&gt;Login</h2&gt;
<p&gt;Masukkan Username dan Password Anda pada kotak isian berikut!</p&gt;

<form method="post" action="modules/mod_login/aksi.php"&gt;
	<table&gt;
		<tr&gt;
			<td&gt;Username</td&gt;
			<td&gt;<input type="text" name="username"/&gt;</td&gt;
		</tr&gt;

		<tr&gt;
			<td&gt;Password</td&gt;
			<td&gt;<input type="password" name="password"/&gt;</td&gt;
		</tr&gt;

		<tr&gt;
			<td&gt;</td&gt;
			<td&gt;<input type="submit" name="submit" value="Login"&gt;</td&gt;
		</tr&gt;
	</table&gt;
</form&gt;

Ketika user menekan tombol login, maka data yang diinput pada halaman login akan diproses oleh file bernama aksi.php yang berada didalam folder mod_login. Isinya adalah sebagai berikut:

<?php
session_start();
include "../../koneksi.php";

$username = $_POST['username'];
$password = md5($_POST['password']);

$query = "SELECT * FROM pengguna WHERE username = '$username' AND password = '$password'";
$result = mysqli_query($koneksi, $query) or die(mysqli_error($koneksi));

if(mysqli_num_rows($result) == 1) {
	$data = mysqli_fetch_object($result);
	$_SESSION['role'] = $data-&gt;role;

	// arahkan ke halaman home lagi
	header('location:../../index.php');
}
else {
	exit("Login gagal!");
}

Sampai disini kita telah berhasil menampilkan grafik hasil perhitungan suara KPU dan juga berhasil membuat halaman login dengan PHP. Untuk melihat hasilnya, teman-teman bisa mengaksesnya menggunakan web broser masing-masing dengan alamat localhost/kpu

Membuat modul TPS

Modul ini digunakan oleh superadmin untuk menginput nama-nama TPS. Modul ini sangat sederhana, karena TPS yang diinput tidak terdiri dari nama propinsi, kabupaten, kecamatan dan desa/kelurahan.

Untuk membuat modul ini, silakan buat folder bernama modules/mod_tps. Didalam folder mod_tps ini terdapat file bernama tps.php yang isinya:

<h2 class="title"&gt;TPS</h2&gt;
<p&gt;Masukkan nama-nama TPS yang tersebar diseluruh Indonesia</p&gt;

<form method="post" action="modules/mod_tps/aksi.php?act=tambah"&gt;
	<table&gt;
		<tr&gt;
			<td&gt;Nama TPS</td&gt;
			<td&gt;
				<input type="text" name="nama_tps" autocomplete="off" /&gt;
				<input type="submit" name="submit" value="Simpan"/&gt;
				<input type="reset" name="reset" value="Batal"/&gt;
			</td&gt;
		</tr&gt;
	</table&gt;
</form&gt;


<h2 class="title"&gt;Data TPS</h2&gt;
<table class="data"&gt;
	<tr&gt;
		<td&gt;No.</td&gt;
		<td&gt;Nama TPS</td&gt;
	</tr&gt;

	<?php
	$query = "SELECT * FROM tps";
	$result = mysqli_query($koneksi, $query) or die(mysqli_error($koneksi));

	$no = 1;
	while($data = mysqli_fetch_object($result)): ?&gt;
		<tr&gt;
			<td&gt;<?php echo $no; $no++; ?&gt;</td&gt;
			<td&gt;<?php echo $data-&gt;nama_tps; ?&gt;</td&gt;
		</tr&gt;
	<?php endwhile; ?&gt;

</table&gt;

Selain itu, didalam folder mod_tps juga terdapat file aksi.php yang berguna melakukan proses input tps kedalam tabel tps. Isinya:

<?php
include "../../koneksi.php";

$nama_tps = $_POST['nama_tps'];

$query = "INSERT INTO tps VALUES ('', '$nama_tps')";
$result = mysqli_query($koneksi, $query) or die(mysqli_error($koneksi));

if($result) {
	header('location:../../index.php?mod=tps');
} else {
	echo "Gagal saat input data";
}

Membuat modul Suara

Modul suara ini berguna untuk menginput jumlah perolehan suara dari tiap-tiap TPS. Modul ini hanya dapat diakses oleh seorang admin. Selain menginput jumlah perolehan suara, disini seorang admin juga dapat mengupload form C1. Untuk membuat modul suara, terlebih dahulu silakan buat folder bernama mod_suara didalam folder modules.

Didalam folder mod_suara, buat sebuah file bernama suara.php dengan isi:

<h2 class="title"&gt;Input Suara</h2&gt;
<p&gt;Masukkan perolehan suara dari tiap-tiap TPS</p&gt;

<form method="post" action="modules/mod_suara/aksi.php" enctype="multipart/form-data"&gt;
	<table&gt;
		<tr&gt;
			<td&gt;Pilih TPS</td&gt;
			<td&gt;
				<select name="id"&gt;
					<?php
					$query = "SELECT * FROM tps WHERE id NOT IN(SELECT id FROM suara)";
					$result = mysqli_query($koneksi, $query) or die(mysqli_error($koneksi));

					while($data = mysqli_fetch_object($result)): ?&gt;
						<option value="<?php echo $data-&gt;id; ?&gt;"&gt;<?php echo $data-&gt;nama_tps; ?&gt;</option&gt;
					<?php endwhile; ?&gt;

				</select&gt;
			</td&gt;
		</tr&gt;
		<tr&gt;
			<td&gt;Suara Kandidat 1</td&gt;
			<td&gt;<input type="text" name="suara1"/&gt;</td&gt;
		</tr&gt;
		<tr&gt;
			<td&gt;Suara Kandidat 2</td&gt;
			<td&gt;<input type="text" name="suara2"/&gt;</td&gt;
		</tr&gt;
		<tr&gt;
			<td&gt;Suara Sah</td&gt;
			<td&gt;<input type="text" name="suara_sah"/&gt;</td&gt;
		</tr&gt;
		<tr&gt;
			<td&gt;Suara Tidak Sah</td&gt;
			<td&gt;<input type="text" name="suara_tidak_sah"/&gt;</td&gt;
		</tr&gt;
		<tr&gt;
			<td&gt;Lampirkan Foto C1</td&gt;
			<td&gt;<input type="file" name="c1"/&gt;</td&gt;
		</tr&gt;

		<tr&gt;
			<td&gt;</td&gt;
			<td&gt;
				<input type="submit" name="submit" value="Simpan"&gt;
				<input type="reset" name="reset" value="Batal"/&gt;
			</td&gt;
		</tr&gt;
	</table&gt;
</form&gt;


<h2 class="title"&gt;Data Perolehan Suara</h2&gt;
<table class="data"&gt;
	<tr&gt;
		<td&gt;No.</td&gt;
		<td&gt;Nama TPS</td&gt;
		<td&gt;Suara Kandidat 1</td&gt;
		<td&gt;Suara Kandidat 2</td&gt;
		<td&gt;Suara Sah</td&gt;
		<td&gt;Suara Tidak Sah</td&gt;
		<td&gt;Status</td&gt;
	</tr&gt;

	<?php
	$query = "SELECT * FROM suara JOIN tps ON suara.id = tps.id";
	$result = mysqli_query($koneksi, $query) or die(mysqli_error($koneksi));

	$no = 1;
	$suara1 = 0;
	$suara2 = 0;
	$suara_sah = 0;
	$suara_tidak_sah = 0;

	while($data = mysqli_fetch_object($result)): 
		$suara1 = $suara1 + $data-&gt;suara1;
		$suara2 = $suara2 + $data-&gt;suara2;
		$suara_sah = $suara_sah + $data-&gt;suara_sah;
		$suara_tidak_sah = $suara_tidak_sah + $data-&gt;suara_tidak_sah;
		?&gt;
		<tr&gt;
			<td&gt;<?php echo $no; $no++; ?&gt;</td&gt;
			<td&gt;<?php echo $data-&gt;nama_tps; ?&gt;</td&gt;
			<td&gt;<?php echo $data-&gt;suara1; ?&gt;</td&gt;
			<td&gt;<?php echo $data-&gt;suara2; ?&gt;</td&gt;
			<td&gt;<?php echo $data-&gt;suara_sah; ?&gt;</td&gt;
			<td&gt;<?php echo $data-&gt;suara_tidak_sah; ?&gt;</td&gt;
			<td&gt;<?php echo ($data-&gt;validasi == 0) ? "Belum divalidasi" : "Sudah divalidasi"; ?&gt;</td&gt;
		</tr&gt;
	<?php endwhile; ?&gt;
	<tr&gt;
			<td colspan="2"&gt;Total Suara</td&gt;
			<td&gt;<?php echo $suara1; ?&gt;</td&gt;
			<td&gt;<?php echo $suara2; ?&gt;</td&gt;
			<td&gt;<?php echo $suara_sah; ?&gt;</td&gt;
			<td&gt;<?php echo $suara_tidak_sah; ?&gt;</td&gt;
			<td&gt;</td&gt;
		</tr&gt;
</table&gt;

Masih di folder yang sama (mod_suara), silakan buat 1 buah file bernama aksi.php dengan isi:

<?php
include "../../koneksi.php";

$id 				= $_POST['id'];
$suara1				= $_POST['suara1'];
$suara2				= $_POST['suara2'];
$suara_sah 			= $_POST['suara_sah'];
$suara_tidak_sah	= $_POST['suara_tidak_sah'];

// cek kesesuaian jumlah suara sah
if($suara_sah != $suara1 + $suara2) {
	exit("Perolehan suara kandidat 1 dan kandidat 2 tidak sama dengan total suara sah!");
}

// cek lampiran c1
if(isset($_FILES['c1']['tmp_name'])) {
	// ambil extension file utk dijadikan nama file pada C1
	$tipe    = end(explode(".", $_FILES['c1']['name']));
	$file   	= $id . "." . $tipe;
	$target= "../../assets/images/". $file;
	$upload = move_uploaded_file($_FILES['c1']['tmp_name'], $target);

	if($upload) {
		$query = "INSERT INTO suara VALUES ('$id', '$suara1', '$suara2', '$suara_sah', '$suara_tidak_sah', '$file', '0')";
		$result = mysqli_query($koneksi, $query) or die(mysqli_error($koneksi));

		if($result) {
			header('location:../../index.php?mod=suara');
		} else {
			echo "Gagal saat input data";
		}
	}

	else {
		echo "Gagal saat upload Form C1";
	}
}

else {
	echo "File Form C1 harus dilampirkan";
}

Membuat modul Validasi

Seluruh perolehan suara dari tiap-tiap TPS untuk kedua kandidat tidak akan dihitung dan ditampilkan pada grafik perolehan suara (modul home) sebelum divalidasi kebenarannya oleh seorang superadmin. Untuk memvalidasinya dibutuhkan modul validasi.

Buat sebuah folder bernama mod_validasi didalam folder modules. Didalam folder mod_validasi, buat 1 buah file bernama validasi.php dengan isi:

<h2 class="title"&gt;Validasi Perolehan Suara</h2&gt;
<p&gt;Lakukan validasi suara dengan membandingkan antara Form C1 dan Perolehan Suara dari masing-masing kandidat</p&gt;<br/&gt;

<?php
$act = (isset($_GET['act'])) ? $_GET['act'] : '';
switch($act) {
	case 'validasi': 
		$id 		= $_GET['id'];
		$query = "SELECT * FROM suara JOIN tps ON suara.id = tps.id WHERE tps.id = '$id'";
		$result = mysqli_query($koneksi, $query) or die(mysqli_error($koneksi));
		$data 	= mysqli_fetch_object($result);
		?&gt;
		<form method="post" action="modules/mod_validasi/aksi.php?id=<?php echo $data-&gt;id; ?&gt;"&gt;
			<table&gt;
				<tr&gt;
					<td colspan="2"&gt;
						<img src="assets/images/<?php echo $data-&gt;c1; ?&gt;" width="100%"&gt;
					</td&gt;
				</tr&gt;
				<tr&gt;
					<td&gt;Nama TPS</td&gt;
					<td&gt;<?php echo $data-&gt;nama_tps; ?&gt;</td&gt;
				</tr&gt;
				<tr&gt;
					<td&gt;Suara Kandidat 1</td&gt;
					<td&gt;<input type="text" name="suara1" value="<?php echo $data-&gt;suara1; ?&gt;"&gt;</td&gt;
				</tr&gt;
				<tr&gt;
					<td&gt;Suara Kandidat 2</td&gt;
					<td&gt;<input type="text" name="suara2" value="<?php echo $data-&gt;suara2; ?&gt;"&gt;</td&gt;
				</tr&gt;
				<tr&gt;
					<td&gt;Suara Sah</td&gt;
					<td&gt;<input type="text" name="suara_sah" value="<?php echo $data-&gt;suara_sah; ?&gt;"&gt;</td&gt;
				</tr&gt;
				<tr&gt;
					<td&gt;Suara Tidak Sah</td&gt;
					<td&gt;<input type="text" name="suara_tidak_sah" value="<?php echo $data-&gt;suara_tidak_sah; ?&gt;"&gt;</td&gt;
				</tr&gt;

				<tr&gt;
					<td&gt;</td&gt;
					<td&gt;<input type="submit" name="submit" value="Validasi"&gt;</td&gt;
				</tr&gt;
			</table&gt;
		</form&gt;
	<?php break;


	default: ?&gt;
		<table class="data"&gt;
			<tr&gt;
				<td&gt;No.</td&gt;
				<td&gt;Nama TPS</td&gt;
				<td&gt;Suara Kandidat 1</td&gt;
				<td&gt;Suara Kandidat 2</td&gt;
				<td&gt;Suara Sah</td&gt;
				<td&gt;Suara Tidak Sah</td&gt;
				<td&gt;Status</td&gt;
				<td&gt;</td&gt;
			</tr&gt;

			<?php
			$query = "SELECT * FROM suara JOIN tps ON suara.id = tps.id ORDER BY validasi";
			$result = mysqli_query($koneksi, $query) or die(mysqli_error($koneksi));

			$no = 1;
			$suara1 = 0;
			$suara2 = 0;
			$suara_sah = 0;
			$suara_tidak_sah = 0;

			while($data = mysqli_fetch_object($result)): 
				$suara1 = $suara1 + $data-&gt;suara1;
				$suara2 = $suara2 + $data-&gt;suara2;
				$suara_sah = $suara_sah + $data-&gt;suara_sah;
				$suara_tidak_sah = $suara_tidak_sah + $data-&gt;suara_tidak_sah;
				?&gt;
				<tr&gt;
					<td&gt;<?php echo $no; $no++; ?&gt;</td&gt;
					<td&gt;<?php echo $data-&gt;nama_tps; ?&gt;</td&gt;
					<td&gt;<?php echo $data-&gt;suara1; ?&gt;</td&gt;
					<td&gt;<?php echo $data-&gt;suara2; ?&gt;</td&gt;
					<td&gt;<?php echo $data-&gt;suara_sah; ?&gt;</td&gt;
					<td&gt;<?php echo $data-&gt;suara_tidak_sah; ?&gt;</td&gt;
					<td&gt;<?php echo ($data-&gt;validasi == 0) ? "Belum divalidasi" : "Sudah divalidasi"; ?&gt;</td&gt;
					<td&gt;<a href="?mod=validasi&amp;act=validasi&amp;id=<?php echo $data-&gt;id; ?&gt;"&gt;Validasi</a&gt;</td&gt;
				</tr&gt;
			<?php endwhile; ?&gt;
			<tr&gt;
					<td colspan="2"&gt;Total Suara</td&gt;
					<td&gt;<?php echo $suara1; ?&gt;</td&gt;
					<td&gt;<?php echo $suara2; ?&gt;</td&gt;
					<td&gt;<?php echo $suara_sah; ?&gt;</td&gt;
					<td&gt;<?php echo $suara_tidak_sah; ?&gt;</td&gt;
					<td&gt;</td&gt;
					<td&gt;</td&gt;
				</tr&gt;
		</table&gt;
	<?php break;
}
?&gt;

Buat pula 1 buah file bernama aksi.php didalam folder mod_validasi dengan isi:

<?php
include "../../koneksi.php";

$id 						= $_GET['id'];
$suara1				= $_POST['suara1'];
$suara2				= $_POST['suara2'];
$suara_sah			= $_POST['suara_sah'];
$suara_tidak_sah= $_POST['suara_tidak_sah'];

if ($suara1 + $suara2 != $suara_sah) {
	exit("Jumlah suara tidak sesuai!");
}

$query = "UPDATE suara SET suara1 = '$suara1', suara2 = '$suara2', suara_sah = '$suara_sah', suara_tidak_sah = '$suara_tidak_sah', validasi = '1' WHERE id = '$id'";
$result = mysqli_query($koneksi, $query) or die(mysqli_error($koneksi));

if($result) {
	header('location:../../index.php?mod=validasi');
} else {
	echo "Gagal saat validasi data";
}

Nah, sampai disini kita telah selesai membuat aplikasi perhitungan suara (real count) pilpres dengan PHP dan MySQL. Sesuai janji saya sebelumnya, source code aplikasi ini akan saya bagikan secara GRATIS dan dapat didownload melalui link ini.

Sekian tutorial ini saya buat, jika ada kesalahan saya mohon maaf. Pertanyaan teman-teman silakan di kolom komentar. Jika bermanfaat, silakan dishare. Terima kasih. Keep Coding! 🙂

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.