RPG Fantasy Web Indonesia Forum

Kingdom Services => Level-Up Training Lot => Topik dimulai oleh: Èxsharaèn pada 21 Oktober 2008, 01:26:49

Judul: Buat Web yuk! (PHP + MySQL)
Ditulis oleh: Èxsharaèn pada 21 Oktober 2008, 01:26:49
Sudah bisa bikin Web sendiri? Pastinya ya :) nah, sekarang kita akan melanjutkan perjalanan dengan mempelajari pembuatan Web dinamis. Dinamis di sini maksudnya adalah dapat berubah sesuai kebutuhan. Misalnya, perhatikan saja bahwa isi halaman forum ini berubah sesuai dengan konteksnya; forum ini adalah salah satu dari milyaran Web dinamis. Sebaliknya, situs yang isinya tetap itu-itu saja disebut Web statis; contohnya adalah situs RPGFWID sendiri.

Jadi, apa saja yang kita perlukan untuk membuat sebuah Web dinamis? Ada banyak jalan sebenarnya, tapi intinya kita butuh pemrograman Web lebih lanjut, tidak sekedar XHTML dan CSS saja. Sebelum itu, aku perkenalkan dua istilah dulu: client dan server. Client adalah kita, yang meminta sebuah halaman Web, sementara server adalah komputer yang memproses permintaan kita dan mengembalikan apa yang kita mau. Dengan demikian, ada 2 macam pemrograman Web:

1. Client-side programming
Pemrograman Web ini dilakukan di sisi klien (kita), jadi setelah kita mendapatkan halaman Web yang kita mau, komputer kita nanti akan dapat melakukan proses lebih lanjut. Contoh paling mudah, pernah tidak saat mengisi password, petunjuk kekuatan password berubah sendiri? Itu dapat dilakukan menggunakan client-side programming. Kelebihan pemrograman cara ini adalah prosesnya dilakukan di komputer klien, jadi server tidak terbebani pekerjaan ekstra. Kelemahannya, coding kita dapat dilihat siapa saja (menggunakan View Source di seluruh peramban).

Ironisnya, kadang-kadang pemrograman sisi-klien ini disalahgunakan untuk menginvasi komputer kita, misalkan mengeluarkan pop up yang mengganggu, atau menginstal sesuatu dengan diam-diam. Yup, ini adalah JavaScript dan VBScript. VBScript hanya dapat berjalan di Windows (karena memang ini bikinannya Microsoft), sementara JavaScript dapat berjalan di mana saja, selama perambannya mendukung dan mengaktifkan fitur ini. Namun, dengan penggunaan yang tepat, pemrograman sisi-klien dapat digunakan untuk mempermudah banyak hal. Bahkan, kini pemakaiannya digabungkan dengan pemrograman sisi-server, yang dikenal dengan AJAX (Asynchronous JavaScript And XML), tapi untuk sekarang kita tidak bahas.

2. Server-side programming
Kebalikannya, pemrograman ini dilakukan di sisi server. Saat kita meminta halaman Web ke server, server akan melihat apakah ada pemrograman yang perlu dilakukan. Jika ada, server akan memprosesnya, mengeluarkan hasilnya, baru hasilnya dikembalikan ke kita. Contoh yang paling populer adalah melakukan registrasi akun baru, mengisi komentar, dsb.. Kelebihan pemrograman ini, coding-nya tidak dapat terlihat oleh klien (kita hanya dapat HTML hasil prosesnya). Kelemahannya, kalau programnya tidak efisien, server dapat terbebani sehingga dapat mengganggu lalu lintas situs Web yang lain.

Contoh pemrograman sisi-server adalah CGI, ASP (termasuk ASP.NET), PHP, dan banyak lagi. Topik ini akan khusus mempelajari PHP, karena lisensinya gratis.

