# Bild aus MySQL Datenbank anzeigen



## willimc (24. November 2007)

Guten Tag allerseits,
ich habe seit löngerem das Problem, dass ich mittels eines PHP Scripts Bilder zwar in die Datenbank hinein bekomme, aber diese dann daraus nicht anzeigen kann. Bitte Bitte helft mir weiter... das ist mein Code:

```
$result = mysql_query("SELECT bin_data ,filetype FROM binary_data WHERE id = 1");
$Zeile = mysql_fetch_row($result);

$data = $Zeile[0];                  
$type = $Zeile[1];                  
echo $data, "<br>";               //Ausgabe: GIF89ag
echo $type, "<br>";              //Ausgabe: image/gif
Header( "Content-type: $type");
print "<img src='$data'>";       //komischerweise hier die Ausgabe: <img src='GIF89ag
```
die echos habe ich mal testweise reingeschrieben. Was ich komisch finde ist, dass bei dem print das ganze so ausgegeben wird und nicht ein bild.

was ist denn da nun flasch

danke für eure Antworten im Voraus
Timo


----------



## Gumbo (24. November 2007)

Du kannst nicht HTML und GIF gleichzeitig ausgeben, da sie unterschiedliche Inhaltstypen sind.
Du hast nun zwei Möglichkeiten: entweder nutzt du das data-URI-Schema:
	
	
	



```
echo '<img src="data:'.$type.';base64,'.base64_encode($data).'">';
```
Oder du bindest die Grafiken als externe Ressource ein:
	
	
	



```
// image.php
$result = mysql_query("SELECT bin_data ,filetype FROM binary_data WHERE id = ".((int)$_GET['id']));
if( mysql_num_rows($result) && !headers_sent() ) {
	$row = mysql_fetch_assoc($result);
	header('Content-Type: '.$row['filetype']);
	echo $row['bin_data'];
}
```
Letzteres hat den Vorteil, dass dafür nicht die Unterstützung des data-URI-Schemas benötigt wird.


----------



## willimc (25. November 2007)

jo danke schonmal für die antwort.
wenn ich das so anstelle von meiner printzeile einfüge:

```
echo '<img src="data:'.$type.';base64,'.base64_encode($data).'">';
```
bekomme ich dieses kleine Fenster welches bei einem Bild erscheint das es nicht gibt. Also das mit dem roten Kreuz in der Mitte. Die andere Variante hatte ich auch schonmal ausprbiert und da war es die gleiche situation. 
kann es sein, dass das auf meinem server nicht geht? wenn man die bilder reinspeichern kann, müssten sie aber ja auch eigentlich wieder angezeigt werden können oder? 
ich habe wirklich keine plan warum das nicht geht. gibt es noch einen trick? 

bitte helft mir...
Timo


----------



## Gumbo (25. November 2007)

Dann bist du im Besitz eines Browsers, der das data-URI-Schema nicht kennt/unterstützt.

Dein Problem ist, dass du versuchst, zwei unterschiedliche Inhaltstypen (HTML und irgendein Grafikformat) gleichzeitig auszugeben. Und das ist eigentlich nicht möglich.


----------



## willimc (25. November 2007)

ich benutze momentan den internet explorer.
irgendwie muss ich aber doch die bilder aus der Datenbank anzeichen können. mit ftp upload habe ich auch schonmal versucht, so dass ich nur die pfade speichere aber dasgeht auch noch nicht. 
man muss doch das bild aus der datenbank anzeigen können. Ich habe das auf meinem lokalen server von apache auch mal versucht und da geht das so... warum nicht auf dem server im internet?


----------



## Gumbo (26. November 2007)

Was du vorhast ist auch möglich. Nur nicht so wie du es dir vorstellst. Probier doch mal meinen zweiten Vorschlag und setzte ein zusätzliches Skript ein, das die Grafiken ausgibt.


----------



## willimc (27. November 2007)

danke das du so viel geduld mit mir hast 
die zweite variante hatte ich auch schonmal vorher ausprobiert und nun nochmal auf ein neues... 
Das ist komplett nun das was ich für die ausgabe geschrieben habe:

```
<?php 
//Datei: img_get.php

include 'DB.php'; 
verbinden();

$id = $_GET['id']; 
$strQuery= "select Bild, Bildtyp from user where Nick='$id'"; 
// $id ist ein String

$result=mysql_query($strQuery); 

$row=mysql_fetch_assoc($result); 
header('Content-Type: '.$row['Bildtyp']);
echo $row['Bild']; 

?>
```


```
<!-- Datei: Profil.php-->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head>

...


			<!-- user Bild -->
    <span style="position: absolute; top:600; left: 800; z-index: -1">
                <?print "<img src='img_get.php?id=$Nick' width='300'>";?>
    </span>
		<!-- user Bild Ende -->
```



so füge ich das bild in die datenbank ein falls das wichtig ist (das geht aber)


```
if (array_key_exists('img',$_FILES)) { 
                $tmpname = $_FILES['img']['tmp_name']; 
								if ($tmpname!=''){	//ist leer, wenn kein neues bild geladen wurde						 
                    $type = $_FILES['img']['type']; 
                    $hndFile = fopen($tmpname, "r"); 
                    $data = addslashes(fread($hndFile, filesize($tmpname))); 
								
											if (filesize($tmpname)>100000){//Dateigröße prüfen
				 								 $infotext = $infotext.'<br> Das eingef&uuml;ge Bild &uuml;bersteigt die zul&auml;ssige Dateigr&ouml;&szlig;e von 100kb. Alle anderen Daten wurden erfolgreich &uuml;bernommen';
												 $type = Null;
												 $data = Null;
											}
								 }
				    }




$query ="UPDATE user SET 
Bild = '$Bild',
Bildtyp = '$typ'
WHERE Nick = '$Nick'";
$result = mysql_query($query);
```


ich wäre sehr dankbar wenn du einen fehler findest nach dessen änderung das dann funktioniert.

mfg
Timo


----------



## Gumbo (27. November 2007)

Es wäre schön zu erfahren, was genau denn nicht funktioniert? Sind überhaupt Daten in der Datenbank vorhanden? Gibt es bestimmte Fehlermeldungen?


----------



## willimc (27. November 2007)

das Bild wird nicht angezeigt... die daten sind in der datenbank vorhanden fehlermeldungen bekomme ich nicht


----------



## Gumbo (27. November 2007)

Ruf das Skript, das die Grafiken ausgibt, mal direkt auf. Dank des Aufbaus des Skripts sollten mögliche Fehlermeldungen direkt ausgegeben werden (allgemeine Ausgabe von Fehlermeldungen vorausgesetzt). Anderenfalls wäre ein Blick in die Fehler-Logdateien sicherlich aufschlussreich.


----------



## olqs (27. November 2007)

Mir ist im letzten Abschnitt, beim Hochladen der Bilder aufgefallen, dass du beim Einlesen die Binärdaten des Bildes in $data speicherst.
Im SQL Query steht dann aber $Bild.
Ähnlich ists mit dem Content-Type den du $type nennst und im Query dann $typ ohne e.

Werden die Informationen wirklich in der DB gespeichert? Gibts da nen PHP Code dazwischen, der noch Änderungen an den Variablen macht?


----------



## willimc (28. November 2007)

hi olqs,
ich habe eine Datei in der alle SQL Befehle enthalten sind diese wird aufgerufen und in diesem Zuge wird der Variablenname geändert. Die Datenbank ist auch gefüllt mit den Daten das funktioniert wohl. habe das nur der Vollständigkeit halber dazu geschrieben.


----------

