phpbar.de logo

Mailinglisten-Archive

Re: BLOB-Daten in/aus MySQL-Datenbank ?!
Archiv Mailingliste mysql-de

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: BLOB-Daten in/aus MySQL-Datenbank ?!



Gloß Mathias schrieb am Mittwoch, den 18. August 1999:
> in dem Beispiel werden die Daten so eingespielt:
[...]
> $image = addslashes(fread(fopen($fileinput,"r"), 1000000)); 
> $SQL = "Insert Into $PhotoTable 
> 	(title,auth_id,description,category,body,cr_date,type) 
> 	values ('$title', '$auth_id', '$desc', '$cat',
> '$image','$date','$type')"; 
[...]
> 	$getPhoto = mysql_fetch_object($Show);
[...]
> Ich fragte mich : Der Typ MEDIUMBLOB kann bis ca. 16 MB 
> Daten aufnehmen, andere noch mehr...
> 
> Es muß dann doch noch eine andere Möglichkeit geben, die
> Daten einzuspielen und abzurufen, außer sie ganz in eine
> Variable zu speichern ? *grübel*

Hallo Mathias, es gibt noch eine andere Möglichkeit, aber nur, wenn
der MySQL-Datenbankserver Zugriff auf das gleiche Dateisystem hat wie
der Webserver, der das PHP-Skript ausführt.

a) Bild in die DB
   ~~~~~~~~~~~~~~
   In neuen Version ab V3.23.0 kennt MySQL die Funktion LOAD_FILE(),
   mit der man direkt den Inhalt einer Datei (die aber logischerweise
   von MySQL aus zugreifbar sein muß) nutzen kann.  Anwendung z.B.

   INSERT INTO bilder(id,name,content)
        VALUES (1, 'SoFi.jpeg', LOAD_FILE('SoFi.jpeg'));
   
   Damit umgehst Du schon mal, daß beim Speichern in die DB die
   Bilddaten von PHP durchgeschleust werden müssen.

   Für ältere MySQL-Versionen bleibt der Weg über LOAD DATA INFILE.
   Beispiel:

     LOAD DATA INFILE 'dateiname'
     INTO TABLE bilder
     FIELDS TERMINATED BY '\t'  /* Diese drei Zeilen sind die */
     ESCAPED BY '\\'            /* Default-Werte und könnten  */ 
     LINES TERMINATED BY '\n'   /* auch weggelassen werden.   */
     (feld1, feld5, feld9);

   (In den MySQL-Versionen seit V3.22.15  gibt's auch
    LOAD DATA LOCAL INFILE, wobei die Datei nicht mehr vom DB-Server
    direkt zugreifbar sein muß.)

   Dazu mußt du zuvor das Bild und die anderen zum Datensatz
   gehörenden Daten in diese Datei gespeichert haben, wobei die Felder 
   hier im Beispiel durch Tabs (\t, ASCII 9) getrennt sind, die Datensätze
   mit Newline (\n, ASCII 10) beendet werden, und diese vier Zeichen
   'escaped' werden müssen:  \   -->  \\
                             \t  -->  \\t
                             \n  -->  \\n
             Nullbyte (ASCII 0)  -->  \0

   Diese Vorverarbeitung könntest Du nun z.B. durch ein externes
   Programm machen lassen:  exec('ersetzungsprogramm') ...
   Da bietet sich ein Mini-C-Programm an, das das dann sehr flott
   erledigen kann.


b) Bild aus der DB
   ~~~~~~~~~~~~~~~
   Um das Zwischenspeichern des ganzen Bildes in einer PHP-Variable zu
   verhindern, müßte das Bild erstmal irgendwie von der DB ins
   Dateisystem kommen, und dann könnte man die PHP-Funktion readfile()
   verwenden um die Bilddaten in einem Rutsch ohne Zwischenspeicherung
   auszugeben.

   Bleibt die Frage, wie kommen die Bilddaten aus der DB in eine
   Datei?
   Leider gibt es _kein_ Gegenstück zu obem erwähntem LOAD_FILE().
   Als Gegenstück zu LOAD DATA INFILE gibt es aber die SQL-Anweisung
   SELECT ... INTO OUTFILE ...
   Beispiel:

     SELECT bildinhaltsfeld
     INTO OUTFILE 'dateiname'
     FROM   bildtabelle
     WHERE  bildid=4711
     ;

   Dabei macht MySQL die gleichen Ersetzungen, wie oben angegeben.
   In PHP-Sprache müßte man jetzt also noch ein StripSlashes über
   die Datei schicken, aber das läßt man besser auch ein Mini-
   C-Programm machen, das man im PHP-Skript als letztes dann
   mit der Funktion passthru() aufruft.

Ciao,
  Martin
-- 
Martin Ramsch <m.ramsch_(at)_computer.org> <URL: http://home.pages.de/~ramsch/ >
PGP KeyID=0xE8EF4F75 FiPr=52 44 5E F3 B0 B1 38 26  E4 EC 80 58 7B 31 3A D7

---
*** Abmelden von dieser Mailingliste funktioniert per E-Mail
*** an mysql-de-request_(at)_lists.4t2.com mit Betreff/Subject: unsubscribe


Home | Main Index | Thread Index

php::bar PHP Wiki   -   Listenarchive