Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Obrazek w tabeli MySQL
Forum PHP.pl > Forum > Bazy danych > MySQL
xPatryk
Witam !

Chciałbym wstawić miniaturkę przesłanego obrazka do tabeli MySQL.

Miniaturka do tej pory po przesłaniu była zapisywana na dysku, w folderze /images/artykuly/miniaturki/, ale byl problem z koniecznoscia ich usuwania w przypadku usuwania artykulu.

Jak wiec mozna umiescic obrazek w bazie danych (czy ma on trafic do pola typu "BLOB" ?) jesli tak, to czy wystarczy podac uchwyt do niego w zapytaniu w odpowiednim miejscu (np.

  1. INSERT
  2. INTO `artykuly_naglowki` (`obrazek`) VALUES ($obrazek);


?

A jak później wyświetlić go ?


Pozdrawiam i proszę o odpowiedź
Patryk
Fixer
Zdecydowanie nie polecam upychania w bazie danych dużych plików, ponieważ można je umieścić w osobnym katalogu, a w bazie dodać tylko ścieżki do nich. Natomiast są sytuacje, gdy pliki musisz dodać, choć zdarza się to niezmiernie rzadko.

Stwórzmy sobie prostą tabelę zdjecia, do której dodamy grafikę. Tabela może się składać z dwóch pól:

Kod
CREATE TABLE zdjecia (
  id INT NOT NULL PRIMARY KEY auto_increment,
  obraz BLOB
);


Pole id będzie identyfikatorem zdjęcia, a obraz będzie przechowywał plik w bazie. Pola typu BLOB mogą przechowywać dowolne dane binarne, np. zdjęcia lub dźwięki, dlatego skorzystamy właśnie z takiego pola.

Aby umieścić zdjęcie w bazie, posłuż się poniższym skryptem:

Kod
<?
$plik = "1.gif";
$obraz = addslashes(fread(fopen($plik,"rb"),filesize($plik)));

$baza = mysql_connect("localhost", "user", "password");
if ($baza) {
  $wynik = mysql_select_db("baza1");
  if ($wynik) {
    $wynik = mysql_query("INSERT INTO zdjecia VALUES ('','$obraz')");
    if ($wynik) echo "Zdjęcie zostało dodane";
    else echo "Zdjęcie nie zostało dodane";
  } else echo "Nie można połączyć się z tabelą";
  mysql_close($baza);
} else echo "Nie można połączyć się z bazą";
?>


Do zmiennej $obraz wczytywana jest zawartość pliku graficznego, który wcześniej został potraktowany funkcją addslashes(), dodającą ukośnik przed znakami cudzysłowów, aby poprawnie mógł być zapisany w bazie.

Cała reszta w tej linii to zagęszczone odczytanie pliku o określonej wielkości. Opcja r oznacza odczyt pliku, a w Windowsach trzeba jeszcze zastosować b oznaczające czytanie pliku binarnego. Stąd dwa znaki "rb".

W ten sposób możesz wstawiać kolejne zdjęcia do bazy. Gdy już je tam umieścisz, warto by je w jakiś sposób odczytać... Polecenie do wstawienia obrazka na stronę jest trywialne:

Kod
<img src="obraz.gif" alt="" />


Ale ponieważ mamy pobrać obrazek z bazy, odpowiedni plik graficzny musi wygenerować skrypt. Stąd zapis ten zmodyfikuj do postaci:

Kod
<img src="pokaz.php?id=1" alt="" />


Zmienna id to identyfikator obrazka, jaki ma zostać pokazany (ten z pola id w bazie). Pozostało jeszcze skonstruować skrypt pokaz.php odpowiedzialny za wyświetlenie obrazka:

Kod
<?
$id = $_GET["id"];
$baza = mysql_connect("localhost", "user", "password");
if ($baza) {
  $wynik = mysql_select_db("baza1");
  if ($wynik) {
    $wynik = mysql_query("SELECT * FROM zdjecia WHERE id=$id");
    $rekord = mysql_fetch_object($wynik);
  } else echo "Nie można połączyć się z tabelą";
  mysql_close($baza);
} else echo "Nie można połączyć się z bazą";
header("Content-type: image/gif");
echo stripslashes($rekord->obraz);
?>


Pobieramy w nim przekazany numer id, łączymy się z bazą, pobieramy rekord o podanym numerze id, przekształcamy go na obiekt i wypisujemy na ekran zawartość pola obraz pamiętając, aby usunąć ukośniki dodane podczas dopisywania danych do tabeli.

W zależności od rodzaju danych należy jeszcze wyświetlić poprawny nagłówek MIME, np. image/gif dla obrazków. I to już cała obsługa przechowywania i odczytywania obrazków z bazy.

Można by tu jeszcze dodać obsługę plików, które nie istnieją (np. ktoś specjalnie poda zły numer id) i wtedy możnaby pokazać jakiś obrazek z błędem, możnaby też sprawdzać czy obrazek istnieje na dysku, itd. Ale to już odbieganie od właściwego tematu i zależy od zastosowań skryptu.
xPatryk
Witam,

dziękuję za pomoc, zaraz uruchomiem skrypt...

a czy będzie to odpowiednia forma dla małych plików ? (6-8kb) ?

Pozdrawiam
Patryk
Fixer
Raczej tak, zależy też ile ich tam w bazie będziesz miał.
Jak do 100 sztuk to ta forma zapisu tych obrazków będzie odpowiednia i zda to egzamin
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.