NiX: Datei in DB einlesen

Hallo zusammen.

Ich möchte eine Datei in eine Datenbank einlesen.
Das hochladen und einlesen in die DB ist kein grosses Problem. Wenn ich das aber wieder auslese und zurückgebe, kann ich die Datei anschliessend nicht öffnen (GIF-Bilder sind zerfuscht und Word-Dokumente kann man gar nicht öffnen).

Muss ich da beim ein- oder auslesen etwas beachten?

Danke und Gruss,
NiX

  1. echo $begrüßung;

    Ich möchte eine Datei in eine Datenbank einlesen.
    Muss ich da beim ein- oder auslesen etwas beachten?

    Ja, SQL-Befehle sind Text. Will man Binärdaten in einem Text übertragen, sind bestimmte Zeichen in diesen Binärdaten so zu kennzeichnen/umzuwandeln, dass sie den Transport auf der Text-Schnittstelle überstehen. Für MySQL gibt es dafür die Funktion mysql_real_escape_string().
    Auf dem Rückweg ist nichts mehr zu beachten, die Daten kommen ohne irgendwelche Maskierungen aus der DB zurück.

    echo "$verabschiedung $name";

    1. Hallo $name["schreiber"]

      Ja, SQL-Befehle sind Text. Will man Binärdaten in einem Text übertragen, sind bestimmte Zeichen in diesen Binärdaten so zu kennzeichnen/umzuwandeln, dass sie den Transport auf der Text-Schnittstelle überstehen. Für MySQL gibt es dafür die Funktion mysql_real_escape_string().
      Auf dem Rückweg ist nichts mehr zu beachten, die Daten kommen ohne irgendwelche Maskierungen aus der DB zurück.

      Mmh,das bring ich irgendwie nicht fertig.
      Geht immer noch nicht.

      War das beim einlesen so gemeint:

      $inhalt = file_get_contents($datei);
        $inhalt = mysql_real_escape_string($inhalt);
      //  $inhalt = addslashes($inhalt);  (Brauch ich jetzt nicht mehr?)

      $sql = ("INSERT INTO filestore ( name , endung , inhalt , groesse ) VALUES ( '$name', '$endung', '$inhalt', '$datei_size' );");
          mysql_query( $sql, $mysql);

      Gruss,
      $name["anderer"];

      1. hi,

        $sql = ("INSERT INTO filestore ( name , endung , inhalt , groesse ) VALUES ( '$name', '$endung', '$inhalt', '$datei_size' );");

        echo $sql; // steht darin, was du erwartest?

        mysql_query( $sql, $mysql);

        mysql_query( $sql, $mysql) or die(mysql_error());

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
      2. echo $begrüßung;

        $inhalt = file_get_contents($datei);
          $inhalt = mysql_real_escape_string($inhalt);
            $sql = ("INSERT INTO filestore ( name , endung , inhalt , groesse ) VALUES ( '$name', '$endung', '$inhalt', '$datei_size' );");
            mysql_query( $sql, $mysql);

        Das sieht soweit schon mal nicht schlecht aus. Jedoch ignorierst du den Rückgabewert von mysql_query(). Falls dieser false sein sollte, wäre es hilfreich zu wissen, was mysql_error() zurückliefert. Wenn nicht, müsstest du etwas genauer beschreiben, was du beim Einlesen und beim Auslesen machst. "Geht nicht" ist als Fehlerbeschreibung nicht ausreichend, weil der Fehler so nicht nachvollziehbar ist.

        echo "$verabschiedung $name";

        1. Hallo,

          Das sieht soweit schon mal nicht schlecht aus. Jedoch ignorierst du den Rückgabewert von mysql_query(). Falls dieser false sein sollte, wäre es hilfreich zu wissen, was mysql_error() zurückliefert. Wenn nicht, müsstest du etwas genauer beschreiben, was du beim Einlesen und beim Auslesen machst. "Geht nicht" ist als Fehlerbeschreibung nicht ausreichend, weil der Fehler so nicht nachvollziehbar ist.

          Okay, habe nun das query mit Code überprüfen lassen und das sieht gut aus.
          Beim auslesen mache ich das:

          $sql = ("SELECT * FROM filestore WHERE ID = '$fetch'");
             $result = mysql_query( $sql, $mysql );

          $files=mysql_fetch_array($result, MYSQL_ASSOC);

          $name = $files["name"] . "." . $files["endung"];
             $endung = $files["endung"];
             //  $inhalt = stripslashes($files["inhalt"]); (Brauche ich nun auch nicht mehr?)

          mysql_free_result($result);

          header("Content-Type: $endung");
             header("Content-Disposition: attachment; filename="$name"");
             header("Pragma: no-cache");
             echo $inhalt;

          Danke und Gruss,
          NiX

          1. echo $begrüßung;

            $name = $files["name"] . "." . $files["endung"];
               header("Content-Type: $endung");

            Die Dateiendung ist kein richtiger Wert für den Content-Type. Der sieht üblicherweise beispielsweise so aus: image/jpeg, text/html. Jedoch sollte das nicht zu unbrauchbaren Daten führen, sondern nur zu einem Downloadangebot, weil der Content-Type dem Browser nicht bekannt ist.

            Ansonsten sehe ich außer der nicht vorhandenen Fehlerbehandlung keine offensichtlichen Mängel.
            Hast du mal in die Ausgabe reingeschaut, sprich: Quelltext-Ansicht oder mal im Editor geöffnet? Stehen vielleicht zu Anfang irgendwelche Fehlermeldungen drin?

            echo "$verabschiedung $name";