KOMUNITAS ELEARNING GRATIS ILMU KOMPUTER INDONESIA

Penulis - Pengurus - Kirim Tulisan - Milis - Konsultasi - Download - CD Gratis - Mirror - Sponsorship - Donasi - Home

 PHP? Siapa Takut!
 PHP? Siapa Takut! (1)
 PHP? Siapa Takut! (2)
 PHP? Siapa Takut! (3)
 PHP? Siapa Takut! (4)
 PHP? Siapa Takut! (5)
 Kenangan, Biarkan PHP
 Mengabadikannya!
 Biarkan PHP (1)
 Biarkan PHP (2)
 Teknik PHP Lain
 PDF? Pakai PHP saja!

 
 
 
  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.

 



Copyright © 2003 IlmuKomputer.Com All Rights Reserved
Supported by Gegar Technologies