Chriz: Bild in -> aus DB

Hallo, zusammen.

Folgendes Thema beschäftigt mich gerade.
Ich habe eine Tabelle, in die Bilder geladen werden sollen (ich weiß, Bilder in DB: doof - aber es geht nicht anders). Dafür habe ich ein Feld data mit LONGBLOB, eines für Filetype und eines für Dateigröße.

Die Daten selber werden mit addslashes() in die DB geschrieben.

$pfad_zur_datei = $_FILES['form_data']['tmp_name'];
   $data = addslashes(fread(fopen($pfad_zur_datei, "r"), filesize($pfad_zur_datei)));
   $fsize = $_FILES['form_data']['size'];
   $ftype = $_FILES['form_data']['type'];

$query="INSERT INTO pic_db VALUES ('','','','$data','$fsize','$ftype','') ";

Wenn ich das Bild nun ausgeben lasse, ist dieses kaputt :(

$data = stripslashes($show->f("data"));
$type = $show->f("type");

Header( "Content-type: $type");
echo $data;

Was habe ich vergessen, bzw. falsch gemacht?
Fehlt da noch eine Angabe?

Für Hilfe wäre ich sehr dankbar.

Gruß,
Chriz

  1. Moin!

    Die Daten selber werden mit addslashes() in die DB geschrieben.

    Schlechte Idee.

    Wie überall nachzulesen ist, ist addslashes eine Funktion, die seitens PHP dafür sorgt, dass Anführungszeichen und Slashes mit Slashes entschärft werden.

    Das sind aber nicht die einzigen Zeichen, die in Datenbanken zu Problemen führen. Addslashes ist deshalb für die Verwendung als Datenbankescaping nicht geeignet!

    Und genau deshalb stellen Datenbankinterfaces ihrerseits Funktionen zur Verfügung, die das Entschärfen böser Zeichen ebenfalls übernehmen. Konsultiere dazu mal das PHP-Handbuch (die verwendete Datenbank hast du ja nicht genannt, und sie läßt sich aus deinem Code auch nicht ermitteln).

    Wenn ich das Bild nun ausgeben lasse, ist dieses kaputt :(

    $data = stripslashes($show->f("data"));
    $type = $show->f("type");

    stripslashes() hat an dieser Stelle auch nichts zu suchen. Escaping ist nur einmal erforderlich, beim Schreiben in die Datenbank. Die dabei hinzugefügten Escape-Zeichen werden durch diesen Vorgang eliminiert und nicht in der Datenbank gespeichert - und auch nicht beim erneuten Auslesen wieder hinzugefügt.

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Hallo...

      Danke für die Antwort.
      Ich benutze eine MySQL-DB und habe dort schon versucht, mit mysql_real_escape_string() den Inhalt zu codieren, aber auch das klappt nicht??

      Langsam verliere ich die Geduld :D

      Wo kann ich da noch suchen?

      Gruß,
      Chriz

      Moin!

      Die Daten selber werden mit addslashes() in die DB geschrieben.

      Schlechte Idee.

      Wie überall nachzulesen ist, ist addslashes eine Funktion, die seitens PHP dafür sorgt, dass Anführungszeichen und Slashes mit Slashes entschärft werden.

      Das sind aber nicht die einzigen Zeichen, die in Datenbanken zu Problemen führen. Addslashes ist deshalb für die Verwendung als Datenbankescaping nicht geeignet!

      Und genau deshalb stellen Datenbankinterfaces ihrerseits Funktionen zur Verfügung, die das Entschärfen böser Zeichen ebenfalls übernehmen. Konsultiere dazu mal das PHP-Handbuch (die verwendete Datenbank hast du ja nicht genannt, und sie läßt sich aus deinem Code auch nicht ermitteln).

      Wenn ich das Bild nun ausgeben lasse, ist dieses kaputt :(

      $data = stripslashes($show->f("data"));
      $type = $show->f("type");

      stripslashes() hat an dieser Stelle auch nichts zu suchen. Escaping ist nur einmal erforderlich, beim Schreiben in die Datenbank. Die dabei hinzugefügten Escape-Zeichen werden durch diesen Vorgang eliminiert und nicht in der Datenbank gespeichert - und auch nicht beim erneuten Auslesen wieder hinzugefügt.

      • Sven Rautenberg
      1. Moin!

        Ich benutze eine MySQL-DB und habe dort schon versucht, mit mysql_real_escape_string() den Inhalt zu codieren, aber auch das klappt nicht??

        Was tust du, was sind deine Maßnahmen zur Fehlerfindung, welcher Sourcecode?

        Langsam verliere ich die Geduld :D

        Dann lies mal entspannt </hilfe/charta.htm#tipps-fuer-fragende>.

        TOFU ist hier übrigens extrem unerwünscht und hinterläßt unwillige Antworter.

        - Sven Rautenberg

        --
        "Love your nation - respect the others."
  2. Hi Chriz,

    ich weiß, Bilder in DB: doof -

    Jepp :-)

    aber es geht nicht anders.

    Na ja, wenn es schon sein muss: versuch mal, die eingelesenen Daten mit base64_encode kodiert in die Datenbank zu schreiben. Und addslashes/stripslashes schön weglassen, wie die anderen ja schon geschrieben haben.

    Viel Erfolg,

    Karin