Berita:

Update RPN OJ forum! Petualangan keenam kelompok Trihörrèan di Kerajaan Líghtran berlanjut. Sanggupkah mereka mengakhiri masalah di Líghtran? Baca rangkuman kisah maraton sesi terakhir di sini dan lanjutkan petualangan mereka.

Main Menu

Buat Web yuk! (PHP + MySQL)

Dimulai oleh Èxsharaèn, 21 Oktober 2008, 01:26:49

« sebelumnya - berikutnya »

0 Anggota dan 1 Pengunjung sedang melihat topik ini.

Èxsharaèn

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? ;)
Jangan lupa ikutan serunya petualangan Our Journey!
~ A, èxshna il utnön qu our journey shallaran a èndh... ~

Profiles
About.me https://about.me/hoshiro.exsharaen

Èxsharaèn

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?
Jangan lupa ikutan serunya petualangan Our Journey!
~ A, èxshna il utnön qu our journey shallaran a èndh... ~

Profiles
About.me https://about.me/hoshiro.exsharaen

Èxsharaèn

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 ;)
Jangan lupa ikutan serunya petualangan Our Journey!
~ A, èxshna il utnön qu our journey shallaran a èndh... ~

Profiles
About.me https://about.me/hoshiro.exsharaen

Èxsharaèn

Catatan
Topik setelah tulisan ini membutuhkan pengetahuan tentang basis data dan SQL. 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? 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 ;)
Jangan lupa ikutan serunya petualangan Our Journey!
~ A, èxshna il utnön qu our journey shallaran a èndh... ~

Profiles
About.me https://about.me/hoshiro.exsharaen

Èxsharaèn

#19
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).
Jangan lupa ikutan serunya petualangan Our Journey!
~ A, èxshna il utnön qu our journey shallaran a èndh... ~

Profiles
About.me https://about.me/hoshiro.exsharaen

Èxsharaèn

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?
Jangan lupa ikutan serunya petualangan Our Journey!
~ A, èxshna il utnön qu our journey shallaran a èndh... ~

Profiles
About.me https://about.me/hoshiro.exsharaen

Èxsharaèn

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?
Jangan lupa ikutan serunya petualangan Our Journey!
~ A, èxshna il utnön qu our journey shallaran a èndh... ~

Profiles
About.me https://about.me/hoshiro.exsharaen

Èxsharaèn

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.
Jangan lupa ikutan serunya petualangan Our Journey!
~ A, èxshna il utnön qu our journey shallaran a èndh... ~

Profiles
About.me https://about.me/hoshiro.exsharaen

Èxsharaèn

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?
Jangan lupa ikutan serunya petualangan Our Journey!
~ A, èxshna il utnön qu our journey shallaran a èndh... ~

Profiles
About.me https://about.me/hoshiro.exsharaen

Èxsharaèn

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
Jangan lupa ikutan serunya petualangan Our Journey!
~ A, èxshna il utnön qu our journey shallaran a èndh... ~

Profiles
About.me https://about.me/hoshiro.exsharaen

Èxsharaèn

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 ;)
Jangan lupa ikutan serunya petualangan Our Journey!
~ A, èxshna il utnön qu our journey shallaran a èndh... ~

Profiles
About.me https://about.me/hoshiro.exsharaen