PHP : Soal Pilihan Ganda
Kemarin, seorang teman menanyakan tentang hal ini. Dakuw juga sering berfikir kenapa tidak ada tutorial yang seperti ini, rata-rata tutorial tersebut lebih mengarah ke teknik-teknik pemrograman, bukan alur logika yang mengarah pada kasus-kasus spesifik seperti ini (CMIIW). Mungkin beberapa berpendapat, bahwa mereka harus membangun logika sendiri. Bagaimana kalau logikanya Pentium tidur seperti dakuw
(becanda deng).
Just an opinion. Oke deh, disini kita akan mencoba membuat web sederhana yang menampilkan sejumlah soal dari sekian soal secara acak, dan setiap soal disertai dengan 4 pilihan (pilihan ganda). Setelah soal-soal tersebut dijawab oleh user, maka akan ditampilkan halaman yang mengecek jawaban tersebut benar/salah. Mudah kan?
Pertama, kita desain dulu databasenya, buka phpmyadmin atau MySQL Front atau apapun yang biasa dipakai untuk manajemen database MySQL. Tabel pertama adalah table soal, yang akan menyimpan soal-soal.
-
-
CREATE TABLE `soal` (
-
`id` int(99) NOT NULL AUTO_INCREMENT,
-
`soal` text NOT NULL,
-
PRIMARY KEY (`id`)
-
);
-
ID adalah primary key dari tiap record, sedangkan field “soal” akan menyimpan text-text soal. Tabel “soal” sudah jadi, sekarang kita buat tabel jawaban.
-
-
CREATE TABLE `jawaban` (
-
`id` int(99) NOT NULL AUTO_INCREMENT,
-
`soal` int(99) NOT NULL,
-
`jawaban` text NOT NULL,
-
`benar` tinyint(1) NOT NULL,
-
PRIMARY KEY (`id`)
-
);
-
Field “id”, adalah primary key dari tiap record. Field “soal” adalah foreign key yang menunjuk pada tabel soal. Misalkan pada sebuah record di tabel jawaban, terdapat nilai “3” pada field “soal”, maka itu berarti jawaban tersebut milik soal yang ber-id “3” pada tabel soal. Field “jawaban” adalah field yang menyimpan teks jawaban. Field “benar” adalah field yang menentukan jawaban tersebut benar atau tidak (karena peraturannya adalah pilihan berganda), mungkin saja ada banyak jawaban untuk satu soal, tapi hanya satu yang benar. Kita akan set 0 untuk tiap jawaban yang salah, dan 1 untuk jawaban yang benar.
Oke, tabel udah jadi, sekarang kita masuk ke script, perlu diingat struktur file disini dibuat sesederhana mungkin, tapi jangan diikuti untuk website sebenarnya yak
.
Ini script untuk menampilkan soal dan jawabannya, jangan khawatir tiap baris sudah diberi komentar penjelas kok :D. Klo di jelasin disini lagi justru berbelit-belit :D, simpan dengan nama soal_view.php :
-
-
<?
-
if($db)
-
{
-
{
-
// Database selected
-
}
-
else
-
{
-
echo "Can’t select database!";
-
exit;
-
}
-
}
-
else
-
{
-
echo "Can’t Connect to MySQL Server!";
-
exit;
-
}
-
?>
-
-
<form method="post" action="soal_process.php">
-
<?
-
// Inisialisasi variabel
-
$soal_max=3; // Jumlah soal yang akan ditampilkan
-
$nomor=1; // nomor urutan soal
-
-
// Kumpulkan nilai-nilai "id" yang ada pada tabel "soal", simpan ke array "soal"
-
{
-
$soal[]=$row[id];
-
}
-
-
// Yup, array "soal" sudah terisi, tinggal diacak dan di buang hingga isinya tinggal $soal_max
-
// fungsi array_rand, tidak mengacak isi dari array, melainkan hanya nomor urut dari array
-
// karena itu kita gunakan variabel $soal_urut, untuk menyimpan urutan soal yang sudah diacak
-
// MIS : sebelum diacak :
-
// isi array (0=>"1",1=>"2",2=>"3",3=>"4",4=>"5") angka di sebelah kiri adalah nomor urut array
-
// dan yang disebelah kanan adalah isi dari array tersebut
-
// fungsi array_rand, hanya mengacak urutannya, bukan nilainya.
-
{
-
// ambil nomor soal
-
$soal_nomor=$s["value"]; // ambil nomor urut array
-
$soal_nomor=$soal[$soal_nomor]; // ambil array dengan nomor urut $soal_nomor
-
-
// tampilkan soal
-
";
-
-
// tampilkan pilihan ganda, dalam bentuk radio button
-
// value pada radio button kita set sesuai "id" dari jawaban tersebut
-
// jadi, nanti pada saat di proses, cukup kita cek apakah jawaban dengan "id"
-
// tersebut nilai "benar"nya 0 atau 1.
-
{
-
$id=$row[id];
-
$jawab=$row[jawaban];
-
$benar=$row[benar];
-
-
// kita beri nama radio buttonnya jawab_$soal_nomor, kalau "id" soal yang sekarang
-
// adalah 10, maka radio buttonnya jadi jawab_10, dst.
-
echo "<input type=\"radio\" name=\"jawab_$soal_nomor\" value=\"$id\">$jawab
-
";
-
}
-
// Oh iya, disini juga kita buat string yang isinya array soal yang sudah diacak tadi
-
// tujuannya, untuk kita masukan ke hidden field, dan ikut di transfer bersama
-
// form, kemudian nanti di pecah lagi menjadi array pada soal_process.php
-
// string ini berguna untuk menyimpan urutan soal mana saja yang ditampilkan sekarang
-
$soal_nomor_send.=$soal_nomor . ",";
-
-
// Ini nomor urut soal, untuk tampilan saja
-
$nomor++;
-
}
-
// Karena string dari array soal yang kita kumpulkan tadi sudah selesai, namun
-
// karakter terakhirnya masih ada "koma" (mis : "5,3,2,1,"), jadi kita ilangin komanya dulu
-
-
// yup, sekarang string dari array soal sudah jadi, tinggal di masukan ke hidden field
-
echo "<input type=\"hidden\" name=\"soal_nomor\" value=\"$soal_nomor_send\">";
-
?>
-
<input type="submit" value="Jawab">
-
</form>
-
Dan ini, adalah file untuk memproses jawaban, simpan dengan nama file soal_process.php :
-
-
<?
-
if($db)
-
{
-
{
-
// Database selected
-
}
-
else
-
{
-
echo "Can’t select database!";
-
exit;
-
}
-
}
-
else
-
{
-
echo "Can’t Connect to MySQL Server!";
-
exit;
-
}
-
?>
-
-
<?
-
// Inisialisasi variabel
-
$soal_urut=array(); // Array yang digunakan untuk menyimpan urutan soal dari form tadi (hidden field)
-
$nomor=1; // nomor urutan soal
-
-
$soal_urut=$_POST["soal_nomor"]; // Ambil hidden field dari form tadi
-
-
// Tampilkan soal-soal yang tadi
-
{
-
$soal_nomor=$s["value"]; // ambil "id" soal
-
-
// tampilkan soal
-
";
-
-
// tampilkan pilihan ganda
-
{
-
$id=$row[id];
-
$jawab=$row[jawaban];
-
$benar=$row[benar];
-
-
// kita ambil "id" jawaban yang di submit user dari form tadi
-
$user_jawab=$_POST["jawab_$soal_nomor"];
-
-
// apakah "id" jawaban yang sedang ada di query ini sama dengan "id"/value pada radio button yang disubmit user?
-
if($user_jawab==$id){
-
if($benar==0){ // apakah salah jawaban si user?
-
$jawab_status="<span style=’color:red;’><< Jawaban Anda… Salah!</span>";
-
}else{ // atau benar?
-
$jawab_status="<span style=’color:blue;’><< Jawaban Anda… Benar!</span>";
-
}
-
}
-
else // kalau "id"nya tidak sama
-
{
-
$jawab_status="";
-
}
-
-
// tampilkan radio buttonnya
-
echo "<input type=\"radio\" name=\"jawab_$soal_nomor\" value=\"$id\">$jawab $jawab_status
-
";
-
}
-
-
$nomor++; // nomor urut soal, hanya tampilan saja
-
}
-
?>
-
Oke deh, selamat mencoba, don’t hestitate to reply klo ketemu bug ![]()
VBCrLF + Excel = Stupid Small Box!
Bagi yang pernah melakukan export data dari Visual Basic ke Microsoft Excel menggunakan Object Library bawaan Microsoft Office, mungkin pernah menemukan kasus dimana ketika kita ingin memasukan baris baru dalam satu sel (menggunakan sintaks VBCRLF), maka akan muncul “unknown char” berbentuk kotak yang letaknya sebelum baris baru. Sintaks regulernya adalah seperti ini
-
-
.Range("A1") = "Budi Yuliono" & VBCrLf & "Samarinda, 15 April 1988"
-
Sintaks diatas, memang akan menghasilkan baris baru, namun juga akan menghasilkan karakter box sebelum baris baru terbentuk, dan itu tentu saja mengganggu pemandangan. Berikut adalah daftar konstanta yang hasilnya sama saja (membentuk box kecil) ketika digunakan di excel
-
-
.Range("A1") = "Budi Yuliono" & VBCrLf & "Samarinda, 15 April 1988"
-
.Range("A1") = "Budi Yuliono" & VBLf & "Samarinda, 15 April 1988"
-
.Range("A1") = "Budi Yuliono" & XlCrLf & "Samarinda, 15 April 1988"
-
Banyak programmer (termasuk dakuw) yang pusing 26 lap cuma mikirin beginian, setelah surfing bentar, solusinya yaitu, menggunakan karakter ASCII! (mungkin :p). Ganti aja scriptnya jadi begini:
-
-
.Range("A1") = "Budi Yuliono" & Chr(10) & "Samarinda, 15 April 1988"
-
And.. voila! ![]()
VBScript : Bikin Game Kuis
Game ini adalah game bertipe kuis kata, cara membuatnya cukup simpel, dan program yang diperlukan cuma notepad aja ^_^. Kalau kalian masih awam sama yang namanya notepad, coba klik menu START -> RUN, trus ketik notepad lalu tekan Enter, muncul deh notepadnya ^_^.
Nah, back to the topic, disini akan di jelasin tutorial bikin game kuis ini, bahasa yang dipergunakan adalah Visual Basic Script, nggak perlu cemas dulu tentang seberapa sulitnya bahasa Visual Basic Script(VBScript), karena ini cukup simple koq, dan rule game kita nanti akan seperti ini :
1. Tampilkan soal
2. User mengetikkan jawabannya
3. Kita cek apakah jawaban user sama
dengan jawaban soal
4. Kalo sama, kita tambahin skor sebanyak 5 poin
5. Kalo enggak sama, kita tanya user, dia mau lanjut apa enggak
6. Kalo dia mau lanjut, kita tampilkan soal yang sama
7. Kalo enggak, kita tutup program kuisnya
Simpel kan?. Sekarang kita masuk ke programmingnya, coba buka aplikasi notepad, kemudian klik menu File -> Save, lalu simpan filenya dengan nama Kuis.vbs, dan dibagian FileType, pilih All Files. Simpan file tersebut di folder C:\. Sekarang coba tutup program notepadnya, lalu buka My Computer dan buka drive C:\ tadi, disitu ada file Kuis.vbs (yang iconnya warna putih-ijo), itu adalah program kuis kita, sekarang coba klik kanan file itu dan pilih EDIT. Lalu masukan kode di bawah ini :
(more…)
Membuat Direktori Alias pada Apache Server
Bagi yang udah akrab ama server Apache, mungkin kita biasa meletakan semua folder website kita pada direktori htdocs atau www, yang merupakan bawaan dari server apache. Bagaimana kalau kita ingin meletakan folder website kita (mis:contoh1) di tempat lain namun tetap dapat di akses melalui http://localhost/contoh1.
Sekarang mari kita buat contoh, semisal aku punya folder berisi sebuah website, folder tersebut namanya adalah “websiteku”, dan kuletakan di “D:\websiteku”. Sementara folder htdocs milik apache terletak di “C:\Apache\htdocs”. Bagaimana agar folder “websiteku” bisa diakses dengan url “http://localhost/websiteku” ?. Solusinya adalah Alias Direktori. Tidak usah terlalu teoritis, langsung aja ke praktek yak!.
Pertama, buka file httpd.conf. Untuk yang pakai phptriad, file ini biasanya terletak di C:\Apache\conf\httpd.conf, atau kalau yang pakai XAMPP, coba lihat di folder XAMPP\Apache\Conf\httpd.conf. Dan kalau gak ketemu tinggal di searching aja :D. Setelah file httpd.conf dibuka, tambahkan kode dibawah ini di bagian paling bawah file httpd.conf.
-
-
Alias /websiteku/ "D:/websiteku/"
-
<Directory "D:/websiteku">
-
Options Indexes MultiViews
-
AllowOverride None
-
Order allow,deny
-
Allow from all
-
</Directory>
-
Save file httpd.conf tersebut, kemudian restart server apache. Buka browser, lalu tes hasil kode tadi dengan mengetikan “http://localhost/websiteku”.
PHP : Mr.echo() versus Mr.print() & Mrs.printf()
Bagi para pengguna PHP, tentu dah nggak asing dengan fungsi-fungsi macam echo(), print() dan printf(). Sekilas emang keliatannya fungsi ini sama. Tapi layaknya pisang goreng masakan ibunya kecebongsoft sama pisang goreng masakan ibunya chrisnanice, serupa tapi tak sama (enakan masakan ibunya kecebongsoft).
echo() adalah fungsi yang tidak memiliki nilai kembali, anggaplah echo dan print adalah sama-sama komandan upacara, echo adalah komanda yang setelah mengerjakan tugasnya, tidak akan melapor ke atasan, sedangkan print selalu melapor. Singkatnya, karena print memiliki nilai kembali / return value, dia bisa digunakan dalam operasi logika maupun ekspresi.
Perbedaan kedua adalah jumlah parameter yang di pass untuk kedua fungsi tersebut berbeda, printf memungkinkan kita untuk melakukan pemformatan nilai, sedangkan echo tidak bisa, contoh :
-
-
$a=4;
-
$b=2;
-
$c=$a * $b;
-
");
-
Nah, terlihat sekali kan perbedaannya? kita bisa meletakan value integer pada posisi berbeda-beda untuk beberapa tempat dengan menggunakan printf(), sedangkan echo lebih bersifat konkrit.
Sebagai referensi, ini parameter variabel untuk fungsi printf();
-d untuk variabel bertipe integer
-b untuk variabel bertipe biner
-s untuk variabel bertipe string
-f untuk variabel bertipe double
Untuk implementasinya sendiri, suka-suka aja deh, tergantung kebutuhan. Terserah mau pakai yang mana, asal jangan pakai bajakan ![]()
META Rerfresh - Merefresh dokumen dalam hitungan mundur.
Bagi yang pernah pakai javascript, ada satu fungsi yang disebut navigate("") atau document.href untuk memindahkan halaman ke url yang kita inginkan, atau pada php dikenal dengan fungsi header("location : http://…"). Tapi javascript belum tentu kompak dengan semua browser, dan kita belum tentu selalu memakai PHP.
Dari kasus tersebut, kita bisa menggunakan fungsi bawaan dari HTML, yaitu META Refresh. Ialah elemen HTTP META yang dipakai untuk merefresh/mengganti alamat dokumen dalam hitungan mundur yang bisa kita atur (dalam satuan detik). Sintaksnya adalah sebagai berikut :
Untuk refresh dalam 10 detik :
<meta http-equiv="refresh" content="10">
Untuk mengganti alamat dokumen dalam 10 detik :
<meta http-equiv="refresh" content="10;url=http://kecebong.madpage.com/blog/">
Dan tentu saja dimasukan di bagian <head>…</head>, jadi scriptnya seperti ini :
<head> <title>Websiteku</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta http-equiv="refresh" content="10;url=http://kecebong.madpage.com/blog/"> </head>
Dibanding pakai javascript/php, META Refresh jauh lebih fleksibel karena merupakan bawaan HTML dan cross browser. Ada yang mo coba? coba? coba?.
Main warnet gratis?
Buat yang sering main warnet, pengen main biaya nge-warnetnya berkurang? Triknya cukup mudah, Jika di warnet yang kamu pakai software billingnya menggunakan BillingExplorer (entah versi berapa),
maka ada kemungkinan besar kamu bisa mendapatkan bug(kesalahan program) ini :
1. Coba login dulu di client (pilih personal ato yang lainnya)
2. Buka window BillingExplorernya, liat jam pada label Start
3. Ubah jam windows, misal jam Startnya=10:12:58, maka ubah jam windows jadi 11:20:12 (atau terserah yang penting lebih besar dari jam Start.
4. Lihat label biaya yang ada di window BillingExplorer-mu, biayanya berubah nggak?
Entah program BillingExplorer di warnet-warnet Samarinda udah di update atau enggak
karena 80% warnet Samarinda memakai program BillingExplorer (entah versi berapa) maka bug ini cukup bisa bikin yang punya usaha jadi tekor. Tadi sempat muter-muter di om google nyari kejelasan tentang bug ini, tapi sebagian besar laporan bug tidak di tanggapi oleh vendor dari BillingExplorer.
Buat yang punya warnet, kalau bisa tidak perlu tunggu vendor nge-update software billingnya, mungkin lebih baik perbaikin sistem di setiap client, coba atur registry/settingan windows agar user tidak bisa mengganti jam. Dan lakukan pengamanan lainnya untuk menghindari timbulnya bug billing.
Fungsi rakitan buat ngecek variabel kosong
Yang sering pake php, biasanya kan kalau bikin form yang banyak field-fieldnya, begitu di submit si programmer mesti cek satu-satu dulu apakah field-field tersebut sudah terisi atau belum. Mungkin sebagian ada yang pakai fungsi isset. Tapi bagaimana seandainya variabel tersebut sudah di set tapi belum terisi? contoh, jika dalam kondisi register_globals=off, kita biasa menangkap variabel form dengan fungsi $nama=$_POST[’nama’] dst… Sehingga pada php variabel tersebut sudah berstatus diset, namun mungkin saja belum ada isinya.
Untuk mengatasi hal itu, sebagian programmer menggunakan fungsi empty(), tapi kekurangan fungsi empty adalah dia hanya bisa menghandel satu parameter untuk setiap pemanggilan fungsi tersebut. Sehingga jika kita punya belasan atau bahkan puluhan field yang mesti dicek kosong atau tidak, akan menghasilkan listing yang cukup panjang.
Jadi sekarang kita buat aja fungsi sendiri, yang bisa mengecek variabel itu kosong atau tidak (meskipun sudah diset). Dan fungsi ini bisa dimasukan parameter tidak terbatas. ini listingnya :
selamat mencoba :D.
Mereset root password (Linux)
Kmaren juga sempat pengalaman kelupaan password, buat yang punya LILO, coba deh pas booting pake parameter :
linux init=/bin/sh
Parameter itu bakal ngeset bahwa booting akan menggunakan shell, kemudian setelah shellnya keluar, coba perintah ini:
vi /etc/passwd
Jika kolom kedua pada baris root (kolom dibatasi dengan karakter “:”) hanya berisikan karakter “x”, maka password yang kita gunakan bertipe shadow password, tutup vi, dan buka lagi dengan perintah ini:
vi /etc/shadow
Hapus kolom kedua pada baris root, kemudian save file tersebut. Coba deh di restart, and voila :-D.
Tapi terkadang ada juga kendala, beberapa distro seperti mandrake, dll, secara default mengeset owner file-file tersebut adalah root. Kalau sudah begitu, mungkin shell saja tidak cukup untuk mereset password (pada perintah VI akan muncul pesan yang berbunyi Read Only File). Kalau itu terjadi, coba pakai LiveCD Distro, untuk LiveCD, Ubuntu cukup bisa diandalkan, karena distro ini cukup banyak memiliki perbendaharaan device storage (IDE, SCSI), jadi buat yang pake hardisk SCSI gak perlu khawatir hardisknya gak ke-detect di ubuntu :-D.
Caranya sama dengan cara shell, hanya saja sekarang berbasis GUI, untuk ubuntu, disarankan booting dengan metode live-expert. Kemudian set password rootnya dan biarkan normal user untuk login, setelah itu kita bisa masuk melalui terminal (pada GNOME), dan ketikan perintah SU untuk login sebagai super user. Selebihnya sama seperti saat berhadapan dengan shell :-D.
Ngembaliin boot ke windows lagi
Kemarin sempat nginstall Ubuntu 5.04, trus niatnya pengen di uninstal. Ya udah deh nekat aja pake PowerQuest PartitionMagic, delete & secure erase partisi linuxnya, trus di reboot, eh baru ingat GRUB Boot Loadednya ada di MBR (Master Boot Record) dan masih di konfigurasi buat ngakses ke partisi linux!, jadi nongol error deh (soalnya partisi linuxnya udah kehapus T_T). Jadi bingung deh, dikira langsung otomatis balik booting ke windows. Masa mesti nginstall windows lagi?, padahal udah banyak plugin-plugin yang ku install (yang pasti bakal ilang klo windowsnya di reinstall).
Ah, gak boleh reinstall windows, repot!. Coba buka-buka command line yang disediain boot CD-nya windows xp, gak taunya ada command FIXMBR, yang bisa ngefix master boot record yang invalid, hehehe, setelah pake command line itu, os-nya om bill gates ini akhirnya bisa nongol lagi :D.
