Mailinglisten-Archive |
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
php::bar PHP Wiki - Listenarchive