Binäre Daten aus Datenbank in Bild umwandeln

xX Hardy Xx

Mitglied
Hallo erstmal,

ich bin gerade dabei in meinem Spiel den Spielern die Möglichkeit für einen Avatar Upload einzubauen.

Der Eintrag in die Datenbank funktioniert. Das Auslesen aus der Datenbank und die Darstellung funktioniert auch mit folgendem Code.

PHP:
    include("datenbankzugriff.inc.php");
    $sql = "SELECT Avatar AS Avatar_db,Avatartyp AS Avatartyp_db";
    $sql.= " FROM status WHERE ID = '1'";
    $abfrage = mysql_query($sql);
    if (mysql_errno()) die ("MySQL-Error: " . mysql_error());
    $array=mysql_fetch_array($abfrage);
    $avatar = $array['Avatar_db'];
    $avatartyp = $array['Avatartyp_db'];
    mysql_close();

    $kopf = "Content-type:".$avatartyp;
    header($kopf);
    echo $avatar;

Doch da ich das Spiel mit Ajax programmiere gibt es ein Problem.

Der Avatar kann nicht direkt mit echo ausgegeben werden, da mit PHP Code ein JavaScript Code generiert wird, der dann an den Browser zurück gesendet wird.
Ich habe es mit imagecreate() und imagejpeg() probiert, doch das funktioniert nicht.

Gibt es eine Möglichkeit

$kopf = "Content-type:".$avatartyp;
header($kopf);
$avatar;

irgendwie zusammenzufassen, und dann in den JavaScript Code einzufügen?

Ich hoffe es ist alles verständlich und das ihr mir helfen könnt.
 
Das gesamte Spiel beruht darauf.

Wenn ein Button (z.B. Profil) geklickt wird, wird in einer JavaScript Funktion eine URL generiert, welche dann an die Funktion übergeben wird, die den Request startet.

Es wird dann eine PHP Seite aufgerufen, und abgearbeitet (Datenbankabfragen und Berechnungen). Der PHP Code generiert wiederum einen HTML Queltext, der in einer JavaScript Variablen (profil) gespeichert wird. Der Inhalt dieser Variablen (profil) wird dann mit document.getElementById("ausgabe_container").innerHTML = profil; weiter verarbeitet.

Das gesamte JavaScript wird wiederum in einer PHP Variablen ($daten) gespeichert, und mit

echo $daten;

an den Browser zurück gesendet.

Bezogen auf das Problem mit der Darstellung des Avatars, sieht der Code wie folgt aus.
(nur ein Auszug, das wichtigste)
PHP:
//
//Datenbankabfrage
//

$sql = "SELECT Avatar AS Avatar_db,Avatartyp AS Avatartyp_db,Avatargroesse AS Avatargroesse_db FROM status WHERE ID = '$spieler_id'";
$abfrage = mysql_query($sql);
if (mysql_errno()) die ("MySQL-Error: " . mysql_error());
$array=mysql_fetch_array($abfrage);
$avatar = $array['Avatar_db'];
$avatartyp = $array['Avatartyp_db'];
$avatargroesse = $array['Avatargroesse_db'];

//
//Ausgabe generieren
//

$daten = ' var profil;'."\n";
$daten.= ' profil = \'<form>\';'."\n";
$daten.= ' profil+= \' <table width="100%">\';'."\n";
$daten.= ' profil+= \'  <tr>\';'."\n";
$kopf = "Content-type:".$avatartyp;
$daten.= ' profil+= \'   <td align="center">'.$avatar.'</td>\';'."\n"; //hier soll der Avatar dargestellt werden
$daten.= ' profil+= \'  </tr>\';'."\n";
$daten.= ' profil+= \' </table>\';'."\n";
$daten.= ' profil+= \'</form>\';'."\n";
$daten.= ' document.getElementById("ausgabe_text").innerHTML = profil;'."\n";

//
//Rückgabe an Browser
//

echo $daten;

Der Avatar wird nicht dargestellt. :(, da $avatar nicht direkt mit echo ausgegeben werden kann.

Ich müsste also erstmal irgendwie ein Bild aus

$kopf = "Content-type:".$avatartyp;
und
$avatar

bilden, das ich dann an die entsprechende Position setze.

Ich habe heute versucht mit tmpfile(); erstmal eine Temporäre Datei zu erzeugen.

PHP:
$kopf = "Content-type:".$avatartyp;
$tmp_file = tmpfile();
fputs($tmp_file,$avatar);
rewind($tmp_file);
header($kopf);
$tmp_str = fgets($tmp_file,$avatargroesse);
$daten.= 'profil+= \'   <td align="center" rowspan="5">'.$tmp_str.'</td>\';'."\n";

Kein Absturz, doch die Ausgabe sind nur vier ?. Diese Ausgabe erkläre ich mir damit, das die Virtuelle Datei kein Extension .jpg hat. das ist aber nur eine Vermutung.
 
Hallo,

speichere den Quellcode aus dem ersten Beitrag doch einfach in eine Datei showavatar.php (o.ä.), die du dann über einen img-Tag in deiner AJAX-Antwort einbindest:
PHP:
$daten.= ' profil+= \'   <td align="center"><img src="showavatar.php?id='.$spieler_id.'" alt="Avatar" /></td>\';'."\n"; //hier soll der Avatar dargestellt werden
Es gibt zwar auch die Möglichkeit, die Bilddaten direkt in den HTML-Quellcode einzubinden, aber das unterstützen nicht alle gängigen Browser.

Grüße,
Matthias
 
Bilder (oder andere Binäre Daten) in Blobs zu speichern ist nicht ratsam, wenn Performance wichtig ist - z. B. in einem Forum oder einer stark frequentierten Seite. Je mehr Bilder MySQL herausrücken muss, desto länger braucht die Engine und die CPU-Last erhöht sich natürlich sehr stark.

Ich würde empfehlen nur die Bildpfade in der Datenbank zu speichern und die Bilder über das Dateisystem zu verwalten. Es ist wesentlich schneller über die DB die Pfade aufzulisten und das entsprechende Bilder über den Bildpfad auszugeben.

Zusätzlich muss für jedes Bild ein PHP-Script geladen werden, was der Performance auch abträglich ist!

Hmm, ich habe sogar einen schönen Beitrag auf der PHP-FAQ gefunden, der meine Aussage stützt.
http://www.php-faq.de/q/q-db-blob.html
 
Zuletzt bearbeitet:
Ich habe mir das mal durchgelesen, und mich entschlossen jetzt doch nicht die Bilder in der Datenbank zu speichern. Da es ein Spiel ist, und ich natürlich auf eine hohe Frequenz hoffe, denke ich das es ohne Datenbank besser ist. Vielen Dank Neurodeamon für den Hinweis.
 
Zurück