V dnešním pokračování se zaměříme na ukládání binárních dat do databáze MySQL. V mnoha případech totiž může být užitečné vědět, jak se dá pracovat s binárními daty pomocí MySQL.
Do databáze MySQL můžeme ukládat jak obrázky, tak hudební soubory, či cokoli jiného. Předem ale varuji, neukládejte soubory do databáze bez rozmýšlení. Většinou je jednodušší a rychlejší mít soubory uložené jako soubory, a většinou se s nimi i lépe pracuje. Pokud přesto máte důvod mít uložené soubory přímo v databázi, pak je právě pro vás určen dnešní článek.
Sloupec typu BLOB
Pro ukládání binárních dat slouží v tabulkách MySQL sloupec typu BLOB (= binary large object). Přesněji řečeno, MySQL má k dispozici čtyři typy odvozené od BLOB podle maximální velikosti objektu v bajtech, který chceme ukládat:
Typ |
Max. velikost v bajtech |
TINYBLOB |
255 |
BLOB |
65535 |
MEDIUMBLOB |
16777215 |
LONGBLOB |
4294967295 |
Co je třeba udělat v databázi
Pokud chceme do databáze ukládat binární data, musíme založit tabulku, která obsahuje jako sloupec některý ze sloupců typu BLOB. Například pro ukládání obrázků můžeme vytvořit v databázi pokus tabulku pomocí následujícího SQL příkazu:
CREATE TABLE obrazky
(
obrazek_id int unsigned not null auto_increment,
obrazek mediumblob not null,
PRIMARY KEY (obrazek_id)
);
Tímto jsme vytvořili tabulku pro skladování obrázků v databázi. Ve sloupci obrazek_id budeme mít uloženo pořadové číslo obrázku a ve sloupci obrazek bude uložen přímo soubor s obrázkem. Maximální velikost obrázku bude 16 MB, což si myslím bude stačit pro všechny případy.
Jak uložit soubor do databáze
Protože už máme založenu databázovou tabulku obrazky v databázi pokus, můžeme se zabývat tím, jak přidat třeba obrázek do tabulky. Nejprve nahrajte soubor s obrázkem ve formátu JPEG do stejného adresáře - jako máte následující skript - a pak jej přejmenujte na a.jpg:
<html>
<head>
<title>Příklad 1. z 43. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
$id_spojeni = mysql_connect(`localhost`,`root`,``);
if (!$id_spojeni)
die(`Spojení s MySQL databází se nezdařilo.`);
$vysledek_zvoleni_db = mysql_select_db(`pokus`,$id_spojeni);
if (!$vysledek_zvoleni_db)
{
echo mysql_errno($id_spojeni),`: `,mysql_error($id_spojeni),`<br>`;
die(`Nepodařilo se vybrat databázi pokus.`);
}
$f = fopen(`a.jpg`,`rb`);
$data = fread($f,filesize(`a.jpg`));
$sql = "INSERT INTO obrazky(obrazek) VALUES(`".mysql_escape_string($data)."`)";
$vysledek_sql = mysql_query($sql,$id_spojeni);
if (!$vysledek_sql)
{
echo mysql_errno($id_spojeni),`: `,mysql_error($id_spojeni),`<br>`;
die(`Nepodařilo se vložit obrázek.`);
}
else
echo `Podařilo se vložit obrázek.`;
mysql_close($id_spojeni);
?>
</body>
</html>
Výše uvedený skript načte soubor a.jpg a vloží jej do databázové tabulky obrazky. Takto je možné vložit libovolně souborů do databázové tabulky obrazky. Důležité je použít mysql_escape_string při vkládání obsahu souboru do databáze, protože binární soubor může obsahovat libovolné znaky a bez mysql_escape_string by docházelo k chybám.
Jak načíst soubor z databáze
Pro opětovné zobrazení obrázku je možné použít následující skript, který vezme první obrázek v tabulce obrazky a zobrazí jej:
<?php
$id_spojeni = mysql_connect(`localhost`,`root`,``);
if (!$id_spojeni)
die(`Spojení s MySQL databází se nezdařilo.`);
$vysledek_zvoleni_db = mysql_select_db(`pokus`,$id_spojeni);
if (!$vysledek_zvoleni_db)
{
echo mysql_errno($id_spojeni),`: `,mysql_error($id_spojeni),`<br>`;
die(`Nepodařilo se vybrat databázi pokus.`);
}
$id_obrazku = 1;
$sql = "SELECT obrazek FROM obrazky WHERE obrazek_id=".$id_obrazku;
$vysledek_sql = mysql_query($sql,$id_spojeni);
if (!$vysledek_sql)
{
echo mysql_errno($id_spojeni),`: `,mysql_error($id_spojeni),`<br>`;
die(`Nepodařilo se načíst obrázek.`);
}
$data = mysql_fetch_assoc($vysledek_sql);
if (!$data)
die(`Nemáme žádný obrázek.`);
header(`Content-Type: image/jpeg`);
echo $data[`obrazek`];
mysql_close($id_spojeni);
?>
Výše uvedený skript vezme první obrázek a zobrazí jej. Pokud bychom chtěli například zobrazit druhý obrázek, potom vezmeme řádek
$id_obrazku = 1;
a opravíme jej na:
$id_obrazku = 2;
Při zobrazování je nutné znát typ souboru. V našem případě je to jednoduché, ukládali jsme JPEG obrázek, takže ve skriptu sdělíme, že se jedná o MIME typ image/jpeg.
Velikostní limity při BLOB polích
Ačkoli to vypadá, že do databáze můžeme vložit a zpracovat libovolně veliký soubor, není tomu tak. Při zpracování souborů narážíme na hodně limitů, ať už v PHP, nebo v MySQL. Základním limitem v PHP je maximální množství paměti, se kterým můžeme pracovat v jednom skriptu. To je většinou nastaveno na 8 MB.
Pokud se pokusíme přečíst soubor větší délky, potom je náš skript předčasně ukončen se zprávou o překročení limitu paměti. U MySQL nám zase překáží maximální velikost SQL dotazu, která je kolem 1 MB. Z toho všeho je vidět, že nemá příliš smysl používat pro naše potřeby typ LONGBLOB, ale pro všechny běžné účely nám stačí typ MEDIUMBLOB, který má maximální velikost 16 MB.