Hi Tobi,
hier steht, warum man das nicht machen sollte:
http://www.koehntopp.de/php/faq-13.html#ss13.3
Aus irgendeinem Grund scheinen viele Leute zu glauben, daß es Bilddaten adeln würde, wenn man sie in eine Datenbank stopft.
Wenn man die Bilddaten selbst in der Datenbank ablegt, hat dies den Vorteil, daß keine broken links auftreten können, weil ja die Bilder selbst genauso wie die Links auf die Bilder aus der Datenbank erzeugt werden. Liegen die Bilddaten dagegen im Dateisystem und die Datenbank enthält nur Pfadnamen, dann ist es problemlos möglich, daß jemand die Dateien umbenennt, ohne diese Änderung in der Datenbank nachzuführen und umgekehrt. Leider ist es speziell bei MySQL so, daß keinerlei Mechanismen vorhanden sind, die die referentielle Integrität der Datenbank sicherstellen, sodaß diese Sicherheit nicht wirklich gegeben ist.
Dazu kommen noch eine Reihe von weiteren Nachteilen:
Wenn man die Bilddaten selbst in der Datenbank speichert, dann muß man für jedes Bild in einer Webseite ein Script starten. Das bedeutet, für eine Seite der Art
------------------------------------------------------------
index.php3:
<html>
<body bgcolor="#ffffff" text="#000000" id=all>
<h1>Bla</h1>
<img src="sendimage.php3?img=geniales_logo.gif">
</body>
</html>
------------------------------------------------------------
muß nicht nur das Script index.php3 gestartet werden, um das HTML zu generieren, sondern für jedem Image-Tag auf der Seite muß ein Script sendimage.php3 gestartet werden, daß eine Datenbankverbindung aufmacht und das Bild aus der Datenbank fischt. Wenn CGI PHP verwendet wird, ist der Overhead noch viel größer, denn hier muß für jedes Bild ein 800 kB großer PHP-Prozeß erzeugt und gestartet werden. Legt man dagegen die Bilder als Dateien im Dateisystem ab, kann man mit der Static Page Engine des Webservers oder gar einem spezialisierten Bilder-Webserver arbeiten und ist um ca. den Faktor 10 effizienter.
MySQL kann BLOBs (binary large objects) nicht fragmentarisch bearbeiten, d.h. es ist nicht möglich, ein BLOB in kleinen Teilstücken aus der Datenbank zu holen oder den hinteren Teil eines BLOBs zu holen, ohne die Bytes davor zu lesen. Obendrein ist der Sendepuffer von MySQL für BLOBs begrenzt groß, sodaß nicht beliebig große BLOBs in der Datenbank abgelegt werden können.
Viele Datenbanken werden sehr ineffizient, wenn vergleichsweise große BLOBs zusammen mit anderen, sehr kleinen Objekten in derselben Tabelle gespeichert werden oder wenn eine Tabellenzeile mehr als ein BLOB enthält.
Und hier steht wie´s geht:
http://www.phpbuilder.com/columns/florian19991014.php3
ciao,
Michael