Rabu, 14 Januari 2009

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 :

< method="post" action="filename.php" enctype="multipart/form-data">
< type="hidden" value="204800" name="MAX_FILE_SIZE">
filename: < name="imgfile" type="file">
< 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 "< src="\" 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!

1 komentar:

Yulius Kinta Kanisia mengatakan...

mau tanya ni mas....
saya msh blm jelas dengan artikel anda yang "BLOB pada PHP & MySQL 5"
tlg kasi script yang lengkap untuk upload foto ke database.
thx..