Sekilas tentang PHP, PHP (http://www.php.net (http://www.php.net)) adalah akronim rekursif (rekursif maksudnya berulang) dari PHP Hypertext Preprocessor. Dia menggunakan sintaks yang mirip sekali dengan C, jadi yang pernah belajar C pasti tidak terlalu kesulitan. Cara kerjanya, server akan membaca berkas PHP kita (yup, PHP menggunakan berkas PHP bukannya HTML), apakah ada kode PHP di sana. Kalau ada, kode itu akan diterjemahkan (geeks: interpret) ke bahasa yang dimengerti mesin, lalu dijalankan. Hasilnya akan ditambahkan ke berkas PHP yang kita minta (jika ada hasil). Begitu seterusnya sampai tidak ada lagi kode PHP yang harus dijalankan. Kemudian, berkas hasilnya akan dikirimkan ke kita.

Nah, apa yang diperlukan untuk belajar PHP?
Judul: PHP Requirements
Ditulis oleh: Èxsharaèn pada 21 Oktober 2008, 01:28:54
Catatan: Tata nama map pada artikel ini menggunakan tata nama Windows, misalkan My Documents\My Pictures.

Karena PHP adalah bahasa pemrograman sisi-server, kita tentu saja memerlukan server. Wah, apa itu berarti kita harus beli komputer baru yang menggunakan sistem operasi UNIX? Tidak perlu. Kita cukup menginstal program server ini ke komputer kita, sekalipun kita menggunakan Windows. Windows memang sudah mempunyai server bawaan, yaitu IIS (Internet Information Service), namun ini tidak tersedia di seluruh versi Windows (versi Home XP dan Vista tidak memilikinya) dan pada dasarnya tidak aktif. Karena itu, kita pakai server lain yang gratis dan sangat umum digunakan, yaitu Apache (http://www.apache.org). Aku menyarankan menggunakan versi terbaru, yaitu Apache 2.

Setelah Apache terinstal, kita memerlukan program interpreter PHP-nya sendiri, yaitu PHP. PHP bisa didapat di situs PHP (http://www.php.net). Versi PHP yang aku sarankan ada dua, PHP 4 dan PHP 5. Kebanyakan Web host sudah menggunakan PHP 5, namun masih ada yang menggunakan PHP 4. Tidak ada perbedaan pada sintaks, namun PHP 5 sudah 100% berbasis objek (baca artikel ini (http://forum.rpgfantasy.web.id/index.php?topic=167.0) tentang apa itu pemrograman berbasis objek). Silakan pilih salah satu.

Pada tahap ini, sebenarnya kita sudah dapat melakukan pengembangan Web dinamis, namun ada satu lagi kombinasi yang belum didapatkan: MySQL. MySQL (http://www.mysql.com) adalah salah satu sistem manajemen basis data yang gratis dan sangat populer digunakan dalam pengembangan Web dinamis, berdampingan dengan PHP. Rasanya sudah mustahil menemukan PHP tanpa MySQL. Silakan pilih versi yang diperlukan, disarankan versi 4 atau 5.

Bagi yang tidak ingin repot-repot menginstal ketiganya secara terpisah lalu melakukan konfigurasi yang terkadang membingungkan (aku sendiri juga bingung kalau harus menginstal ketiganya terpisah), komunitas Internet sudah berbaik hati menggabungkan ketiganya dalam satu paket. Silakan pilih dari AppServ (http://www.appservnetwork.com), WAMP (http://www.wampserver.com/en/), XAMPP (http://www.apachefriends.org/en/xampp.html), dan sebagainya. Aku tidak akan bahas cara instalasi ketiganya di sini, karena wizard yang diberikan cukup mudah untuk diikuti. Kalau tidak mau install, gunakan XAMPP yang cukup ekstrak arsip saja (ZIP atau 7Z self-extract), bahkan bisa dibawa di UFD (dan bisa digabung ke PortableApps.com).

Nah, setelah menginstal AppServ/WAMP/XAMPP (atau Apache + PHP + MySQL), saatnya mencoba membuat halaman Web dinamis pertama kita!
Judul: PHP Hello World!
Ditulis oleh: Èxsharaèn pada 21 Oktober 2008, 01:29:40
Sebagai tradisi, yuk keluarkan tulisan "Hello World!" Jalankan Notepad (disarankan Notepad++ atau pengganti lain yang sesuai) atau program manajemen situs (Adobe Dreamweaver atau yang lain), lalu ketikkan kode di bawah ini:

<?php echo "Hello World!"?>

Simpan dengan nama hello.php (perhatikan, ekstensinya PHP). Tergantung paket yang diinstalasi, letakkan di map yang bersesuaian (misalkan AppServ di %map instalasi AppServ%\www, XAMPP di %map instalasi XAMPP%\htdocs\). Atau, untuk memastikan, cari berkas httpd.conf dalam map %map Apache%\conf dan lihat pengaturan DocumentRoot, itu adalah map server kita. Lalu, jalankan di peramban kesukaan.

AWAS! Cara menjalankan di peramban bukan dengan menggunakan Open, namun kita harus mengaksesnya seolah-olah kita sedang online. Caranya? Karena ada server terinstal di komputer kita, kita bisa menggunakan alamat khusus yang secara otomatis akan merujuk pada komputer kita sendiri: http://localhost. localhost atau IP-nya 127.0.0.1 adalah DNS (Domain Name Server, nama yang mewakili IP tertentu) khusus yang berarti server tersebut ada di komputer kita sendiri. http://localhost akan merujuk pada map yang ditunjuk sebagai lokasi situs Web kita (lihat catatan di atas). Selanjutnya, gunakan path absolut untuk menemukan berkas yang diinginkan. Pada kasus kita, hello.php diakses dengan URL http://localhost/hello.php.

Coba jalankan. Bisa kan? Kalau tidak keluar, pastikan Apache dan PHP sudah berjalan dan dikonfigurasikan dengan benar (untuk paket instalasi Apache/PHP/MySQL, biasanya tidak ada pengaturan lebih lanjut yang diperlukan).

CATATAN
Kode di atas sebenarnya tidak dianjurkan, karena bisa dilihat kita sama sekali tidak menggunakan HTML. Walaupun berkasnya PHP, kita tetap memerlukan HTML untuk menampilkan berkas dengan benar.

Yuk analisis sedikit kode kita di atas!
Judul: Hello World: How?
Ditulis oleh: Èxsharaèn pada 21 Oktober 2008, 01:31:12
Perhatikan bahwa ada tag <?php di awal kode kita. Tag ini diperlukan untuk menandai bahwa kita memulai pemrograman PHP. Setelah selesai dengan PHP, tutup dengan tag ?>. Dengan pengaturan khusus, tag ini bisa dipersingkat menjadi <? saja, atau bahkan mengikuti style ASP, tapi aku sarankan menggunakan tag biasa. Apapun yang ada di kedua tag tersebut akan diinterpretasikan dulu oleh PHP, diolah, dan dikeluarkan hasilnya (jika ada).

Kemudian, kita bertemu echo. Ini adalah versi PHP untuk perintah cout pada C. Gampangnya, echo digunakan untuk mengeluarkan string tertentu yang mengikutinya. Masih ingat ya apa itu string? Nah, string pada PHP diapit tanda kutip ganda "" atau tanda kutip tunggal ''. Silakan pilih mana yang hendak dipakai. Aku menyarankan menggunakan tanda kutip ganda.

Pada akhir baris tiap perintah PHP, jangan lupakan tanda titik koma ;. Ini menandakan PHP bahwa baris kita sudah berakhir. Sama dengan C kan?

Nah, kalau ingin mengeluarkan tanda kutip sendiri, gimana dong? Misalkan aku punya string "It's me!". Apa kira-kira seperti ini kodenya?

<?php
echo "It's me!";
echo 
'It's me!';
?>


Coba jalankan.

KutipParse error: syntax error, unexpected T_STRING, expecting ',' or ';' in F:\xampp\htdocs\hello.php on line 3

Error? Ya, karena pada baris 3 kita melakukan kesalahan. Tanda kutip tunggal kedua (milik It's) dianggap mengakhiri string, sehingga setelahnya tidak dikenali oleh PHP. Solusinya, gunakan escape character \:

<?php
echo "It's me!";
echo 
'It\'s me!';
?>


Mudah kan?

Well, setelah ini, terpaksa kita mengulang dasar-dasar pemrograman, karena kita perlu tahu sintaks PHP. Jangan khawatir, ini singkat saja kok :)
Judul: Variabel, Konstanta, Tipe data, Operator, Komentar, Fungsi
Ditulis oleh: Èxsharaèn pada 21 Oktober 2008, 01:42:45
Pada PHP, nama variabel selalu dimulai dengan tanda dolar $. Contohnya, variabel bernama x ditulis $x. Operasi-operasi aritmatika tetap sama seperti bahasa lainnya, jadi kita tidak perlu bahas. Yang berbeda adalah operasi penggabungan dua atau lebih string (geeks: concatenation), PHP menggunakan tanda titik . . Contoh:

<?php
$nama 
"Sapi";
echo 
"Hello, " $nama "!"// operasi normal
echo "Hello, $nama!"// dengan tanda kutip ganda, kita bisa mengeluarkan nilai sebuah variabel dengan hanya memanggil namanya di dalam string...
echo "Hello, {$nama}!"// ...atau dengan menggunakan format seperti ini: nama variabel diapit tanda kurung kurawal...
echo 'Hello, $nama!'// ...tapi ini tidak berlaku di tanda petik tunggal. Lihat saja hasilnya.
?>


Pada PHP, variabel tidak perlu dideklarasikan tipe datanya dulu seperti di C. Langsung saja gunakan:

<?php
$jari 
25;
echo 
"Luas lingkaran ini adalah " . (M_PI pow($jari2)) . " cm<sup>2</sup>.";
echo 
"Keliling lingkaran ini adalah $keliling cm."// kosong
?>


Konstanta lain lagi:

<?php
define
("KONSTANTAKU""Sapi saya satu."); // disarankan nama konstanta ditulis dalam UPPERCASE untuk membedakannya dengan konstanta biasa, ...
echo KONSTANTAKU;
define("pi"3.14);
echo 
pi// ... walaupun ini sah
?>


Komentar sudah didemonstrasikan dari tadi, dan kebetulan sama persis dengan C:

<?php // ini komentar satu baris
/*
Ini komentar yang lebih dari satu baris.
Ini juga bisa digunakan untuk menutup baris kode tertentu yang nantinya ternyata tidak diperlukan lagi,
namun terlalu berharga untuk dihapus (tapi ingat, komentar memakan ruang pada ukuran berkas).
*/
?>


Fungsi dideklarasikan seperti berikut:

<?php
// Deklarasi fungsi
function fungsiku()
{
echo "<p>Ini fungsiku</p>";
}

// Dengan parameter...
function fungsimu($parameter)
{
echo "<p>Ini fungsimu, ada nilai parameternya: $parameter</p>";
}

// Dengan parameter bernilai dasar...
function fungsinya($param1$param2 "aku")
{
echo "<p>Ini fungsinya $param1 dan $param2</p>";
}

// Cara menggunakan fungsi, panggil saja namanya (berikan parameter jika perlu)
fungsiku();
fungsimu(12);
fungsinya("saya""kamu");
fungsinya("saya"); // tanpa parameter kedua, fungsi akan mengisinya dengan nilai dasar pada deklarasi
?>


Selanjutnya...
Judul: Percabangan, perulangan
Ditulis oleh: Èxsharaèn pada 21 Oktober 2008, 02:18:00
Untuk percabangan, blok if dan switch bentuknya sama persis dengan C seperti ini:

<?php
// If sederhana
if(== 2)
echo "Ngawur!!!<br />";

// If dengan else
if(== 2)
echo "Ngawur!!!<br />";
else
echo "Benar!!!<br />";

// If dengan banyak syarat
$umur 17;
if(
$umur && $umur 17)
echo "Anak-anak<br />";
elseif(
$umur >= 17 && $umur 25)
echo "Remaja<br />";
else
echo "Dewasa<br />";

// If dengan lebih dari satu baris perintah
if(!= 2)
{
echo "Good!<br />";
echo "Kamu masih waras!<br />";
}

// If bersarang
$jk "L";
if(
$jk == "L"// perbandingan string bisa juga dengan fungsi strcmp()
{
if($umur 21)
echo "Belum dewasa<br />";
else
echo "Sudah dewasa<br />";
}

// Digabung dengan HTML (biasanya saat kita lebih banyak menuliskan HTML, alih-alih menggunakan echo)
if($jk == "L")
{
?>

<p>Cari wanita yang seperti apa?</p>
<p>Yang penting cantik, yang penting pintar, atau dua-duanya?</p>
<?php
}

// Untuk IF yang kondisinya banyak, bisa gunakan blok SWITCH:
$kota "Surabaya";
switch(
$kota)
{
// single case
case "Jakarta":
echo "Jawa bagian barat<br />";
break;
// multiple case
case "Semarang":
case 
"DIY":
echo "Jawa bagian tengah<br />";
break;
case 
"Surabaya":
echo "Jawa bagian timur<br />";
break;
// Kalau tidak ada yang memenuhi syarat
default:
echo "Bukan di Jawa?<br />";
break; // opsional sebenarnya di PHP, karena default dikerjakan terakhir
}

// Bentuk lain: gantikan kurung kurawal buka { dengan : dan gantikan kurung kurawal tutup } dengan endif; atau endswitch;
// Ini juga berlaku untuk kontrol while, for, dan foreach nantinya
// Contoh, IF ketiga di atas bisa ditulis:
if($umur && $umur 17):
echo "Anak-anak<br />";
elseif(
$umur >= 17 && $umur 25):
echo "Remaja<br />";
echo "Baru akil balig ya :)<br />";
else:
echo "Dewasa<br />";
endif;
?>



Perulangan menggunakan blok for, while, atau do-while (tidak ada blok until):

<?php
// <hr /> di sini hanya untuk memisahkan hasil tiap blok
for($i 1$i <= 10$i ++)
{
echo $i;
}

echo 
"<hr />";
// AWAS! $i masih dikenali di sini.
while($i <= 10)
{
echo $i;
$i ++;
}

// Untuk mendapatkan efek di atas, reset dulu $i atau gunakan variabel lain
while($j <= 0)
{
echo $j;
$j ++;
}

echo 
"<hr />";
// Blok do-while...
$k 0;
do
{
echo $k;
}while(
$k <= 10);


// Bentuk alternatif juga berlaku:
echo "<hr />";
$j 1;
while(
$j <= 10):
echo $j;
$j ++;
endwhile;

echo 
"<hr />";
for(
$i 1$i <= 10$i ++):
echo $i;
endfor;
?>


Ada satu lagi bentuk for, yaitu foreach, tapi untuk sementara kita tunda dulu sampai kita menjumpai array.
Judul: Array dan Hash
Ditulis oleh: Èxsharaèn pada 11 Desember 2008, 02:47:47
Array dan Hash, menariknya, mirip dengan Array dan Hash di Ruby. Langsung contoh ya!

Deklarasi array dan hash:

<?php
$arrayku 
= array(); // membuat array kosong
$arrayku2 = array(123); // array 1 dimensi
print_r($arrayku2); // cetak isi array ini
$hash = array("Januari" => 30"Februari" => "28"); // hash tetap diperlakukan sebagai array. Formatnya: $key => $value
echo "<p>Banyak hari dalam bulan Januari adalah {$hash['Januari']}</p>"// cara akses nilai hash jika menggunakan tanda kutip ganda: {$hash['key']}
// Array 2 dimensi
$array2d = array(
=> array(123),
=> array(456)
);
echo 
$array2d[1][2]; // 3. Ingat, indeks array dimulai dari 0
?>


Nah sekarang kita bisa kenalan dengan blok foreach. Ini berguna untuk menjelajahi isi array dan hash tanpa perlu tahu berapa banyak isi array-nya. Formatnya:

<?php
// Untuk array, atau bisa juga untuk hash jika kita tidak peduli key-nya
foreach($nama_array as $value)
{
// Lakukan proses di sini
// $value akan berisi nilai dari tiap elemen array
}
// Untuk hash, atau bisa juga untuk array kalau kita peduli key-nya
foreach($nama_array as $key => $value)
{
// Lakukan proses di sini
// $key akan berisi indeks dari tiap elemen array
}
?>


$key dan $value namanya bisa diganti sesuka kita. Penggunaannya seperti ini:

<?php
// Contoh array-nya dulu...
$buah = array("apel""pisang""jambu");
foreach(
$buah as $nama_buah)
{
echo $nama_buah;
}
// Contoh hash
$pet = array("Andi" => "kucing""Budi" => "sapi""Cinta" => "ikan");
foreach(
$pet as $pemilik => $binatang)
{
echo "<p>Peliharaan $pemilik adalah $binatang.</p>";
}
?>


Nggak susah kan?

Oke, itu dasar-dasar PHP. Kita bisa mulai masuk ke tingkat berikutnya, yaitu bagaimana berinteraksi dengan pengunjung situs kita.
Judul: Form
Ditulis oleh: Èxsharaèn pada 11 Desember 2008, 02:56:08
Nah, sebagai pembuat situs web dinamis, kita tentu saja ingin pengunjung bisa berinteraksi dengan situs kita kan? Bagaimana caranya? Mudah saja, ini bisa dilakukan dengan form. Form sendiri sebenarnya adalah HTML, jadi kita kembali sebentar ke HTML ;)

<form>

Tag ini digunakan untuk membuat form pada halaman web kita. Kaya apa sih form itu? Coba saja tengok kotak Jawab-Cepat di bawah, itu form. Coba klik Quick-Edit, akan keluar form. Jadi, intinya, form pada halaman Web ya sama persis pada form di "dunia lama" (baca: kertas isian form).

Tag form memiliki beberapa atribut penting yang tidak boleh dilupakan tiap kali kita hendak membuat form:

name
Sebenarnya bisa diabaikan, namun biasakan memberi nama form. Beberapa peramban lama tidak mengenal atribut ini, tapi mereka bisa diabaikan untuk saat ini (siapa sih yang tidak pakai peramban versi terbaru? ;)). Atau, kalau memang khawatir, berikan nilai yang sama pada atribut id.

action
Ini menentukan ke halaman mana data isian form kita akan dikirim dan diolah lebih lanjut. Sebuah form bisa saja mengirimkan data ke halaman lain, atau bahkan dikirim ke dirinya sendiri untuk pengolahan lebih lanjut. Sementara kita gunakan cara pertama saja supaya tidak bingung.

method
Ini menentukan metode pengiriman data form kita. Nilainya hanya ada dua: get dan post. Hapalkan keduanya dan pahami perbedaannya, karena ini akan sangat mempengaruhi form kita!
Judul: method="get"
Ditulis oleh: Èxsharaèn pada 11 Desember 2008, 03:04:00
Kita bahas yang pertama dulu.

method="get"

Pada mode GET, data yang kita kirimkan akan ditambahkan ke belakang URL halaman target (ingat ya halaman target itu siapa? Nilai atribut action.) Pernah lihat kan URL yang ada tanda ?-nya? Apapun di belakang tanda ? dinamakan query string. Dengan menggunakan metode GET, semua nilai pada form kita akan ditambahkan sebagai query string. Contoh query string adalah index.php?action=post&id=1. Cara bacanya, action akan bernilai post dan id bernilai 1.

Metode ini biasa digunakan dalam mesin pencari (coba saja ke Google, cari sesuatu dan amati URL-nya; kata kunci kita akan keluar di parameter q). Keunggulannya, karena data form kita ditambahkan ke URL, halaman tersebut bisa ditandai (bookmark) untuk akses berikutnya (dan tentu saja para mesin pencari juga bisa mengindeks halaman tersebut lengkap dengan hasil prosesnya). Kelemahannya, panjang URL terbatas (tidak sama untuk setiap perambah, namun konon panjang maksimal yang diizinkan 65.535 karakter), jadi tidak cocok untuk form yang memerlukan data cukup banyak (misalkan teks). Satu lagi, karena semua nilai form kelihatan, jangan gunakan metode GET untuk data yang sensitif (misalkan form login)!!!

Cara mengambil data dari form yang menggunakan metode GET akan diberikan kemudian. Kita kenalan dengan metode satunya dulu.
Judul: method="post"
Ditulis oleh: Èxsharaèn pada 11 Desember 2008, 03:11:14
Berikutnya, ada metode yang cukup umum digunakan untuk form yang datanya cukup banyak:

method="post"

Perbedaannya dengan metode GET, metode POST tidak akan menampakkan data pada kita. Jadi, URL halaman tujuan akan tetap bersih (kecuali jika halaman tujuannya sendiri sudah punya query string); data form tidak akan nampak di situ. Lha terus, apa datanya benar-benar terkirim? Tentu saja! Nanti kita akan lihat bagaimana caranya membaca data form yang menggunakan metode POST di halaman tujuan.

Kelebihan metode ini, karena data yang dikirim tidak kelihatan secara langsung dari sisi pengguna, kita bisa menggunakannya untuk mengirim data yang agak sensitif (form login biasa menggunakan metode POST, karena tentu saja datanya rahasia!), walaupun prakteknya kalau ada yang "mencium" (baca: mencegat) data itu selagi dikirim, tetap saja datanya bisa diambil :D tapi jangan khawatir, kasus belakangan biasanya tidak terjadi di situs-situs yang tidak krusial (atau, kalau mau solusi, bisa menggunakan HTTPS untuk mengenkripsi data yang dikirim, tapi kita tidak bahas itu sekarang). Kelebihan lain, besar data yang kita kirim tidak terbatas. Jadi, mau kirim apa saja, termasuk berkas (nanti kita akan pelajari bagaimana caranya mengunggah sebuah berkas).

Kelemahannya, halaman tujuan benar-benar tergantung pada halaman tempat form kita berada supaya bisa memproses hasilnya. Kalau kita langsung membuka halaman tujuan tanpa mengirim data terlebih dahulu, halaman tujuan tidak akan memperoleh hasil apa-apa. Karena itu, metode POST tidak terlalu disarankan untuk mesin pencarian.

Nah, kita sudah berkenalan dengan kedua metode pengiriman data form. Saatnya berkenalan dengan tag lain untuk mulai membuat form kita!
Judul: INPUT
Ditulis oleh: Èxsharaèn pada 11 Desember 2008, 03:20:47
Oke, tag form selesai sampai di situ (walaupun sebenarnya ada satu lagi atribut yang perlu dikenal, tapi kita tidak akan sentuh sampai kita sampai ke cara mengunggah berkas). Tapi, tag ini tidak berfungsi apa-apa tanpa "teman akrab"-nya:

<input>

Tag inilah yang berfungsi menampung data kita, sekaligus memberi sentuhan visual ke dalam form kita. Tag inipun memiliki banyak jenis, yang dibedakan melalui atribut type. Sebelum itu, kita kenali dulu atribut-atribut yang wajib dimiliki semua tipe input.

name
Tak kenal maka tak sayang. Tak ada nama, kita tak tahu datanya! :D beberapa peramban lama hanya mengenal atribut id, tapi sejatinya atribut id sekarang digunakan untuk styling CSS.

value
Tidak semua input memiliki atribut ini, dan perilakunya berbeda-beda untuk tiap tipe. Nanti kita akan ketahui fungsi atribut ini saat kita mengenal tiap tipe input.

disabled
Kalau diisi, input kita nanti tidak akan bisa dipilih. Lha terus untuk apa? Ada beberapa kegunaan nanti sesuai kebutuhan, tapi untuk sekarang kita bisa abaikan dulu :)

Nah, apa saja jenis-jenis input yang bisa kita pakai?
Judul: Jenis-jenis input
Ditulis oleh: Èxsharaèn pada 11 Desember 2008, 03:49:34
Ada 10 jenis input yang tersedia, yang didefinisikan pada atribut type. Mungkin tidak semua akan kita pakai, namun pada beberapa kasus kita akan menggunakannya. Mereka adalah:

Text box (type="text")
Tipe ini adalah standar; jika kita lupa tidak mengisi atribut type atau isinya salah, peramban akan otomatis menganggapnya sebagai teks. Fungsinya untuk menampung... teks! :D

Contoh:



Aku abaikan atribut name karena ini hanya contoh tampilan :P

Jika kita mengisi atribut value, nilainya akan tampak di dalam boks teks seperti ini:



Oh ya, tag input ini berdiri sendiri, jadi jangan lupa nutupnya untuk XHTML ;)

Ada juga atribut readonly (atribut tunggal), yang membuat boks teks kita tidak bisa diedit tapi masih bisa dipilih:



Perlu membatasi jumlah karakter yang boleh dimasukkan? Gunakan atribut maxlength:



Kurang lebar boksnya, atau kelebaran? Gunakan atribut size untuk mendefinisikan lebar boks (dalam satuan karakter):



Check box (type="checkbox")
Pernah mengisi pilihan yang boleh dipilih lebih dari satu? Di Web, kita menggunakan check box. Atribut value menunjukkan nilai pilihan kita. Selain itu, ada atribut checked yang kalau diberi nilai (ini atribut tunggal), check box kita akan otomatis ditandai. Contoh:

Ini check box biasa
Ini sudah dipilih


Radio button/option (type="radio")
Kebalikan check box, bagaimana kalau hanya boleh satu saja yang dipilih? Kita gunakan tipe input ini. Atribut value dan checked masih sama dengan check box. Perbedaannya dengan checkbox, kita harus memberikan nama yang sama untuk kelompok pilihan kita.

Bingung? Nii contohnya:

Kelompok pertama:
Apel
Pisang
Jambu
Kelompok kedua:
Gajah
Kucing
Monyet


Perhatikan HTML-nya:

Kelompok pertama: <br />
<input type="radio" name="buah" value="1" />Apel<br />
<input type="radio" name="buah" value="2" />Pisang<br />
<input type="radio" name="buah" value="3" />Jambu<br />
Kelompok kedua: <br />
<input type="radio" name="hewan" value="1" checked="checked" />Gajah<br />
<input type="radio" name="hewan" value="2" />Kucing<br />
<input type="radio" name="hewan" value="3" />Monyet


Andaikan tidak kuberi nama, pilihan keempat, kelima, dan keenam akan dijadikan satu dengan tiga pilihan pertama.

Password (type="password")
Ini mirip boks teks, hanya saja biasa digunakan untuk password. Teks yang diketikkan di sini tidak akan tampak, tapi digantikan tanda * atau bulatan (tergantung peramban). Karena mirip boks teks, semua atribut milik boks teks juga berlaku untuk password.

Contoh!



Tombol (type="button")
Ini biasanya tidak berguna jika sendirian, karena fungsinya membuat... tombol visual. Gabungkan dengan JavaScript pada atribut onclick untuk menggunakan tombol ini dalam kasus tertentu. Atribut value mengatur teks yang muncul.

Contoh:



Bedakan dengan dua tombol khusus yang akan kita temui nanti.

File (type="file")
Inilah yang akan kita pakai untuk mengunggah berkas. Contoh!



Kita akan kenali tipe input ini lebih jauh nanti.

Hidden (type="hidden")
Sesuai namanya, input ini... tersembunyi! ;D Lalu, apa gunanya? Misalkan saja untuk menyimpan nilai tertentu yang tidak seharusnya diketahui pengunjung situs, atau tidak terlalu penting untuk diketahui. Biasanya kita akan menggunakan atribut value untuk menggunakan tipe input ini (kalau tidak, ya tidak berguna :D).

Nggak perlu contoh ya, toh nggak tampak apa-apa :D

Nah, tiga tipe sisanya adalah tipe khusus...
Judul: Submit dan Reset
Ditulis oleh: Èxsharaèn pada 11 Desember 2008, 03:56:12
Aku bahas dua tipe dulu yang biasanya berpasangan.

Submit (type="submit") dan Reset (type="reset")
Sesuai namanya, kedua tombol ini digunakan untuk mengirim data (submit) atau mengembalikan form ke keadaan semula (reset). Contoh!

Kali ini aku gunakan HTML lengkap (menggunakan tag form).



Harap jangan klik tombol pertama, pindah halaman nanti ;D

Keduanya punya atribut value untuk mengatur teks apa yang muncul. Kalau tidak diberikan, yang muncul adalah teks dasar yang ditentukan peramban (biasanya Submit dan Reset, tapi di Google Chrome Indonesia nilainya justru Kirim dan Atur ulang).

Tidak suka dengan tombol Submit? Pakai saja ini:

Image (type="image")
Fungsinya sama persis seperti tombol Submit, hanya saja sekarang kita bisa pakai gambar apa saja yang kita mau. Nggak perlu contoh ya, aku nggak punya gambarnya :P jangan lupa, karena ini gambar, atribut src dan alt wajib diisi.

Oke! Itu tipe-tipe input yang tersedia. Tapi, masih ada 1 lagi tag khusus yang tidak termasuk dalam tag input, tapi bisa menampung data:
Judul: <textarea>
Ditulis oleh: Èxsharaèn pada 11 Desember 2008, 04:01:14
Merasa masukan untuk boks teks kurang besar? Bagaimana kalau teks yang dimasukkan agak banyak dan bisa berbaris-baris? Boks teks biasa tidak akan mampu melakukannya. Karena itu, kita bisa minta bantuan tag

<textarea>

Ini bukan tag tunggal, karena apapun yang diapitnya akan muncul di dalam boks teks yang lebih besar (mirip atribut value, hanya saja tag ini tidak punya atribut tersebut). Contoh:



Wah, kurang lebar dan kurang tinggi... Atur atribut rows dan cols untuk keperluan ini. cols dihitung dalam satuan karakter, rows dalam satuan baris.



Tag ini memang agak mirip dengan box teks biasa (<input type="text" />), karenanya atribut disabled, readonly, dan (tentu saja) name juga dimiliki.

Selesai! Sekarang kita bisa membangun form kita sendiri, kemudian mengambil data yang dikirim dengan bantuan PHP. Yuk mulai!
Judul: Contoh form (GET)
Ditulis oleh: Èxsharaèn pada 11 Desember 2008, 04:21:16
Kita mulai dengan metode GET terlebih dulu. Dari tadi cuma bicara teorinya saja kan, belum tahu penerapannya seperti apa? Yuk kita coba!

Buat halaman baru (misal saja form.php, bahkan form.html pun tidak apa-apa) dan ketikkan kode berikut. Andaikan kita akan mengirimkan datanya ke halaman hasil.php (kali ini HARUS berkas PHP):

<form action="hasil.php" method="get">
Nama Anda: <input type="text" name="nama" /><input type="submit" />
</form>


Hasilnya (jangan dicoba di sini!!!):

Nama Anda:


Silakan isi dan tekan Submit. Sementara halamannya akan error, karena kita belum buat halaman hasil.php, tapi coba perhatikan URL-nya: http://localhost/hasil.php?nama=sapi

Jelas kan, data kita ditambahkan ke URL halaman tujuan? Coba lagi dengan masukan yang lebih banyak:

<form action="hasil.php" method="get">
Nama Anda: <input type="text" name="nama" /><br />
Jenis kelamin: <input type="radio" name="jk" value="L" />Laki-laki  <input type="radio" name="jk" value="P" />Perempuan<br />
Sudah menikah? <input type="checkbox" name="nikah" value="y" /><br />
<input type="submit" />
</form>


Contoh URL-nya seperti ini: http://localhost/hasil.php?nama=sapi&jk=L&nikah=y

Nah, sekarang kita buat halaman hasil.php. Kita gunakan contoh form kedua (yang inputnya agak banyak). Gimana caranya mengekstrak data tersebut dari URL? Kita bisa minta bantuan variabel khusus PHP, yaitu $_GET. Variabel ini khusus menangani query string. Tidak hanya dari hasil form GET saja, tapi andaikan kita beri URL dengan query string pun dia akan menangkapnya.

Bingung? Coba dulu buat halaman asal.php dan ketikkan kode ini:

<?php
echo "Halo, " $_GET['n'];
?>


Kemudian, akses dengan menambahkan query string n=asal (bebas sebetulnya), sehingga URL-nya menjadi seperti ini: http://localhost/asal.php?n=asal. Keluar "Halo, asal"?

Nah, dengan cara yang sama, kita bisa menangkap data dari form kita. Buat halaman hasil.php dan ketikkan kode berikut:

<?php
echo "Halo, ";
switch(
$_GET['jk'])
{
case 
"L":
echo "Tuan ";
break;
case 
"P":
echo "Nyonya ";
break;
}
echo 
$_GET['nama'] . "!";
if(
$_GET['nikah'] == "y")
echo " Anda sudah menikah rupanya.";
else
echo " Masih jomblo ya?";
?>


Silakan dicoba dengan variasi apapun yang diinginkan. Kalau malas mengisi form lagi, silakan utak-atik saja query string-nya (ini juga kelemahan metode GET, nilainya bisa diubah saat itu juga tanpa harus mengirim form lebih dahulu).

Mudah kan? Bagaimana dengan metode POST?
Judul: Contoh form (POST)
Ditulis oleh: Èxsharaèn pada 11 Desember 2008, 04:27:28
Kita masih menggunakan dua berkas di atas, form.php dan hasil.php, hanya saja ada beberapa penyesuaian.

Pada halaman form.php, ganti atribut method menjadi post. Silakan langsung di-submit dan perhatikan URL-nya. Tidak ada apa-apa kan di sana?

Nah, untuk mendapatkan datanya, alih-alih menggunakan $_GET, kita menggunakan variabel bantu PHP lainnya, yaitu $_POST. Variabel ini khusus menerima data dari hasil pengiriman form. Kalau tidak ada form yang dikirim, variabel ini tidak ada.

Karena itu, gantilah semua variabel $_GET di halaman hasil.php menjadi $_POST. Sekarang coba hasilnya.

Ternyata tidak sulit kan membuat sebuah form? Dengan mengetahui ini saja, kita sudah dapat membuat berbagai interaksi yang menarik dengan pengunjung situs web kita. Tentu saja, ada yang kurang, karena data ini hanya tersedia saat formnya dikirim...

Berikutnya, kita akan mengenal sesi dan kuki untuk menyimpan data yang diperlukan selama mungkin. Setelah keduanya selesai, kemungkinan interaksi yang bisa dibuat menjadi semakin luas, misalkan saja mengingat nama pengunjung, fitur login dan logout (walaupun ini biasanya masih membutuhkan bantuan lain, database), dan banyak lagi.

Menarik? ;)
Judul: Sesi
Ditulis oleh: Èxsharaèn pada 30 April 2009, 01:42:09
Sudah puas utak-atik dengan form? Datanya cepat hilang kan? Sekarang kita akan mencoba mempertahankan data itu lebih lama lagi, yaitu untuk satu sesi. Lama sesi ini didefinisikan oleh PHP dan bisa dilihat atau diubah di berkas php.ini (dasarnya 1440). Jadi, variabel yang ada di dalam sesi ini akan dapat diakses dan digunakan, selama dia masih aktif dan selama sesi belum berakhir. Beberapa peramban bisa menyimpan sesi, jadi sebaiknya buang variabel sesi yang sudah tidak terpakai lagi jika diperlukan.

Kapan kita memerlukan sesi? Ya kalau kita perlu mengakses variabel dalam jangka waktu tertentu. Aplikasi paling nyata terletak pada fitur masuk dan keluar log. Saat seseorang masuk log (memulai sesinya), sebuah variabel sesi akan diciptakan, misalnya saja berisi nama penggunanya dan hak akses yang dia dapatkan. Selama dia belum keluar log (mengakhiri sesinya), nama penggunanya akan tetap bisa diakses, kecuali dia diam terlalu lama sampai timeout alias waktu habis. Kita akan gunakan contoh ini (fungsi masuk/keluar log) untuk mempelajari cara kerja variabel sesi.

Semua variabel sesi disimpan di satu variabel PHP khusus, yaitu $_SESSION. Variabel ini berupa array, jadi misalkan aku punya variabel sesi username, cara akses dan tulisnya adalah dengan variabel $_SESSION['username']. Kalau sesi tidak otomatis dimulai, kita harus mulai dulu dengan fungsi session_start() sebelum kita bisa mengakses variabel sesi kita. Kalau sudah selesai, buang variabelnya dengan fungsi unset($_SESSION['nama_Variabel']).

Mudah kan? ;) hanya saja, variabel sesi ini tidak bisa langsung diakses pada waktu yang bersamaan dengan saat menulisnya, jadi kalau mau mengakses di halaman yang sama kita harus segarkan dulu halamannya. Atau, paling mudah, baca saja di halaman lain :)

