Speichern und Abrufen von Bildern aus SQLite DB mit php
Coolgert
- php
Hallo Leute,
ich benötige Hilfe beim Speichern und Abrufen von Bildern aus einer SQLite Datenbank mit php. Zum Erstellen der Datenbank habe ich das Programm SQLite Administrator verwendet. Die SQLite Version ist 2.0.
Zu meinem Vorgehen:
Ich habe die Datenbank mit einer Tabelle, die einen Blob enthält, angelegt.
Dann habe ich mit dem Progamm ein Bild in dem Blob gespeichert.
Nun will ich das Bild aus dem Blob mit php ausgeben.
Der Code aus der Datei image.php zum Ausgeben des Bildes:
<?php
$db = @sqlite_open('test.sdb');
$sql = "SELECT * FROM DerBlob Limit 1";
$query = @sqlite_query($db, $sql);
$result = sqlite_fetch_all($query);
foreach ($result as $row) {
$image = $row['Data'];
}
header("Content-type: image/jpeg");
echo $image;
?>
Allerdings wird im Browser immer nur "http://localhost/Lite/image.php" ausgegeben und nicht das Bild. Bei der Verwendung von MySQL funktioniert die Ausgabe des Bildes so problemlos.
Wie muss nun das Skript zum Abfragen, bzw. Speichern des Bildes aussehen?
PS:Warum ich das Bild in der Datenbank speichere?
Die Webanwendung die ich auch für SQLite kompatibel machen möchte, benutzt z.Z. MySQL als Datenbank. Um für ein Backup alle Daten zusammen zu haben ist es einfacher die Bilder in der Datenbank zu speichern. So ist alles bei einem Dump am Ende in einer Datei. Das soll für Sqlite nun auch der Fall sein. Ein Speichern der Pfade kommt auf keinen Fall in Frage!
Viele Grüße und schon einmal Danke,
Sebastian
Hi,
Allerdings wird im Browser immer nur "http://localhost/Lite/image.php" ausgegeben und nicht das Bild.
Das machen bspw. Gecko-basierte Browser so, wenn das Bild fehlerhaft ist, und deshalb nicht angezeigt werden kann.
Wie muss nun das Skript zum Abfragen, bzw. Speichern des Bildes aussehen?
Es sollte vor allem, wie jedes halbwegs vernünftige Script, eine Fehlerbehandlung enthalten - wieso glänzt die in einem Beispiel durch vollkommene Abwesenheit?
Und @ vor Funktionsaufrufen ist auch nicht sonderlich geschickt.
PS:Warum ich das Bild in der Datenbank speichere?
Die Webanwendung die ich auch für SQLite kompatibel machen möchte, benutzt z.Z. MySQL als Datenbank. Um für ein Backup alle Daten zusammen zu haben ist es einfacher die Bilder in der Datenbank zu speichern. So ist alles bei einem Dump am Ende in einer Datei.
... der dann irgendwann vermutlich riesig wird, und damit leicht wieder Probleme beim Einspielen machen kann, bspw. was den Hauptspeicherbedarf währendessen angeht.
MfG ChrisB
Hi ChrisB,
Das machen bspw. Gecko-basierte Browser so, wenn das Bild fehlerhaft ist, und deshalb nicht angezeigt werden kann.
Cool, danke! War mir bisher entgangen.
Wie muss nun das Skript zum Abfragen, bzw. Speichern des Bildes aussehen?
Ok, was muss ich denn jetzt machen?
Es sollte vor allem, wie jedes halbwegs vernünftige Script, eine Fehlerbehandlung enthalten - wieso glänzt die in einem Beispiel durch vollkommene Abwesenheit?
Ich habe die Ausgabe des Skripts schon auf Fehler abgeklopft. Hier jetzt die halbwegs vernünftige Version:
<?php
$db = sqlite_open('test.sdb');
if(!$db)
die('No Connection to the SQLite2 database!');
$sql = "SELECT * FROM DerBlob Limit 1";
$query = sqlite_query($db, $sql,SQLITE_ASSOC, $error);
if(!$query){
echo "Error: ".sqlite_error_string( sqlite_last_error($db)).": <b>".$error."</b><br>";
}else{
$result = sqlite_fetch_all($query);
foreach ($result as $row) {
$image = $row['Data'];
}
}
header("Content-type: image/jpeg");
echo $image;
?>
... der dann irgendwann vermutlich riesig wird, und damit leicht wieder Probleme beim Einspielen machen kann, bspw. was den Hauptspeicherbedarf währendessen angeht.
Bei der Webanwendung sind die Bilder in der Datenbank das kleinste "Problem". Die machen nämlich ca 2% des Datenvolumens in der Datenbank aus
;-).
MfG, Sebastian
Hi,
Ich habe die Ausgabe des Skripts schon auf Fehler abgeklopft.
Und?
$result = sqlite_fetch_all($query);
foreach ($result as $row) { $image = $row['Data']; }
Wie viele Datensätze erwartest du hier, dass du eine foreach-Schleife einsetzt?
Wo und wie hast du überprüft, ob das, was du dort erhältst, auch das ist, was du erwartest?
MfG ChrisB
--
Light travels faster than sound - that's why most people appear bright until you hear them speak.
Hi,
»» Ich habe die Ausgabe des Skripts schon auf Fehler abgeklopft.
Und?
Keine Fehler, sonst hätte ich das wohl erwähnt.
Und das skript ohne foreach:
<?php
$db = sqlite_open('test.sdb');
if(!$db)
die('No Connection to the SQLite2 database!');
$sql = "SELECT * FROM DerBlob Limit 1";
$query = sqlite_query($db, $sql,SQLITE_ASSOC, $error);
if(!$query){
echo "Error: ".sqlite_error_string( sqlite_last_error($db)).": <b>".$error."</b><br>";
}else{
$result = sqlite_fetch_all($query);
header("Content-type: image/jpeg");
echo $result[0]['Data'];
}
?>
echo $result[0]['Data']; gibt mir die Daten aus dem Blob, nur mit header bekomme ich kein Bild...
Hi,
echo $result[0]['Data']; gibt mir die Daten aus dem Blob, nur mit header bekomme ich kein Bild...
Na dann vergleiche die Ausgabe des Scriptes mit den Bilddaten, wenn du sie aus der physisch vorhandenen Datei von Platte liest.
Irgendwo Whitespace davor?
Fehlermeldungen, die nicht angezeigt werden, weil du ja bereits per Header gesagt hast, es wären Bilddaten?
MfG ChrisB
Hello,
echo $result[0]['Data']; gibt mir die Daten aus dem Blob, nur mit header bekomme ich kein Bild...
Na dann vergleiche die Ausgabe des Scriptes mit den Bilddaten, wenn du sie aus der physisch vorhandenen Datei von Platte liest.
Irgendwo Whitespace davor?
Fehlermeldungen, die nicht angezeigt werden, weil du ja bereits per Header gesagt hast, es wären Bilddaten?
Sind die Bilddaten überhaupt drin in der Datenbank?
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg