Dateien (Bilder) aus Datenbanktabelle auslesen
Dateien (Bilder) aus Datenbanktabelle auslesen
am 04.11.2005 07:31:59 von Andreas Rusch
Hallo Profis,
ich habe meine Probleme der vergangenen Woche trotz großer Mühe nicht lösen
können.
Dabei habe ich verschiedene Quellen angezapft und es kommen immer nur die
binären Inhalte der Dateien
zur Anzeige.
Die Dateien erscheinen nach dem Upload ordnungsgemäß in der DB. Allerdings
wird bei JPG als Dateityp
image/pjpeg angezeigt. Die Dateien befinden sich in einem LONGBLOB.
Hier das verwendete script, bei dessen Ausführung die Datei mit
entsprechender ID im Browser angezeigt werden soll.
if(!$_GET['ID']){
die('Keine Datei ausgesucht');
}
require('verbindung/connect.inc.php');
$sql="SELECT ";
$sql.="datei, dateityp FROM buchdateien ";
$sql.="WHERE ID='".$_GET['ID']."'";
$result=@mysql_query($sql,$db_verbindung);
if(mysql_num_rows($result)==1){
$data=mysql_result($result,0, 0);
$typ=mysql_result($result,0, 1);
$kopf="Content-type: ".$typ;
header($kopf);
echo $typ;
echo $data;
}else{
die('Der Download ist gescheitert');
}
?>
Ergebnis ist die Ausgabe des binären Inhalts sowie dieser Fehlermeldung:
Warning: Cannot modify header information - headers already sent by (output
started at
/home/httpd/vhosts/andreasrusch.de/httpdocs/php5buch/listing _12_5.php:7)
in /home/httpd/vhosts/andreasrusch.de/httpdocs/php5buch/listing _12_5.php on
line 19
Zeile 19 ist die Definition des Headers.
Ich bin recht neu auf diesem Gebiet und weiß nun wirklich nicht mehr weiter.
Gruß
Andreas
Re: Dateien (Bilder) aus Datenbanktabelle auslesen
am 04.11.2005 07:48:56 von Martin Kurz
Hallo Andreas,
> if(!$_GET['ID']){
> die('Keine Datei ausgesucht');
> }
> require('verbindung/connect.inc.php');
> $sql="SELECT ";
> $sql.="datei, dateityp FROM buchdateien ";
> $sql.="WHERE ID='".$_GET['ID']."'";
> $result=@mysql_query($sql,$db_verbindung);
> if(mysql_num_rows($result)==1){
> $data=mysql_result($result,0, 0);
> $typ=mysql_result($result,0, 1);
> $kopf="Content-type: ".$typ;
> header($kopf);
> echo $typ;
Der Typ gehört nicht in den Datenstrom, nur in den Header. Das echo
$typ; muss also weg.
> echo $data;
> }else{
> die('Der Download ist gescheitert');
> }
> ?>
>
> Ergebnis ist die Ausgabe des binären Inhalts sowie dieser Fehlermeldung:
>
> Warning: Cannot modify header information - headers already sent by (output
> started at
> /home/httpd/vhosts/andreasrusch.de/httpdocs/php5buch/listing _12_5.php:7)
> in /home/httpd/vhosts/andreasrusch.de/httpdocs/php5buch/listing _12_5.php on
> line 19
Ist logisch, dass Du bei einem Fehler nicht das Bild siesht. Die Augsabe
bedeutet, dass - bevor er zu Zeile 19 mit der Header-Ausgabe kommt -
bereits Daten des Dokuments übertragen wurden, das kann ein Leerzeichen
oder so sein. Überprüfe den Teil des Skripts vor dem geposteten Teil, da
darf nichts ausgegeben werden per echo oder so und auch kein Leerzeichen
oder sonstwas vor dem php-Bereich sein.
Grüße,
Martin
Re: Dateien (Bilder) aus Datenbanktabelle auslesen
am 04.11.2005 08:17:45 von Andreas Rusch
Danke Martin,
du bist ein Held;-))
Ich bekomme die Dateien jetzt angezeigt. Musste dazu meine Datei
connect.inc.php ändern.
Jetzt habe ich nur noch das Problem, die Bilder auch in einer Tabelle
passend zu den Datensätzen ausgegeben zu bekommen. Hast du dazu vielleicht
auch noch einen Tipp?
Ich sage dir schon mal Danke.
Gruß
Andreas
Re: Dateien (Bilder) aus Datenbanktabelle auslesen
am 04.11.2005 13:59:09 von Hartmut Holzgraefe
Andreas Rusch wrote:
> Ergebnis ist die Ausgabe des binären Inhalts sowie dieser Fehlermeldu=
ng:
>=20
> Warning: Cannot modify header information - headers already sent by (ou=
tput
> started at
> /home/httpd/vhosts/andreasrusch.de/httpdocs/php5buch/listing _12_5.php:7=
)
> in /home/httpd/vhosts/andreasrusch.de/httpdocs/php5buch/listing _12_5.p=
hp on
> line 19
>=20
> Zeile 19 ist die Definition des Headers.
klar ist in Zeile 19 der header() Aufruf, das ist der Punkt an dem
das Problem auftritt, ausgelöst wurde es aber bereits durch Ausgaben
in Zeile 7:
output started at /home/.../php5buch/listing_12_5.php:7
--=20
Hartmut Holzgraefe, Senior Support Engineer .
MySQL AB, www.mysql.com
Re: Dateien (Bilder) aus Datenbanktabelle auslesen
am 04.11.2005 17:13:09 von Martin Kurz
Hallo,
Andreas Rusch schrieb:
> Danke Martin,
>
> du bist ein Held;-))
Ich werde rot ;o)
> Ich bekomme die Dateien jetzt angezeigt. Musste dazu meine Datei
> connect.inc.php ändern.
> Jetzt habe ich nur noch das Problem, die Bilder auch in einer Tabelle
> passend zu den Datensätzen ausgegeben zu bekommen. Hast du dazu vielleicht
> auch noch einen Tipp?
Ich versuch's mal... Du müsstest bei der Ausgabe der Tabelle zuerstmal
für jeden Datensatz feststellen, ob Bilddaten dazu vorhanden sind (die
entsprechende Spalte sollte also nicht mehr den Defaultwert haben, bspw
NULL) und wenn ja das HTML-Tag für's Bild an der passenden Stelle
einfügen, wobei als src-Attribut die URL des Bildausgabeskripts mit der
jeweiligen ID als Parameter rein müssen, also minimal in etwa so:
Eine andere Kleinigkeit ist mir bei Deinem Skript noch aufgefallen:
$sql="SELECT ";
$sql.="datei, dateityp FROM buchdateien ";
$sql.="WHERE ID='".$_GET['ID']."'";
Du setzt hier einen unsicheren Wert ungeprüft in ein SQL-Query.
(unsicher, da ein böser Bube als Parameter hier ha alles beliebige an
deinen Server schicken kann) Das sollte man niemals machen sondern immer
schön prüfen, ob in dem Wert auch wirklich das drin ist, was man
erwartet. Im Fall der ID erwartest Du ja einen numerischen Wert, also
stattdessen etwas in der Art des folgenden:
if(!$_GET['ID'] or !is_numeric($_GET['ID'])){
die('Keine Datei ausgesucht');
}
Alternativ kannst Du auch einfach die Variable nehmen und 0 addieren,
dann ist es auf jeden Fall eine Zahl und es kann nichts mehr passieren:
if(!$_GET['ID']){
die('Keine Datei ausgesucht oder falscher ');
}
$imageid = $_GET['ID'] + 0;
Und zum Abschluss: Da ja die ID immer eine Zahl ist, aknnst Du Dir auch
die ' um die ID in der SQL-Query sparen:
$sql = "SELECT datei, dateityp FROM buchdateien WHERE ID=".$imageid;
Viele Grüße,
Martin
Re: Dateien (Bilder) aus Datenbanktabelle auslesen
am 04.11.2005 21:35:07 von Niels Braczek
Martin Kurz schrieb:
> Alternativ kannst Du auch einfach die Variable nehmen und 0 addieren,
> dann ist es auf jeden Fall eine Zahl und es kann nichts mehr passieren:
>
> if(!$_GET['ID']){
> die('Keine Datei ausgesucht oder falscher ');
> }
> $imageid = $_GET['ID'] + 0;
Grundsätzlich hast du recht, verletzt mit deinem Beispiel aber zwei
Grundprinzipien:
1. Prüfe, was du prüfen willst, und nicht etwas, das ähnlich evaluiert
2. Vermeide automagische Typwandlungen.
Daher:
if (empty($_GET['ID'])) {
die('Keine Datei ausgesucht oder falscher ');
}
$imageid = intval($_GET['ID']);
Damit ist wesentlich einfacher nachzuvollziehen, was du als
Programmierer erwartest.
Zusätzlich kann/sollte man noch sicherstellen, dass die ID im gültigen
Bereich liegt:
if ($imageid<=0) {
$imageid = id_of_dafault_image(); // oder Fehlermeldung
}
MfG
Niels
--
| http://www.kolleg.de · Das Portal der Kollegs in Deutschland |
| http://www.bsds.de · BSDS Braczek Software- und DatenSysteme |
| Webdesign · Webhosting · E-Commerce · Mambo Content Management |
`----------------------------------------------------------- -----´