Contoh! Kita akan membuat halaman login.php untuk meminta pengunjung memasukan nama pengguna dan kata kuncinya. Isian itu nanti akan dikirim ke halaman yang sama. Jika valid, kita akan arahkan pengguna ke halaman penyambut, login_success.php misalnya. Kalau tidak sukses, keluarkan pesan di halaman yang sama.

Yuk bikin halaman login.php-nya dulu! Layout-nya acak-acakan saja ya ;D

<html>
<head>
<title>Masuk Log</title>
</head>
<body>
<p>Silakan masukkan nama pengguna dan kata kunci Anda.</p>
<form name="frmLogin" action="login.php?act=login" method="post">
Nama pengguna: <input type="text" name="txtUN" /><br />
Kata kunci: <input type="password" name="txtPW" /><br />
<input type="submit" name="btnSubmit" value="Masuk log" />
</form>
</body>
</html>


Nah, sekarang janjian dulu. Kalau inputnya valid, halaman Web kita tidak mengeluarkan pesan apa-apa, tapi akan langsung mengarahkan pengguna ke halaman login_success.php. Untuk alasan ini, kita akan menggunakan fungsi header(). Berhubung fungsi ini harus diletakkan paling atas pada dokumen kita, sebelum kita mengeluarkan apa-apa ke halaman Web, kode berikut akan diletakkan sebelum <html>.

Waktunya mengecek data pengunjung kita benar atau tidak! Untuk sekarang ini, karena kita tidak punya data apa-apa, anggap saja masukan pengunjung pasti benar. Kita buatkan variabel sesi yang isinya... nama pengguna :D tapi jangan khawatir, nanti aku akan berikan aplikasi nyatanya yang menggunakan bantuan basis data MySQL ;)

Kode PHP-nya seperti ini:

<?php
// Mulai sesi dulu...
session_start();
// Hanya kalau ada variabel GET yang namanya 'act'... (variabel ini baru ada setelah pengguna menekan tombol Masuk log)
if(isset($_GET['act']))
{
// Anggap masih ada aksi lain yang bisa dilakukan...
switch($_GET['act'])
{
case "login"// login
// Cek masukan pengguna di sini. Untuk sekarang, diasumsikan masukannya benar...
// Buat variabel sesi
$_SESSION['uname'] = $_POST['txtUN'];
// Alihkan pengguna
header("Location: login_success.php");
break;
}
}
?>


Sementara itu, buat berkas login_success.php dan letakkan saja kode sederhana berikut:

<?php
session_start
();
echo 
"Halo $_SESSION[uname]!";
?>


Silakan dijalankan. Jika sukses, pada halaman login_success.php akan muncul nama apa saja yang kalian masukkan dari halaman login.php.

