Práca s binárnymi dátami na platforme PHP+MySQL

Mnoho z vás sa určite už snažilo skombinovať silu databázového servera MySQL s multimédiami. V dnešnom článku si ukážeme, ako ukladať a čítať BLOB-y z pohľadu php


Na ukladanie veľkých binárnych dát sa na mnohých databázových serveroch včetne MySQL používa dátový typ BLOB (Binary Large Object). Ak chceme na server ukladať multimédiá, použijeme typ BLOB. Pre potreby tohto článku si vytvorme tabuľku binarne_data, do ktorej budeme ukladať všetky blob-y:
CREATE TABLE binarne_data (data BLOB, 
                           velkost INT, 
                           typ VARCHAR(255)
                          )
Prácu s binárnymi dátami si ukážeme na príklade ukladania a čítania obrázkov. Atribut data bude obsahovať telo obrázku, atribút velkost bude velkost obrázka v bajtoch, a v atribúte typ bude uložený typ obrázku, ktorý sa v phpčku pripojí pomocou funkcie Header().

Zápis dát
Predpokladajme, že v našom php skripte bude premenná $conn identifikátor spojenia s databázovým serverom, ktorý nám vrátila funkcia MySQL_Connect. Skript vygeneruje stránku na ktorej sa bude nachádzať formulár, pomocou ktorého odošleme náš obrázok na server, ktorý ho uloží ako blob do databázy: tu je sľúbený skript:
<?
// skript zapis_data.php - zapis binarnych dat do databazy
// $conn - identifikator spojenia so serverom
if ($odoslane) { // Ak bol form. odoslany
 $filepointer=FOpen($obrazok,"r"); // Otvorit docastny subor
 $binarydata=Addslashes(FRead($filepointer,$obrazok_size));
  // Nacitat docastny subor do premennej,
  // pred nebezpecne znaky dat lomitka
  $prikaz .= "INSERT INTO binarne_data VALUES ";
  $prikaz .= "('$binarydata',$obrazok_size,'$obrazok_type')";
  MySQL_Query($prikaz, $conn);
  // Zapis to tabuľky
?>
<form method="post" enctype="multipart/form-data">
 // web rozhranie - formular na odosielanie binarnych dat, data
 // musia byt pri prenose kodovane metodou multipart/form-data
 <input type="file" name="obrazok" accept="image/*">
 // vstupne pole typu "file", v tomto poli je mozne nalistovat
 // pozadovany subor, ktory chcete odoslat.
 <input type="hidden" name="odoslane" value="true">
 // info, ze formular bol odoslany
 <input type="submit" value="Odoslat"> // odoslat formular
</form>

Komentár k skriptu: Prehliadač po kliknutí na tlačítko Odoslat binarne data zakóduje a pošle skriptu na spracovanie. Interpréter PHP automaticky došlý obrázok skopíruje do dočastného súboru, pričom v premennej $obrazok sa bude nachádzať ukazovateľ na tento dočastný súbor. Premenná $obrazok_type bude obsahovať typ obrázka (odoslaný prehliadačom), a veľkosť obrázka v bajtoch. Skript dočastný súbor otvorí, a jeho obsah priradí premennej $binarydata. Pred nebezpečné znaky sa pripoja lomítka, a tak sa premenná zapíše do databázy.

Čítanie dát:
Pre čítanie dát použijeme skript citaj_data.php, úlohou skriptu bude prečítať náhodný záznam (obrázok) z databázy. Všimnite si, že SQL príkaz SELECT je bez podmienok, takže v praxi tam nejakú tú podmienku bude treba pridať. V tomto prípade sa z databázy načíta vždy iba prvý obrázok:
<?
 $obr=mysql_fetch_array(
  mysql_query("SELECT data, typ FROM binarne_data LIMIT 1", 
  $conn));

 header ("Content-type: $obr[typ]"); 
 // pripojit informaciu o type dokumentu
 //pre prehliadac. Tuto funkciu nevynechavajte, inac sa 
 //nezobrazi obrazok, ale iba binarne data v "textovom" tvare
 echo $obr[data]; // Vypisat data, lomitka z pred 
                  // nebezpecnych znakov sa odstrania 
                  // automaticky
?>

Vystupom skriptu citaj_data bude teda obrázok, ktorý možeme do nášho html dokumentu vložiť pomocou tagu img:
<img src="citaj_data.php" alt="Obrazok z databazy">
Skripty neboli testované, a majú iba demonštračný charakter. V praxi je možné skripty doplniť o rôzne podmienky, a volať ich pomocou url adresy s nejakým parametrom (napr. src="citaj_data.php?cislo=52"), na dosiahnutie požadovaného výsledku.

Dev, noemail@noemail.com
Stiahnuté z Developer.sk