Hello,
verabschiede Dich vom Formmailer und beschäftige Dich damit, wie man aus dem Post des Formulares eine CSV-Datei generieren kann auf dem Server.
CSV ist ein Müllformat! Absolut unzureichend spezifiziert, keinerlei Encoding-Information, Escaping problematisch, etc. Jedes Programm kocht da sein eigenes Süppchen!
Darum benutze ich ausschließlich die Variante von CSV, sie sich früher "SDF" nannte.
Das hatte jahrzehntelang Bestand, bis M$ kam.
Standard Data Format wurde von IBM vorgschlagen, um die Ashton Tate dBase-Dateien über PC-Connect (das war der Requester) mit System 36 Dateien austauschen zu können.
Da auch alle damals gängigen Hochsprachen das Format konnten (wenn nicht mit eigenen Funktionen, dann eben mit schnell selbst erstellten) hat es sich sher schnell verbreitet. Die Regeln sind einfach.
Felder werden grundsätzlich in " " eingeschlossen.
Kommt im Feld selber ein " vor, wird es verdoppelt
Die so eingeschlöossenen Felder werden durch Semikolon voneinander geetrennt
Das Satzende markiert ein Zeilenumbruch
Da EBCDIC und ASCII schon immer zwei Welten waren, wurden Platzhalter vereinbart
DELIMITER = das Zeichen, das die Felder begrenzt
SEPARATOR = das Zeichen, das die Felder trennt
CRLF = Zeilenumbruch
Erlaubt waren alle Bytecodes aus dem Bereich 0 bis 255
Welcher Code (Codegruppe) nun welches Zeichen darstellte, war eben Sache des Zeichensatzes
Außerdem durften nur vollständige Datensätze übergeben werden. D.h.: alle Zeilen müssen genausoviele Felder haben.
fgetcsv() kann diese Variante lesen.
fputcsv ist aber leider die Microschrott-Variante, in der auch versucht wird, Typen zu übergeben, also numerische Daten _nicht_ in Häkchen einzuschließen, da sie sich daduech von Strings unterscheiden sollen.
Diese Funktion kommt dem gewünschtern Ziel scjhon etwas näher,
allerdings erzeugt sie auch noch keine "vollständigen" Zeilen
function make_csv($_data)
{
$row ='';
if(is_array($_data))
{
foreach($_data as $fieldname => $field_value)
{
$_data[$fieldname] = str_replace('"','""',$field_value);
}
$row = implode('";"',$_data);
if(strlen($row) > 0) ## Datensatz mit Inhalt
{
$row = '"'.$row.'"'."\n";
}
else ## leerer Datensatz
{
$row = "\n";
}
}
return $row;
}
Ich bevorzuge Dateien mit fester Satzlänge und festem Feldaufbau.
Das ermöglicht die volle Wahlfreiheit, vorwärts wie rückwärts
Leider bietet PHP dafür auch keine fertigen Funktionen an. dabei musste es nur endlich die einfache Definition eigener Datenstrukturen einführen. Dann wäöre daw Thema durch.
pack() und unpack() sind da nicht übersichtlich genug.
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau
Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)