Hati-hati, kalau sudah tidak diperlukan, jika kita tidak buang variabel ini, dia akan ada terus sampai waktunya habis (pengaturan dari php.ini), jadi untuk amannya segera buang variabel sesi yang sudah tidak digunakan dengan fungsi unset().

Itu saja tentang sesi, mudah kan? Selain untuk fungsi login, sesi dapat digunakan untuk keperluan lain, misalnya untuk keranjang belanja (shopping cart), dan masih banyak lagi.

Nah, ngomong-ngomong masalah masuk log, ingat kan di beberapa situs Web ada pilihan Ingat saya? Itu bagaimana caranya membuat fitur serupa dengan PHP?
Judul: Masak kue yuk!
Ditulis oleh: Èxsharaèn pada 30 April 2009, 01:44:03
Nah, setelah kenalan dengan sesi, kenapa nggak istirahat dulu dan masak kue :D PHP sudah menyediakan alat masaknya, jadi kita tinggal menunggu kuenya matang ;)

Tapi apa sih kuki itu sebenarnya? Seperti yang aku tulis di Persetujuan Pengguna forum ini, kuki adalah sebuah berkas yang tersimpan di komputer kita, yang akan membantu sebuah situs berkomunikasi dengan kita. Apa isi berkas ini? Yaaa... penggunaan yang paling sering adalah untuk menyimpan nama pengguna (bahkan termasuk kata kunci kita, walaupun biasanya dan seharusnya terenkrip), tapi kita bisa kembangkan penggunaan kuki untuk yang lain, misalnya untuk keranjang belanja, mengingat kapan seseorang berkunjung ke situs kita, sudah berapa kali dia berkunjung, dan sebagainya.

Kuki diakses melalui variabel $_COOKIE['nama_kuki']. Nggak ada yang sulit kan ;) Nah, yang berbeda adalah cara pemberian nilai kuki, kita tidak bisa menggunakan operator = biasa, namun harus menggunakan fungsi bantuan dari PHP, yaitu setcookie(). Lebih lengkapnya seperti ini:

bool setcookie ( string $name [, string $value [, int $expire [, string $path [, string $domain [, bool $secure [, bool $httponly]]]]]] )

Wah, agak panjang ya... biasanya, untuk aplikasi situs Web biasa, kita cukup berhenti sampai $expire saja. Keterangan untuk tiap parameter bisa dilihat di phpManual, tapi lalu apa gunanya topik ini ;)

$name jelas adalah nama calon kuki kita. Wah kue saja harus diberi nama? Ya supaya nanti kita bisa baca nilainya :D

$value juga sudah jelas adalah nilai kuki kita. Kalau diabaikan, kuki kita nggak bakal jadi apa-apa alias kosongan ;D

$expire menunjukkan masa berlaku kuki kita (nggak ada kan yang mau makan kuki yang sudah kadaluwarsa :)). Kalau tidak diisi, kuki kita hanya berlaku sampai peramban ditutup, setelah itu kuki tersebut akan hilang. Ini nilainya menggunakan waktu Unix dalam detik, jadi mungkin perlu bantuan fungsi time(). Misalnya, kalau mau kuki kita hanya berlaku selama satu jam dari waktu pembuatannya, berikan nilai time() + 60 * 60 ke parameter ini.

$path mengatur perizinan kuki kita, bisa dibaca oleh map mana saja dalam $domain kita. "/" berarti semua map bisa baca, "/forum" berarti kuki ini hanya bisa dibaca pada map "forum"; di luar itu kuki kita tidak dikenali. Kalau dikosongkan, dasarnya semua map pada $domain bisa baca kuki kita.

$domain mengatur perizinan kuki pada tingkat domain. Jadi misal aku punya domain www.rpgfantasy.web.id (www) dan subdomain forum.rpgfantasy.web.id (forum). Nilai .rpgfantasy.web.id mengizinkan forum membaca kuki yang dibuat di www, dan sebaliknya. Kalau dikosongkan, dasarnya hanya domain tempat kuki kita dibuat saja yang bisa baca (jadi andaikan aku bikin kuki di forum, www nggak akan bisa baca kuki tersebut).

