Learn the Rules, Break The Rules, and Create the New Ones...

Hi... My name is Rizky Prihanto. You can call me RQ, or Rizky either. I am currently living on Bandung, Indonesia. Had a lot of works and research about Enterprise Information Systems (majoring on education and e-governments). I have bunch of interests (some friends call it 'freakz') about MySQL Opensource Database and now I am one of the administrator of MySQL Indonesia User Group - the opensource community initialized by Sun Microsystems Indonesia.

My Company PT Cinox Media Insani, Bandung, Indonesia. I work here since 2008 and I take responsibility as Chief of Software Architect. My job is about planning, imaginating, fantasy-ing, concepting, and build the infrastructure of the new information systems (or app engines) which going to be implemented.

This blog This is my blog that represent my current opinion, research and experiences about anything in Software Engineering. Written since 2007 (actually) and has been vaccum for a lot of while. And now I wanna ressurrect this blog (optimistically) from the long-long-hibernation with something fresh and new ideas -- still about MySQL, software engineering, development, and may be something managerial here.

About the tagline I've learned the statement above from some paper written by Kent Beck about Extreme Programming (XP) methodology -- some sort of practical software development methods which have no boundaries. That's very inspiring me a lot. I have written some article on this blog that tell my interpretation about that statement here.

My Another Blogs I have classifying my blogs into some sort of genre. The blog that you read here right now is my primary blog that tell you (majoring) about IT stuff. But if you wanna look another side of me, you can visit here, here, here,or here. Hope it'll be interesting for some of you.

Credits I would thanks to Blogger for this great blog platform. Skinpress who designed this Wordpress template (which is bloggerized by Free Blogger Templates). My appreciate is also going to you who give your generously time for visiting my blog.

BLOB pada PHP & MySQL 5

Beberapa teman nanya ke aku gimana cara ngeload dan nyimpan gambar dari/ke database. Wah, banyak cara... ada yang sukanya makae path, ada yang pengen pake BLOB. Untuk aplikasi single-user mempergunakan database lokal (misal : access/sqlite), main-main images mempergunakan path sih masih oke... tapi gimana dengan database remote? Kalo file images nya di-store ngga di kompie ndiri? DBMS Engine menyediakan fitur BLOB - kepanjangannya lupa aku (hehehe) yang jelas ada Binary2nya dan Object2nya...

Untuk website, sebenarnya ngeload images lewat path juga merupakan pilihan bagus... toh penyimpanan images bisa ditaroh di subdirektori website kita.. Tapi, berhubung (lagi2) yang nanya ke aku tema-nya tentang BLOB, nih kukasih contoh tutorialnya...

Pertama, siapkan dulu tabel nya di MySQL :

CREATE TABLE gambar
(
id integer not null auto_increment,
nama varchar(255) not null,
tipe varchar(100) not null,
size longint not null,
image blob not null
PRIMARY KEY (id)
)

tipe di atas ntar diisikan "GIF"/"JPEG"/"PNG", yang cara mudahnya, deteksi aja secara otomatis MIME-Type nya trus dikonversi ke GIF/JPEG/PNG/etc... (akan dijelaskan di bawah)

Kedua, coba bikin HTML form utk upload gambar :

< form method="post" action="filename.php"
enctype="multipart/form-data">
< input type="hidden" value="204800" name="MAX_FILE_SIZE">
filename:
< input name="imgfile" type="file">
< input type="submit" value="OK" name="submitbtn">
< /form>


di situ kita akan coba batasin, gambar yang di upload maksimal ukurannya 200KB. didefinisikan dengan variabel MAX_FILE_SIZE = 204800... merasa kurang besar? naikin value nya sendiri..

file gambar yang di-upload akan dikasih nama "imgfile" dengan tipe "file", cara manggilnya nanti pake $_FILES['imgfile'];

nah, coding di filename.php nya kya gini nih :
pertama, kita akan "bedah" post_variable $imgfile tersebut ke dalam beberapa value :

$imgfile= $_FILES['imgfile'];
$name = $imgfile['name']; //nama file (tanpa path)
$type = $imgfile['type']; //tipe filenya (langsung detect MIMEnya)
$size = $imgfile['size']; //ukuran file (dalam bytes)
$uperr = $imgfile['error']; //error number (0 = no error)
$tmpfile= $imgfile['tmp_name']; //nama local temp file di server

ups, apa maksut baris terakhir? koq di server? berarti pas kita klik submit itu gambar udah di-upload?

hehehe..., iya. tapi itu cuman temporary file yang dibuatkan otomatis ama web server. file tersebut ntar akan dibaca ama PHP Script misalnya dengan fopen atau fread. Dan file temporary itu ostosmastis akan di-delete sama webserver setelah script PHP di-eksekusi... otomatis.. kita ngga usah doeloe pikirin hal-hal gituan...

