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