$secure hanya dipakai untuk koneksi aman (SSL), jadi sementara kita bisa abaikan. Dasarnya false.

Sebagai catatan, karena kuki dianggap sebagai salah satu header dalam spesifikasi HTML, fungsi ini harus dipanggil sebelum ada keluaran apa-apa ke perambah, bahkan satu spasi pun tidak boleh. Jadi hati-hati saja, jangan sampai ada perintah echo sebelum fungsi ini dipanggil :D supaya aman, letakkan fungsi ini sebelum tag html.

Nah, untuk contoh aplikasinya, kita gunakan saja fitur login kita tadi. Kali ini kita tambahi sebuah kotak cek "Ingat saya". Kalau kotak itu dicek, kita harus menyimpan data pengguna kita untuk lain kali. Caranya?

Nii HTML-nya dulu... supaya nggak bingung dengan berkas login yang tadi, buat saja berkas yang baru (misal ini namanya login2.php ;)

<html>
<head>
<title>Masuk Log</title>
</head>
<body>
<p>Silakan masukkan nama pengguna dan kata kunci Anda.</p>
<form name="frmLogin" action="?act=login" method="post">
Nama pengguna: <input type="text" name="txtUN" /><br />
Kata kunci: <input type="password" name="txtPW" /><br />
<input type="checkbox" name="chkRemember" value="remember" /> Ingat saya<br />
<input type="submit" name="btnSubmit" value="Masuk log" />
</form>
</body>
</html>


Nah sekarang kode PHP-nya. Kita cek dulu apa aksinya sudah ada, kemudian baru deh kita lakukan proses masuk log. Anggap saja kuki kita berlaku hanya satu jam :P

<?php
// Pernah login?
if(isset($_COOKIE['uname']))
{
// Langsung arahkan ke halaman penyambut
header("Location: welcome.php");
}
// Hanya kalau ada variabel GET yang namanya 'act'... (variabel ini baru ada setelah pengguna menekan tombol Masuk log)
if(isset($_GET['act']))
{
// Anggap masih ada aksi lain yang bisa dilakukan...
switch($_GET['act'])
{
case "login"// login
// Cek masukan pengguna di sini. Untuk sekarang, diasumsikan masukannya benar...
// Mau disimpan?
if($_POST['chkRemember'])
{
// Buat kuki
setcookie('uname'$_POST['txtUN'], time() + 60 60);
// Coba kita simpan waktu kunjungan terakhirnya...
setcookie('lastVisit'time(), time() + 30 24 60 60);
header("Location: welcome.php");
}
break;
}
}
?>


Sekarang kita buat berkas welcome.php seperti berikut:

<?php
// Ada kuki?
if(isset($_COOKIE['uname']))
{
echo "Halo, $_COOKIE[uname]! Kamu terakhir berkunjung ke situs ini " strftime("%A %d %B %Y"$_COOKIE['lastVisit']);
}
else
{
echo "Anda belum login.";
}
?>


Sekarang, jalankan peramban dan buka halaman login2.php. Isi form yang muncul, kali ini jangan lupa cek Ingat saya agar program kita berjalan, dan tekan Masuk log. Otomatis kita akan dibawa ke halaman welcome.php. Nah, sekarang tutup jendela tersebut, lalu buka lagi halaman login2.php atau langsung saja mengarah ke halaman welcome.php. Apa nama pengguna tadi masih ada? Bagaimana dengan kunjungan terakhirnya? Asyik kan? Tapi coba kunjungi lagi halaman tersebut setelah satu jam, dijamin datanya sudah hilang ;D

Itu saja tentang kuki. Mudah kan? Ingat saja bahwa kuki yang baru "dimasak" tidak bisa langsung "dimakan", jadi halaman login2.php tidak akan bisa baca kuki yang baru kita set, kecuali kalau halaman itu disegarkan kembali. Makanya aku taruh redirect di sana ;)

Oh ya, satu lagi, kalau ingin menghapus suatu kuki tanpa menunggu dia kadaluwarsa, kita bisa set kuki tersebut menggunakan nilai 0 atau FALSE (lebih disarankan nilai FALSE) dan sekaligus mengeset masa kadaluwarsanya ke... masa lalu :P dengan mengeset masa kadaluwarsanya ke masa lalu, peramban kita akan otomatis menganggap kuki itu sudah kadaluwarsa dan akan langsung menghapusnya dari komputer kita. Contoh:

setcookie('uname', 'false', time() - 3600); // kuki ini diset kadaluwarsa sejam yang lalu

Oke! Kita sudah belajar bagaimana menyimpan variabel kita lebih lama, melalui sesi dan kuki. Tapi, data ini terbatas untuk hanya satu sesi saja dan hanya terbaca oleh satu klien. Bagaimana jika ada data yang perlu diakses oleh beberapa orang sekaligus? Bagaimana misalnya forum ini bisa menampilkan tulisanku setelah sekian lama waktu berlalu sejak aku menulisnya?

Upcoming ;)
Judul: PHP + MySQL
Ditulis oleh: Èxsharaèn pada 29 Juli 2009, 11:19:16
Catatan
Topik setelah tulisan ini membutuhkan pengetahuan tentang basis data (http://forum.rpgfantasy.web.id/index.php?topic=168.0) dan SQL (http://forum.rpgfantasy.web.id/index.php?topic=817.0). Silakan cek topik yang terkait kalau belum tahu tentang keduanya :)

Sekarang kita ingin membuat fasilitas masuk log (login) untuk pengunjung situs kita, karena ada beberapa bagian yang hanya boleh diakses anggota. Dengan teknik yang sudah kita ketahui sekarang, apa bisa nih? Data sejauh ini kan sementara ini tersimpan di komputer klien (ingat kuki?). Gimana caranya kita menyimpan data di server?

Salah satu cara adalah menggunakan basis data. Nah, kebetulan basis data yang populer dipakai berdampingan dengan PHP adalah MySQL. Sebenarnya MySQL bisa juga dipakai untuk aplikasi desktop, tapi dia lebih populer dipakai untuk web. Manajernya ada banyak, yang paling populer phpMyAdmin. Ketiganya biasa dipaket jadi satu, seperti yang sudah aku sebutkan di awal artikel ini.

Nah, untuk bisa mencoba aksi PHP dengan MySQL, kita perlu contoh kasus. Tahu twitter (http://www.twitter.com)? Situs ini begitu simpelnya, kita bisa kok menirunya dengan pengetahuan sampai sejauh ini :D dengan menyederhanakan beberapa hal (keamanan, sistem, dll.), hingga artikel ini selesai, kita sudah bisa bikin twitter versi kita sendiri :)

Yuk mulai! Pertama-tama kita perlu bikin basis datanya dulu. Gimana caranya? Dengan phpMyAdmin ;)
Judul: phpMyAdmin
Ditulis oleh: Èxsharaèn pada 29 Juli 2009, 11:40:32
Kebetulan ini tidak dibahas di artikel Basis Data, jadi aku berikan langkah-langkahnya.

1. Akses phpMyAdmin. Tergantung instalasi, kemungkinan besar alamatnya di http://localhost/phpmyadmin/ Kalau ragu dan kebetulan menggunakan AppServ atau sejenisnya, akses saja halaman utamanya, biasanya ada tautan ke phpMyAdmin. Masukkan username dan password MySQL jika memang ada.
Aku asumsi phpMyAdmin pakai bahasa Indonesia ya :) aku menggunakan versi 2.11.7, jadi mungkin ada menu yang nggak sama istilahnya.

Untuk membuat basis data baru:
2. Di beranda, cari kotak Ciptakan database baru. Silakan beri nama basis data kita, misalkan saja lagingapain.
Penyortiran bebas dipilih atau diabaikan, tapi untuk mendukung banyak bahasa, gunakan UTF-8 (utf8_unicode_ci).
Klik Ciptakan.

Tunggu hingga selesai. Basis data kita akan dibuat dan phpMyAdmin akan otomatis membuka halaman baru. Enaknya menggunakan phpMyAdmin, SQL yang baru saja dijalankan akan dituliskan kembali, jadi bisa juga dipakai untuk belajar SQL :)

Untuk membuat tabel baru:
3. Di halaman yang baru saja terbuka, cari isian di sebelah bawah, yang bertuliskan kurang lebih Ciptakan tabel baru pada database lagingapain. Untuk sekarang, kita bikin tabel user dulu untuk menampung data pengguna. Isikan Number of fields dengan 6 (kalau ternyata kurang atau lebih, kita bisa ubah nanti). Klik Go.

4. Buat kolom-kolom berikut:
user_id: int, auto_increment (bisa ditemukan di Ekstra). Untuk membuat kolom ini sebagai kunci utama, cari pilihan yang bergambar kunci dan beri tanda.
usrname: varchar. Berikan panjangnya 20. Untuk mempersingkat, nanti kalau aku tulis varchar(20), itu maksudnya tipe datanya varchar dengan panjang 20.
Namanya sengaja tidak aku buat username untuk mengecoh para peretas.
pswd: char(32). Namanya sengaja tidak aku buat password karena itu fungsi di MySQL :D nanti password yang disimpan kita enkrip dengan fasilitas MD5, jadi nggak bisa diberikan kalau ada yang lupa :P
real_name: varchar(30)
email: varchar(50)
register_date: timestamp. Berikan tanda pada pilihan CURRENT_TIMESTAMP di kolom Default agar kita tidak perlu isikan kolom ini saat INSERT nanti.

Kalau sudah selesai, silakan klik Simpan.

