Kenangan, Biarkan PHP Mengabadikannya! - Bagian 2: Bagaimana Jika Diurai?
Kenangan, Biarkan PHP Mengabadikannya!
Oleh: Ivan Irawan <rii@ai.co.id>
Bagian 2: Bagaimana Jika Diurai?
Masih Belum Puas
Hari ini Anda selaku officer pengolahan data pada USS Enterprise
mempresentasikan aplikasi basis data awak kapal yang telah Anda bangun
lebih canggih, karena dilengkapi dengan data foto awak kapal. Anda berharap
sistem yang Anda buat ini mampu membuat Kapten Piccard terkesan. Karir Anda
dipetaruhkan pada presentasi ini. Setelah bla-bla-bla dengan semangat maju
tak gentar sampai kerongkongan Anda kering, tibalah saatnya Anda mendengar
komentar para komandan kapal USS Enterprise.
"Luar Biasa!" kata Riker. "Ini sebuah kemajuan yang berarti dalam sistem basis
data awak USS Enterprise. Kita dapat mengembangkannya untuk database yang
lain."
Kapten Piccard masih belum berpendapat, namun kelihatannya ia tersenyum cerah.
Rupanya ia cukup terkesan. Kelihatannya semua baik-baik saja dan berjalan
seperti yang Anda inginkan. Namun tunggu!
"Boleh saya bicara, Kapten?" Letnan Data minta izin bicara.
Setelah mendapatkan jawaban dari Kapten Piccard, Data langsung bicara, "Kapten,
sistem ini memang merupakan langkah maju bagi sistem basis data kita, namun
problemnya sistem ini mungkin hanya sesuai digunakan pada USS Enterprise.
Perbedaan antara sistem komputer yang digunakan Bumi dan sistem komputer Vulcan
mungkin dapat menimbulkan masalah pada saat akses data dari sistem ini oleh
sistem komputer Vulcan. Saya tahu persis sistem komputer Vulcan dibangun dengan
menggunakan sistem Mikocok Visual Basilus. Sistem itu tidak memungkinkan akses
dan manipulasi data biner 8-bit secara mudah dan cepat. Ini akan jadi hambatan
dalam proses transfer data."
"Usul Anda bagaimana, Data?" tanya Kapten Piccard.
"Saya mengusulkan agar data gambar biner 8-bit dapat disimpan kondisi data
7-bit yang universal, sehingga mudah bagi sistem komputer Vulcan untuk
bertukar data. Berarti aplikasi ini harus dimodifikasi lagi," ungkap Data.
"Dan siapkah Anda melakukan perubahan itu?" tanya Kapten Piccard kepada Anda.
Tidak ada pilihan lain bagi Anda selain menyatakan kesanggupan. Sebagai seorang
officer Starfleet, tidak ada pilihan lain untuk berjuang sampai titik darah
penghabisan. Dan itulah yang akan Anda lakukan jika tidak ingin menghabiskan
sisa hidup dan karir secara membosankan di salah satu Starbase terpencil.
Tumpuan Yang Kuat
Untuk dapat menyimpan data dalam format 7-bit, kita membutuhkan pengkodean
yang dapat mengkonversi format 8-bit menjadi 7-bit dan sebaliknya. Dalam sistem
e-mail atau surat elektronik kita mengenal pengkodean yang memungkinkan
dilakukannya pengiriman file biner via protokol e-mail yang menggunakan sistem
7-bit (ASCII). Sistem pengkodean yang lazim digunakan adalah base-64.
Kita juga akan menggunakannya, alasannya sederhana, PHP secara native
memiliki fungsi enkoding dan dekoding base-64. Karena algoritma base-64 ini
umum digunakan, komponen/fungsi untuk hampir semua lingkungan pemrograman
banyak tersedia, baik yang gratis maupun yang komersial. Tinggal dicari saja
dari internet.
Secara prinsip yang akan kita kerjakan saat ini adalah mengubah jenis data
biner 8-bit menjadi data ASCII 7-bit sebelum data tersebut disimpan dalam
basis data MySQL. Pada saat menampilkan data biner tersebut, data ASCII 7-bit
tersebut haruslah dikonversi lagi menjadi data biner 8-bit agar dapat
ditampilkan dengan baik pada komputer pengakses. Cara seperti ini memang
mengandung kerugian dari sisi bertambahnya waktu yang dibutuhkan untuk
melakukan akses dan penyimpanan, serta tentu saja ukuran file yang disimpan
menjadi sedikit lebih besar ketimbang ukuran aslinya.
Di samping kelemahan tersebut, trik ini juga memiliki keunggulan dalam
kompatibilitas data. Anda dapat menggunakan basis data apa pun, sepanjang
bisa menyimpan data teks ASCII dalam ukuran yang besar. Tidak dibutuhkan field
biner pada basis data. Keuntungan lain, sistem-sistem yang memiliki kelemahan
dalam pengolahkan string biner dapat dengan mudah mengakses basis data ini.
Hal yang penting lagi, Anda lebih mudah melakukan dump basis data yang
perlu Anda lakukan pada saat Anda memindahkan sebuah sistem basis data dengan
perintah SQL standar dari satu server ke server lainnya.
Masih Juga Dengan Kawan Lama Kita
Masih ingat dengan basis data yang kemarin telah kita modifikasi pada bagian
pertama artikel ini? Karena kita tidak akan menyimpan data gambar dalam field
biner melainkan dalam teks ASCII 7-bit, maka kita cukup menggunakan field
berjenis TEXT. Seperti juga pada jenis field BLOB, MySQL menyediakan jenis
field TINYTEXT, TEXT, MEDIUMTEXT, dan LONGTEXT. Untuk mudahnya, gunakan saja
TEXT, itu sudah cukup.
Kini saatnya untuk mulai mengacak-acak kembali basis data
uss_enterprise pada tabel awak. Pertama kali kita akan
menghapus (DROP) field FOTO yang berjenis BLOB. Buka MySQL
Client (CLI) dan ketik perintah berikut ini:
mysql> ALTER TABLE awak DROP FOTO;
Kemudian membuat kembali membuat field FOTO yang berjenis TEXT.
Perintahnya adalah sebagai berikut:
mysql> ALTER TABLE awak ADD FOTO TEXT AFTER HOBI;
Baris perintah di atas adalah untuk membuat field bernama FOTO dengan
jenis TEXT dan disisipkan setelah field HOBI. Tentunya Anda dapat juga
melakukan perubahan ini dengan satu perintah SQL saja yaitu:
mysql> ALTER TABLE awak CHANGE FOTO FOTO TEXT;
Patut diingat perintah di atas tidak langsung menghapus isi field FOTO
namun hanya mengubah jenis field. Untuk dapat memulai segalanya dengan bersih,
sebaiknya gunakan cara yang pertama (dihapus dahulu kemudian dibuat field yang
baru), atau lakukan UPDATE terhadap field FOTO dengan
mengisi field FOTO menggunakan nilai Null.
Langkah berikutnya yang penting adalah menghapus data pada field
JENIS, agar proses input/edit dapat berjalan dengan benar.
mysql> UPDATE awak SET JENIS=Null;
Jika proses modifikasi field berhasil dijalankan, maka yang muncul di layar
adalah sebagai berikut:
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| KODE | int(11) | | PRI | NULL | auto_increment |
| NAMA | varchar(50) | | | | |
| PANGKAT | varchar(50) | | | | |
| JABATAN | varchar(50) | | | | |
| BERTUGAS | smallint(6) | | | 0 | |
| EMAIL | varchar(50) | | | | |
| HOBI | varchar(50) | | | | |
| FOTO | text | YES | | NULL | |
| JENIS | varchar(50) | YES | | NULL | |
+----------+-------------+------+-----+---------+----------------+
9 rows in set (0.00 sec)
Kini saatnya kita keluar dari MySQL Client dan memulai perjalanan dengan PHP
andalan kita. Ketikkan:
mysql> QUIT
Yang Itu Terus, Bosan Ah...
Kali ini kita akan menggunakan skrip dasar dari bagian pertama artikel ini.
Mengapa tidak buat yang baru? Alasan utamanya adalah karena saya tergolong
species manusia super pemalas yang tidak suka mengetik skrip terlalu banyak.
Masalah yang dihadapi pun sama, jadi lebih baik modifikasi saja. Skrip
tersebut antara lain:
- koneksi.inc.php
- awakdsp.php
- awakinput.php
- awakedit.php
- awakdel.php
- fotodsp.php
Tidak ada perubahan pada skrip koneksi.inc.php, awakdsp.php,
dan awakdel.php. Tetaplah setia gunakan seperti apa adanya.
Meskipun pemalas, saya tidak pelit. Untuk sesama pemalas dilarang saling
mendahului ... ups ... maksud saya, untuk sesama pemalas, saya menyediakan
skrip yang telah dimodifikasi sesuai bagian kedua artikel ini, yang dapat
Anda download di sini.
Benarkah Kau Telah Berubah?
Modifikasi untuk skrip awakinput.php dapat dilihat sebagai berikut:
awakinput.php
<html>
<head>
<title>Memasukkan Awak Baru</title>
<basefont face="Arial">
</head>
<body>
<?php
// cek apakah kondisi form terkirim atau tidak
if (!$tambah)
{
// jika form tidak dalam kondisi terkirim,
// tampilkan form pencarian nama
?>
<center>
<form action="<?php echo $PHP_SELF ?>"
method="POST" enctype="multipart/form-data">
<font size=5>Masukkan Data Awak USS Enterprise Baru</font>
<p>
<table border=0 cellspacing=2 cellpadding=2>
<tr>
<td>Nama Awak</td>
<td>
<input type="text" name="form_nama" size="50"
maxlength="50">
</td>
</tr>
<tr>
<td>Pangkat</td>
<td>
<input type="text" name="form_pangkat" size="50"
maxlength="50">
</td>
</tr>
<tr>
<td>Jabatan</td>
<td>
<input type="text" name="form_jabatan" size="50"
maxlength="50">
</td>
</tr>
<tr>
<td>Lama Bertugas</td>
<td>
<input type="text" name="form_bertugas" size="2"
maxlength="2"> (dalam tahun)
</td>
</tr>
<tr>
<td>e-mail</td>
<td>
<input type="text" name="form_email" size="50"
maxlength="50">
</td>
</tr>
<tr>
<td>Hobi</td>
<td>
<input type="text" name="form_hobi" size="50"
maxlength="50">
</td>
</tr>
<tr>
<td>File Foto</td>
<td>
<input type="file" name="form_foto" size="40">
</td>
</tr>
<tr>
<td colspan=2 align=center>
<input type="submit" name="tambah" value=" Tambah ">
</td>
</tr>
</table>
</form>
</center>
<?php
}
else
{
// jika form dalam kondisi terkirim,
// lakukan insert ke basis data
// ambil variabel untuk koneksi basis data
require("koneksi.inc.php");
// tentukan query dan kriteria pencarian
// masukkan data gambar hanya jika $form_foto tidak kosong
If ($form_foto != null)
{
// Jika $form_data terisi
// baca file yang ditunjuk oleh $form_data sebesar ukuran file
$data = "'".
base64_encode(fread(fopen($form_foto, "rb"),
filesize($form_foto))).
"'";
// PHP akan secara otomatis membuat variabel $form_foto_type
// yang terisi dengan jenis file yang dibaca.
// Isikan nilai variabel tersebut ke variabel $jenisdata
$jenisdata = "'".$form_foto_type."'";
}
else
{
// jika $form_foto kosong
$data = "Null";
$jenisdata = "Null";
}
$query = "INSERT INTO awak VALUES (
Null,
'".addslashes($form_nama)."',
'".addslashes($form_pangkat)."',
'".addslashes($form_jabatan)."',
$form_bertugas,
'".addslashes($form_email)."',
'".addslashes($form_hobi)."',
$data, $jenisdata
)";
// lakukan proses query
$hasil = mysql_db_query($db,$query,$koneksi)
or die('Kesalahan pada proses query!');
// Tampilkan pesan proses input telah selesai
?>
<center>
<font size=5>Proses Input Berhasil!</font><p>
Data Awak Nama
<b>
<?php echo addslashes($form_nama) ?>
</b>
telah disimpan.
<p>
<a href="<?php echo $PHP_SELF ?>">Klik di sini isi data lagi</a>
<br>
<a href="awakdsp.php">Klik di sini jika selesai</a>
</center>
<?php
}
?>
</body>
</html>
Perbedaan antara skrip ini dengan skrip aslinya adalah pada:
........
$data = "'".
base64_encode(fread(fopen($form_foto, "rb"),
filesize($form_foto))).
"'";
........
Kali ini kita gunakan fungsi base64_encode() untuk memformat data
biner hasil pembacaan file menjadi bentuk 7-bit ASCII base-64. Fungsi
addslashes() tidak lagi dibutuhkan, karena hasil dari fungsi
base64_encode() telah berupa string ASCII 7-bit. Jalankan skrip
awakinput.php ini dan isikan data sebagai berikut:
Nama : Data
Pangkat : Leutenant
Jabatan : Operations Officer
Bertugas : 3 tahun
email : data@ncc1701d.mil.ufp
Hobi : Computer
Isikan foto dengan menggunakan tombol Browse... untuk mencari file
gambar yang akan diisikan ke database. Dalam paket file yang disertakan dalam
artikel ini terdapat gambar data.gif yang dapat Anda gunakan. Klik
tombol Tambah dan jika proses berhasil maka klik link "Klik di sini
untuk selesai" untuk kembali ke skrip awakdsp.php.
Enkoding base-64 terhadap gambar data.gif memberikan hasil string
ASCII 7 bit kurang lebih seperti berikut ini:
R0lGODlheABaAPcAADMeICceICwbIiciJCYbIhUXIhUZKRcZIhkbJ
BUbMBcZIBkbIhAVJBcZHhkbIBUZIhcbJB4gJBUZIBcbIg0VIqu2yB
UbJA0VIIKgyBseIhceJxkeJBUZHhcbIKywtRUbIois0xIZIHycvWd
8kh4iJgsVHiIxP4Cnyn+btWWJphceJBUbINvj6hAZIBIbIh4rNXCW
shAVGRkeIhsgJBcbHomSmRIZHjpGTj9bbFp/l0pneTpQXhAZHhIbI
BkiJxceIpaiqeny9xUbHhUZGxAbIBUeIhcgJHOOm1xzfRkeIGl9hR
IbHhIZGxceIBkgIsvV2FdmahUeIBcgIr7IyiAmJ6+5uhkgIAsNDYS
JiaeoqOPs609cWXV9e5aamRUeG6yurRUXFeXz0+bwy/X840FDOxcZ
EPD204WHd4+Qh15fVOnsw2lqWH9/ZPPzzOPjwI2NfyQkIikpJ318W
fHwxYyLd3NrEHNwUGdlSFZUPu3pu4eFa+bju+zpwXBmDWllPG9qQO
Xgtd7atZWTf5mYjm1iDWNeOGdeLF5WKTAsFSYkF4iBVdjTtWtcEGh
aEERAK4+JbGhXEGFSEu7kuZKNeHx4ZpmWiWdVEGVSEFVJG0E4F1dN
KZKOgJWSh+batPPnwaCZgmROEmn ............ dst
Skrip fotodsp.php juga perlu sedikit dimodifikasi. Lihatlah skrip
hasil modifikasi berikut ini.
fotodsp.php.
<?php
if ($id)
{
// ambil variabel untuk koneksi basis data
require("koneksi.inc.php");
mysql_select_db("uss_enterprise", $koneksi);
// baca FOTO dan JENIS dari database sesuai permintaan KODE awak
$query = "SELECT JENIS, FOTO FROM awak WHERE KODE=$id";
$result = mysql_query($query);
// masukkan hasil query ke variabel $data dan $jenis
$data = base64_decode(mysql_result($result,0,"FOTO"));
$tipe = mysql_result($result,0,"JENIS");
// header untuk mencegah cache di browser agar gambar selalu update
header("Cache-control: private, no-cache");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Pragma: no-cache");
// header untuk memberi tahu browser jenis data yang akan ditampilkan
header("Content-type: $tipe");
// data gambar/foto dikirim ke browser
echo $data;
}
?>
Pada skrip di atas digunakan fungsi base64_decode() untuk
mengembalikan bentuk data teks ASCII 7-bit ke bentuk biner 8-bitnya. Hasilnya
(biner) akan dikirimkan ke browser yang mengakses skrip ini.
Pengubah Yang Perlu Diubah
Skrip awakedit.php juga perlu dimodifikasi, karena skrip ini menjadi
seperti
ini.
awakedit.php.
<html>
<head>
<title>Mengubah Data Awak</title>
<basefont face="Arial">
</head>
<body>
<?php
// ambil variabel untuk koneksi basis data
require("koneksi.inc.php");
mysql_select_db($db, $koneksi);
// cek apakah kondisi form terkirim atau tidak
if (!$simpan)
{
// jika form tidak dalam kondisi terkirim,
// tampilkan form pencarian nama
// cek apakah variabel $kode dikirimkan
if (!$kodeawak) {
die('Tidak ada awak yang dipilih untuk diedit!'); }
// Tentukan query untuk ada yang akan diambil
$query = "SELECT KODE, NAMA, PANGKAT, JABATAN,
BERTUGAS, EMAIL, HOBI, JENIS FROM awak
WHERE KODE='$kodeawak'";
// jalankan query
$hasil = mysql_query($query) or
die('Kesalahan pada proses query!');
// cek dan ekstrak hasil query
$jml_rec = mysql_num_rows($hasil);
if (!($jml_rec>0)) {
die('Data tidak ditemukan!'); }
list($kode,$nama,$pangkat,$jabatan,$bertugas,$email,$hobi,
$jenis) = mysql_fetch_row($hasil);
?>
<center>
<form action="<?php echo $PHP_SELF ?>"
method="POST" enctype="multipart/form-data">
<font size=5>Edit Data Awak USS Enterprise</font>
<?php
// Jika terdapat gambar/foto awak, maka tampilkan pada browser
if ($jenis)
{
echo "<p><img src=\"fotodsp.php?id=$kode\">";
}
?>
<p>
<table border=0 cellspacing=2 cellpadding=2>
<tr>
<td>Nama Awak</td>
<td>
<input type="hidden" name="form_kode"
value="<?php echo $kode ?>">
<input type="text" name="form_nama" size="50"
value="<?php echo $nama ?>" maxlength="50">
</td>
</tr>
<tr>
<td>Pangkat</td>
<td>
<input type="text" name="form_pangkat" size="50"
value="<?php echo $pangkat ?>" maxlength="50">
</td>
</tr>
<tr>
<td>Jabatan</td>
<td>
<input type="text" name="form_jabatan" size="50"
value="<?php echo $jabatan ?>" maxlength="50">
</td>
</tr>
<tr>
<td>Lama Bertugas</td>
<td>
<input type="text" name="form_bertugas" size="2"
value="<?php echo $bertugas ?>" maxlength="2">
(dalam tahun)
</td>
</tr>
<tr>
<td>e-mail</td>
<td>
<input type="text" name="form_email" size="50"
value="<?php echo $email ?>" maxlength="50">
</td>
</tr>
<tr>
<td>Hobi</td>
<td>
<input type="text" name="form_hobi" size="50"
value="<?php echo $hobi ?>" maxlength="50">
</td>
</tr>
<tr>
<td>File Foto</td>
<td>
<input type="file" name="form_foto" size="40">
</td>
</tr>
<tr>
<td colspan=2 align=center>
<input type="submit" name="simpan" value=" Simpan ">
</td>
</tr>
</table>
</form>
</center>
<?php
// bebaskan memori yang digunakan untuk proses
mysql_free_result($hasil);
}
else
{
// jika form dalam kondisi terkirim,
// lakukan perubahan basis data
If ($form_foto != null)
{
// Jika $form_data terisi
// baca file yang ditunjuk oleh $form_data sebesar ukuran file
$data = ", FOTO='".
base64_encode(fread(fopen($form_foto, "rb"),
filesize($form_foto))).
"'";
// PHP akan secara otomatis membuat variabel $form_foto_type
// yang terisi dengan jenis file yang dibaca.
// Isikan nilai variabel tersebut ke variabel $jenisdata
$jenisdata = ", JENIS='".$form_foto_type."'";
}
else
{
// jika $form_foto kosong
$data = "";
$jenisdata = "";
}
// tentukan query
$query = "UPDATE awak SET
NAMA='".addslashes($form_nama)."',
PANGKAT='".addslashes($form_pangkat)."',
JABATAN='".addslashes($form_jabatan)."',
BERTUGAS=$form_bertugas,
EMAIL='".addslashes($form_email)."',
HOBI='".addslashes($form_hobi)."'
$data $jenisdata
WHERE KODE='$form_kode'";
// lakukan proses query
$hasil = mysql_query($query)
or die('Kesalahan pada proses query!');
// Tampilkan pesan proses edit telah selesai
?>
<center>
<font size=5>Proses Edit Berhasil!</font><p>
Data Awak Nama
<b><?php echo addslashes($form_nama) ?></b>
telah disimpan perubahannya.
<p>
<a href="awakdsp.php">Klik di sini untuk kembali</a>
</center>
<?php
}
?>
</body>
</html>
Jalankan kembali skrip awakdsp.php dan pilih Edit, untuk awak
Data, pastikan foto Data sekarang telah muncul di browser Anda.
Kini tugas Anda menambahkan foto untuk Piccard, Riker dan Deanne Troi, dan
LaForge.
Skrip lainnya tidak perlu mengalami perubahan, namun tidak ada salahnya Anda
mencoba kembali skrip-skrip tersebut.
Kini, Anda tidak perlu lagi ragu-ragu jika ingin memindahkan basis data yang
mengandung image/gambar dari satu server ke server lainnya dengan perintah SQL
yang dihasilkan oleh program mysqldump. Image/gambar dalam basis data
yang disimpan melalui skrip di atas hanyalah merupakan data ASCII 7-bit biasa
dan tidak akan menimbulkan masalah waktu disertakan dalam perintah SQL-nya.
Berkat trik yang Anda lakukan, kini sistem komputer bumi dan sistem komputer
Vulcan dapat saling bertukar basis data gambar. Penguasa Vulcan sangat
menghargai jasa Anda dan menawarkan cuti liburan di sebuah lembah yang paling
indah pada sistem planet Vulcan. Tentu saja Anda tidak dapat menolaknya.
Rencana awalnya artikel ini hanya akan dibuat dua seri saja, namun kita memang
cuma bisa berencana saja karena tiba-tiba saya memutuskan untuk menjadikan tiga
seri. Tidak perlu protes, demo atau unjuk rasa, karena keputusan sudah final
tidak bisa diganggu gugat. Di bagian ketiga artikel ini, saya akan berbagi cara
menyimpan gambar pada sistem file yang ada, bukan pada basis data MySQL. Pada
MySQL hanya akan disimpan informasi mengenai gambarnya. Model penyimpanan gambar
seperti ini sesungguhnya paling lazim digunakan karena tidak membebani basis
data. Selamat berlibur di Vulcan sambil menantikan artikel bagian ke 3.
|