yang perlu kita lakukan, sementara ini, adalah validasi aja... entah apakah ada error (di variabel catch $uperr) atau gambarnya kosong, atau mungkin apakah file itu udah ke-upload ke local temp file, yang caranya makae function is_uploaded_file().

kodenya kurang lebih sebagai berikut :

if(!$tmpfile or $uperr or !is_uploaded_file($tmpfile))
echo "error ...\n";
else {
... // proses penyimpanan dilakukan di sini...
}

>> nah, tahap persiapan dan upload selesei, skrg gimana nih caranya masukin ke database?

silakan nikmati code di bawah ini :

$file = fopen($tmpfile, "rb"); // open file (read-only, binary)
$imgdata = fread($file, $size); // read file
fclose($file);

// utk ngonvert MIME-Type ke tipe file...
switch ($type)
{

case "image/gif":
$mime = "GIF Image"; break;
case "image/jpeg":
case "image/pjpeg":
$mime = "JPEG Image"; break;
case "image/png":
case "image/x-png":
$mime = "PNG Image"; break;
default:
$mime = "unknown";
}


$mysqli->query(
"INSERT INTO gambar (nama,tipe,image,tanggal) " .
"VALUES ('".$name."','".$mime."','" . $mysqli->escape_string($imgdata) . "',".$size.")");

selesei deh tahap penyimpanan... coba cek aja di tabel gambar, insya Allah udah masuk tuh gambar ke database..

>> trus cara ngeload nya?

begini : buat satu file : pictures.php
// PHP-Script pictures.php
echo "< img src=\"showpic.php?id=$id"\" /> ";

yang nantinya akan ngirimin variabel GET sesuai dengan id gambar yang mau di load. misalnya id=1, maka ntar link tag lengkapnya sama browser akan diterjemahkan sebagai : showpic.php?id=1.

dan ini adalah code di showpic.php
// PHP-Script showpic.php
$result = $mysqli->query("SELECT tipe, image FROM images WHERE id = $id");
$row = $result->fetch_object();
header($row->tipe); // type file
echo $row->image;

Oia, sblm ada output apa2 ke screen, kirim header() sesuai dengan MIME-Type biar ntar halaman showpic.php akan nge-parse gambar dengan tipe file yang sesuai...

kata kuncinya, utk nge-load BLOB di php, pergunakanlah fetch_object(). Kalo pake fetch_row() biasa, wah... dia ngga support binary object tuh.. row hanya utk mode text...

begitu saja.. silakan kembangin ndiri code nya yak. teknik gini ini aku dapet dari bukunya Michael Kofler - The Definitive Guide to MySQL5. So, kemiripan code, nama, pelaku, dan peristiwa dalam sampel code di atas, harap dimaklumi... yach, namanya juga ilmu yang didapat dari rahasia nenek moyang secara turun-temurun... hehehe....

oke, kembangin ndiri yak? jangan mentok sampe sini doank... oke-oke? tetep semangat belajar!

9 comments:

Anonim mengatakan...

wah ini nih yg dicari2, nampilin pict dari blob-nya mysql. mudah2an bisa deh, trims ya pak bos ;)

atjhunk mengatakan...

asllm. yah ini dia neh. blob, bwt simpan gambar/ pic apa aja didatabase.. trus bisa preview. blob!? duh sempat lupa.. :-), makasih yah dah ngingatin lagi.., thanks ya bwt blognya.

gfegdgf mengatakan...

dfgfvcvdgddfgfgfgfg

Anonim mengatakan...

zhank zyu za mazzz.. ini berzuna zkalee buatz ku.. zkaleee lazi zhank za...

jo mengatakan...

a

tomfreakz mengatakan...

nice artikel...
Cocok banget buat yang baru pengen nyobain make BLOB untuk research/projectnya..

Satu lagi ky untuk nympurnain..
BLOB VS NON BLOB

Kan lo abis mbaca2 tuh, denger2 dari icha ada yang lo risetin juga... bisa dong didokumentasiin tuh didokumentasiin hasil riset & baca-bacanya

D_Red mengatakan...

ngeloadnya pictnya koq gagal ya??ksi sintak lengkap load pict yg dah sukses dooong...ane lagi perlu bwt TA nie....makasi

D_Red mengatakan...

query("SELECT tipe, image FROM gambar WHERE kode_panggil_buku ='$kode_panggil_buku'");
$row = $result->fetch_object();
header($row->tipe); // type file
echo $row->image;
?>

sintaks saya seperti itu. tapi koq gambarnya gak mw tampil ya??saya cek2 gara2 $kode_panggil_buku
apa mungkin $_get gak bs dipake di mysqli??

Anonim mengatakan...

ini artikel ga jelas amat c !
yang jelas dong kalau bikin artikel !

Posting Komentar