Sementara selesai sampai di sini dulu, kita bisa mulai buat kode PHP-nya :)

Addenda
Tambahkan dua kolom lagi ke tabel user:

active: enum('a','i'). Maksudnya, kolom ini hanya terima dua nilai saja, yaitu "a" dan "i" (tanpa tanda kutip). Kalau diisi selain itu, MySQL akan otomatis mengosongkan nilainya. Isikan pilihannya di kolom Ukuran Panjang/Nilai, dan beri nilai dasar "i" (tanpa tanda kutip).
activation_code: char(32). Sebenarnya kode aktivasi ini panjangnya hanya 8 karakter (bebas sebenarnya), tapi yang disimpan adalah hasil "enkripsi"-nya (MD5-nya).
Judul: PHP: Akses MySQL
Ditulis oleh: Èxsharaèn pada 29 Juli 2009, 11:50:45
Nah, sekarang kita buat halaman registrasi dulu untuk mengisi tabel itu. Mana bisa login kalau nggak ada datanya :D

Secara umum, langkah-langkah yang diperlukan untuk mengakses MySQL adalah seperti berikut:

1. Hubungkan PHP dengan MySQL.
2. Pilih basis data yang akan digunakan.
3. Beri perintah ke MySQL.
4. Tergantung hasil perintah, proses lanjutan bisa dilakukan.

Gimana kodenya tuh di PHP?

1. Hubungkan PHP dengan MySQL

Bisa ditebak, fungsinya adalah mysql_connect(). Fungsi ini akan menghubungkan PHP ke MySQL dan membuat koneksi. Koneksi akan terbuka selama diperlukan dan akan ditutup otomatis setelah penjalanan skrip PHP selesai, atau kita memaksa menutupnya dengan mysql_close(). Ada fungsi yang serupa, yaitu mysql_pconnect. Bedanya, fungsi ini akan membuat sebuah koneksi yang persisten, artinya koneksi tersebut akan terus dibuka (kalau sudah pernah buat koneksi, koneksi itu akan dipakai lagi) dan tidak akan ditutup sekalipun kita memanggil fungsi mysql_close(). Pada kebanyakan kasus, kita tidak perlu menggunakan koneksi persisten, dan menurut MySQL kita tidak perlu memanggil fungsi mysql_close() untuk menutup koneksi (kecuali koneksi persisten).

Fungsi mysql_connect() dan mysql_pconnect() memiliki parameter yang sama. Bentuk fungsinya seperti ini:

resource mysql_connect($host, $username, $password);

$host adalah nama host MySQL kita. Pada hampir semua kasus kita cukup mengisikan nama localhost, bahkan saat kita mengunggah Web kita ke server sesungguhnya. $username dan $password adalah data pengguna dan kata kunci yang diperlukan untuk membuat koneksi. Biasanya informasi ini diberikan oleh penyedia jasa Web host saat pendaftaran. Untuk server lokal, bisa menggunakan pengguna root (kata kuncinya diset saat instalasi MySQL). Atau, jika punya akses ke tabel user yang ada di basis data mysql, kita bisa menggunakan pengguna mana saja yang ada di dalam tabel tersebut (menambah pengguna baru dan hak aksesnya tidak akan dibahas di sini). Fungsi ini akan mengembalikan identitas koneksi MySQL jika berhasil, kalau tidak dia akan memberi nilai false. Biasanya kita akan mengecek dulu apa koneksi sudah berhasil dilakukan atau tidak sebelum menyuruh macam-macam ke MySQL ;)

2. Pilih basis data yang akan digunakan.

Setelah terkoneksi, kita harus memilih dulu basis data mana yang akan kita gunakan. Fungsi mysql_select_db() akan melakukan hal ini. Bentuk fungsinya:

bool mysql_select_db($nama_db[, $link]);

$nama_db jelas sekali menunjuk nama basis data yang ingin kita gunakan. $link opsional, boleh dipakai boleh tidak, adalah identitas koneksi yang akan digunakan (hasil dari fungsi mysql_connect() tadi).

Kedua fungsi ini bisa kita gabung sebelum kita memberi perintah apapun ke MySQL. Kalau berurusan dengan tabel, koneksi harus sudah terbentuk dan basis data yang memiliki tabel itu harus sudah terpilih sebelum kita bisa memberikan perintah. Karena itu, kedua fungsi tersebut harus sukses dijalankan ;) Agar kode program lebih terbaca nantinya, kita beri nama fungsi baru ini connect() (atau nama apa saja lah yang mudah diingat :D):

function connect()
{
// Konek ke sini...
// Jangan lupa sesuaikan parameter mysql_connect dengan kondisi sebenarnya.
$connect = @mysql_connect("localhost", "root", "");
// Kalau gagal konek, kembalikan nilai false.
if(!$connect) return false;
// Pilih basis data dulu...
$db_selected = mysql_select_db("lagingapain", $connect);
// Gagak konek? Kembalikan false.
if(!$db_selected) return false;
// Sampai di sini berarti koneksi sukses dan basis data sudah aktif, jadi
// kembalikan identitas koneksi ini
return $connect;
}


Lalu, berikutnya ngapain?
Judul: PHP & MySQL in action!
Ditulis oleh: Èxsharaèn pada 29 Juli 2009, 11:55:27
3. Beri perintah ke MySQL.

Nah, setelah sukses terkoneksi dan mengaktifkan basis data yang akan digunakan, waktunya memberi perintah ke MySQL! Ini dilakukan dengan fungsi mysql_query() yang bentuknya seperti ini:

resource mysql_query($SQL[, $link]);

Tergantung SQL yang kita berikan, fungsi ini mengembalikan nilai yang berbeda. Untuk SELECT (dan SQL apapun yang mengembalikan kumpulan data), fungsi ini akan mengembalikan resource data kita, atau false kalau terjadi kesalahan. Untuk SQL lainnya (INSERT, UPDATE, DELETE), fungsi ini hanya mengembalikan nilai true kalau sukses dan false kalau tidak.

Contoh! Anggap saja tabel kita sudah ada isinya...

// jangan lupa konek dulu...
$connect = connect();
if(!$connect) exit; // atau ngapain lah di sini, mungkin memberi pesan error?
$SQL = "SELECT * FROM user";
$result = mysql_query($SQL, $connect);
if($result)
{
// Proses hasilnya di sini. Proses lanjutan untuk SELECT akan dibahas setelah ini.
}


Mudah kan?

Karena langkah 1-3 harus dilakukan tiap kali kita akan menjalankan SQL, bisa dibayangkan betapa panjangnya kode kita kalau kode yang sama harus diulang-ulang di tiap halaman yang perlu mengakses basis data. Karena itu, sebaiknya kegiatan ini dibuatkan satu fungsi umum, misalnya seperti ini:


// Fungsi ini meniru fungsi serupa pada VB.NET dan ASP.
// Parameter:
// $SQL - SQL yang akan dijalankan. Diasumsikan hanya SELECT, INSERT, UPDATE, atau DELETE yang akan dijalankan dalam fungsi ini.
// Hasil: resource untuk perintah SELECT atau jumlah data yang terpengaruh perintah INSERT, UPDATE, atau DELETE jika sukses; false jika tidak.
function execute_query($SQL)
{
// Konek dulu ke basis data...
$connect = connect();
// Jika gagal koneksi, langsung akhiri fungsi ini.
if(!$connect) return false;
// Coba jalankan SQL...
$result = @mysql_query($SQL);
// Ada hasil?
if($result)
{
// Tergantung jenis SQL, apa yang harus kita kembalikan?
// Cek dulu kata kunci yang digunakan
// Agar bisa digunakan untuk kueri selain DML, gunakan regular expression untuk menggantikan fungsi berikut
$sql_type = strtoupper(substr($SQL, 0, 6));
switch($sql_type)
{
case "SELECT": // kembalikan hasil kueri, tapi...
// ...kalau tidak ada data?
if(mysql_num_rows($result) == 0) // tidak ada data, anggap fungsi gagal
return false;
else // ada data, kembalikan resource
return $result;
break;
case "INSERT":
case "UPDATE":
case "DELETE": // ketiga SQL ini hanya mengembalikan jumlah data yang terpengaruh, jadi bisa digabung
return mysql_affected_rows($connect);
// CATATAN:
// mysql_affected_rows() untuk UPDATE akan mengembalikan nilai 0 jika tidak ada data yang diubah.
break;
}
}
else
{
// Silakan lakukan apa saja di sini jika kueri gagal dijalankan. Misalnya, beri tahu admin kalau ada kegagalan (simpan ke log).
// Kemudian, kembalikan false.
return false;
}
}


Agak panjang memang, tapi ke depannya kita hanya perlu memanggil fungsi ini untuk menjalankan SQL. Contoh:

$SQL = "SELECT * FROM user";
$result = execute_query($SQL);
if($result)
{
// Proses data lebih lanjut di sini...
}


Singkat kan jadinya ;)

Nah, itu inti program PHP untuk menggunakan basis data MySQL. Tapi tunggu dulu, kalau kita menjalankan SELECT kan berarti kita mau menampilkan data. Lha ngambil datanya bagaimana?
Judul: SELECT in action
Ditulis oleh: Èxsharaèn pada 11 Agustus 2009, 10:39:44
4. Mengambil data dari hasil perintah SELECT

Hasil fungsi execute_query() kita untuk SELECT ternyata masih berupa resource, dalam arti kita masih harus mengekstrak datanya dari PHP. Istilahnya fetch. Nah, fungi fetch ini ada beberapa di PHP (harap diingat bahwa fungsi fetch hanya mengambil satu data dari data yang tersedia):

mysql_fetch_array() akan mengembalikan data kita dalam bentuk array. Nama kolom kita akan menjadi indeks array tersebut. Kita juga bisa menggunakan indeks angka untuk mengakses data kita. Contoh:

$SQL = "SELECT * FROM user";
$result = execute_query($SQL);
if($result)
{
// Karena kita yakin datanya ada banyak, atau malah tidak tahu datanya ada berapa, gunakan saja perulangan berikut
// AWAS!!! Kita menggunakan operator = (pemberian nilai), bukan == (pembandingan)!
while($row = mysql_fetch_array($result))
{
echo $row['usrname'];
echo $row['3']; // sama dengan kolom ketiga di tabel user (real_name)
}
}


mysql_fetch_assoc() hampir sama persis dengan mysql_fetch_array(), hanya saja kita tidak bisa menggunakan indeks angka. Jadi, caranya akses hanya dengan $row['nama_field'].

mysql_fetch_row() juga hampir sama persis dengan mysql_fetch_array(), bedanya kita hanya bisa menggunakan indeks angka: $row[0].

mysql_fetch_object juga mirip (nah lho, hanya mirip ;D), hanya saja bentuknya adalah objek. Cara aksesnya seperti ini: $row->nama_field.

Silakan gunakan mana yang disukai (aku sendiri pilih mysql_fetch_object()) untuk mengambil data satu per satu.
Judul: register.php
Ditulis oleh: Èxsharaèn pada 11 Agustus 2009, 11:26:53
Oke! Dengan pengetahuan itu, kita sudah bisa utak-atik basis data kita. Sekarang kita coba bikin halaman registrasinya dulu. Silakan buat sebuah halaman baru, register.php, dan berikan formulir pendaftaran. Isinya cukup username, password (termasuk konfirmasinya), nama asli, dan email. Setelah registrasi, kita kirimkan sebuah email konfirmasi berisi tautan yang harus diklik untuk mengaktifkan akunnya. Jangan khawatir, nanti aku beri tahu cara mengirim email menggunakan fungsi PHP hanya dalam beberapa baris :)

Misalkan saja halamannya seperti ini:

<h1>Daftar baru</h1>
<p>Belum punya akun? Silakan daftar dulu di sini, gratis!!!</p>
<p>Semua isian wajib diisi.</p>
<form name="frmRegister" action="register-result.php" method="post">
<table>
<tr>
<td>Nama pengguna</td>
<td><input name="txtUN" type="text" /></td>
</tr>
<tr>
<td>Kata kunci</td>
<td><input name="txtPW" type="password" /></td>
</tr>
<tr>
<td>Ulangi kata kunci</td>
<td><input name="txtPW2" type="password" /></td>
</tr>
<tr>
<td>Nama Anda</td>
<td><input name="txtName" type="text" maxlength="30" /></td>
</tr>
<tr>
<td>Alamat email</td>
<td><input name="txtEmail" type="text" maxlength="50" /><br />Isikan alamat email dengan benar karena kami akan mengirimkan email konfirmasi sebelum akun Anda dapat aktif.</td>
</tr>
<tr>
<td>&nbsp;</td>
<td><input name="btnSubmit" type="submit" value="Daftar baru" /> <input name="btnReset" type="reset" value="Reset" /></td>
</tr>
</table>
</form>


Kutip

Daftar baru

Belum punya akun? Silakan daftar dulu di sini, gratis!!!

Semua isian wajib diisi.

Nama pengguna
Kata kunci
Ulangi kata kunci
Nama Anda
Alamat email
Isikan alamat email dengan benar karena kami akan mengirimkan email konfirmasi sebelum akun Anda dapat aktif.
 
Jangan diisi, dijamin error ;D

Nah, di halaman baru, register-result.php, kita proses dulu datanya sebelum mendaftarkan orang ini... apa saja kira-kira prosesnya?
Judul: register-result.php
Ditulis oleh: Èxsharaèn pada 11 Agustus 2009, 12:00:30
Oke! Apa yang perlu kita lakukan di sini? Pertama-tama, cek dulu datanya, valid kah?

Kita coba mulai dengan username dulu. Selain nggak boleh kosong, username nggak boleh ada yang sama kan? Niii...


<?php
// Username kosong?
$un trim($_POST['txtUN']);
if(!
$un) echo "<p>Nama pengguna wajib diisi!</p>";
// Username sudah ada?
$SQL "SELECT user_id FROM user WHERE usrname = '$un'";
$result execute_query($SQL);
if(
$result) echo "<p>Nama pengguna sudah dipakai!</p>";
?>



Silakan cek dulu tiap input sampai kita yakin datanya valid, lalu masukkan ke basis data kita. Untuk membuat karakter acak, silakan gunakan fungsi berikut:

<?php
// Kembalikan karakter acak
// $length: panjang karakter acak
function random_char($length)
{
$feed "0123456789ABCDEF";
for ($i=0$i $length$i++)
{
$rand_str .= substr($feedrand(0strlen($feed)-1), 1);
}
return $rand_str;
}
?>


Dengan mengabaikan pengecekan data:

<?php
// Asumsi data sudah benar
$un trim($_POST['txtUN']);
$pw trim($_POST["txtPW"]);
$name trim($_POST["txtName"]);
$email trim($_POST["txtEmail"]);
$code random_char(8);
$SQL "INSERT INTO user(usrname, pswd, real_name, email, activation_code) VALUES('$un', MD5('$pw'), '$name', '$email', MD5('$code'))";
$result execute_query($SQL);
if(
$result)
{
// Kirim email ke pendaftar
}
else
{
echo "<p>Pendaftaran akun Anda gagal! Silakan coba lagi nanti.</p>";
}
?>


Nah, kirim email-nya gimana? Kode ini sudah bisa dicoba tanpa mengirimkan email, tapi yang ingin dapat email beneran silakan lanjut dulu sebelum menekan tombol Daftar baru :D
Judul: PHP mail()
Ditulis oleh: Èxsharaèn pada 11 Agustus 2009, 01:11:24
Untuk mengirimkan email, fungsinya adalah mail(). Lengkapnya seperti ini:

bool mail ( string $to, string $subject, string $message [, string $additional_headers [, string $additional_parameters]] )

$to jelas adalah penerima email kita. Boleh saja menuliskan lebih dari satu penerima:

<?php
$to 
"[email protected]"// satu penerima
$to "[email protected][email protected]"// lebih dari satu penerima
?>


$subject ya subjek email kita :D jangan memberi karakter baris-baru ("\n") di sini yah.

$message adalah pesan kita. Tiap baris baru ditulis menggunakan karakter baris-baru (\n). Di sini kita juga bisa pakai HTML kalau diperlukan (nanti aku berikan contoh karena parameter keempat harus diisi kalau mau mengirim email HTML); anggap saja tulis dokumen HTML di sini.

$additional_headers adalah header tambahan yang boleh diisi boleh tidak. Catatan, header From harus ditambahkan kalau kita tidak mengeset pengirimnya di php.ini. Kalau diabaikan, keluar warning nanti :) setiap header dipisahkan dengan karakter CRLF (\r\n).

Parameter akhir bisa diabaikan :D

Nah, untuk contoh, kita kirimkan saja email konfirmasi dalam bentuk HTML, karena kita ingin pendaftar tinggal mengeklik tautan yang ada di dalam email (kecuali klien email-nya tidak mendukung HTML). Kodenya:

<?php
// Dapatkan ID terakhir yang dimasukkan
$SQL "SELECT LAST_INSERT_ID() AS new_id";
$result execute_query($SQL);
if($result)
{
$row mysql_fetch_object($result);
$uid $row->new_id;
}
// Kirim email ke pendaftar
$to $email;
$subject "LagiNgapain.net: Daftar akun baru";
$message 
"<html>
<head>
<title>LagiNgapain.net: Daftar akun baru</title>
</head>
<body>
<p>Anda telah mendaftarkan akun baru pada LagiNgapain.net. Berikut adalah informasi akun Anda:<br />
<br />
Nama pengguna: 
$un<br />
Kata kunci: 
$pw<br/>
<br />
Silakan aktifkan akun Anda dengan mengeklik tautan berikut: <a href=\"http://localhost/activate.php?uid=
$uid&c=$code\">Aktifkan akun saya!</a></p>
<p>Jika klien email Anda tidak mendukung HTML, salin tautan berikut dan tempelkan ke perambah Anda:<br />http://localhost/activate.php?uid=
$uid&c=$code</p>
<p>Terima kasih sudah mendaftar di LagiNgapain.net!</p>
<p>LagiNgapain.net</p>
<p>Ini adalah email otomatis. Jangan menjawab email ini. Jika Anda tidak pernah mendaftarkan akun di LagiNgapain.net, silakan abaikan email ini.</p>
</body>
</html>
"
;
// To send HTML mail, the Content-type header must be set
$headers  'MIME-Version: 1.0' "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' "\r\n";
// Tambahan
$headers .= "From: [email protected]"\r\n";
$headers .= "Reply-To: [email protected]"\r\n";
// Kirim!
mail($to$subject$message$headers);
echo "<p>Akun Anda berhasil dibuat! Silakan cek email Anda dan ikuti petunjuk di dalamnya untuk mengaktifkan akun Anda.</p>";
?>


Untuk mencoba kode ini, pastikan komputer sedang konek ke Internet. Lebih bagus lagi kalau diunggah ke server sebelum dicoba :)

Bisa ya membuat halaman activate.php ;)