Textarea wird nicht richtig in CSV geschrieben
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
code
dank
datei
datum
eingabe
entfernen
ersetzen
exportieren
feld
formular
kategorie
machen
problem
setzen
speichern
string
umlaut
url
zeichen
zeile
-
Hallo!
Ich speichere Eingaben aus einem Formular in eine CSV Datei. Dazu erstellt das Formular zuerst einen HTML Code aus den Eingaben in eine Textarea und schreibt diesen dann in die CSV Datei.
Das klappt auch, nur wird der Inhalt der Textarea falsch in die CSV eingefügt (nicht in das dafür vorgesehene Feld).
Zum Speichern benutze ich folgenden Code:
$dz=fopen("daten.csv","a"); if(!$dz) { echo "<div class='warning'>Datei konnte nicht zum Schreiben geöffnet werden.</div>"; exit; } $felder = 'Add;Germany;Auction;' . $_POST[bezeichnung] . ';' . $_POST[condition] . ';;;' . $_POST[kategorie] . ';;1;;EUR;1;;' . $_POST[dauer] . ';0;DE;;;;;' . $_POST[code] . ';RetroStyle;' . $_POST[bildurl] . ';0;0;Gallery;;0;0;0;0;61440;;0;;email;;;;;;;;;;1;;;0;;Flat;;' . $_POST[versandcsv] . ';' . $_POST[versandkosten] . ';;;;;;;0;1;;;;;;;;;;'; fputs($dz,"$felder\n"); echo "<div class='note'>Die Eingaben wurden in der CSV-Datei gespeichert.</div>"; fclose($dz);
Der Inhalt der Textarea wird in ' . $_POST[code] . ' gespeichert.
Zum Testen, wie es aussieht, hab ich hier mal so eine CSV eingefügt: http://davidlohmann.de/daten.csv
Wie schaffe ich es, dass der Inhalt der Textarea in nur einem Feld eingefügt wird (sieht man auch, wenn man die CSV mit Excel öffnet). Alle anderen Eingaben aus dem Formular (Input-Felder) werden problemlos rein geschrieben.
Könnt Ihr mir helfen? -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hallo
da in einer Textarea auch Zeilenumbrüche eingetragen werden
solltest Du diese einfach vor dem Speichern entfernen
$save_code = $_POST['code']; $save_code = str_replace("\r", "", $save_code); $save_code = str_replace("\n", "", $save_code); // --- hier evtl weitere Steuerzeichen und Sonderzeichen entfernen
zudem solltest Du nicht $_POST[key] verwenden sondern $_POST['key'];
bei allen Array Variablen den Key, der String ist, in Anführungszeichen setzen
auch solltest Du aus jeder Eingabe das Trenner-Zeichen ersetzen
wenn im Code ein ; vorkommt, dann springt CSV je eine Spalte weiter
evtl auch anderes Trenner-Zeichen als ; nehmen, eines, das keine Funktion im HTML hat
sonst wird von & oder von ä das ; abgeschnitten, was dann HTML-Fehler ist
z.B. Pipe | als Trenner .... und nicht in excel öffnen sondern in z.B. notepad++ editor
$trenner = '|'; // -------- Trenner durch Unterstrich _ ersetzen $save_code = str_replace($trenner, "_", $save_code); $felder = ''; // ---- Leer-String ... in folgenden Zeilen Felder anfuegen $felder .= 'Add'.$trenner; $felder .= 'Germany'.$trenner; $felder .= 'Auction'.$trenner; $felder .= '....'.$trenner; // usw.
Beitrag zuletzt geändert: 29.1.2012 10:29:14 von soboo -
soboo schrieb:
Hier kennt jemand das CSV-Format nicht ganz...
da in einer Textarea auch Zeilenumbrüche eingetragen werden
solltest Du diese einfach vor dem Speichern entfernen
...
auch solltest Du aus jeder Eingabe das Trenner-Zeichen ersetzen
wenn im Code ein ; vorkommt, dann springt CSV je eine Spalte weiter
Wenn ein Wert unter "Anführungszeichen" steht so wird ein Trennzeichen darin ignoriert. Gleiches gillt für Zeilenumbrüche. Wenn ein Anführungszeichen in einer Zelle vorkommen soll so muss "Text mit ""Anführungszeichen""" geschrieben werden: "" wird als " dargestellt.
In einer CSV-Datei kurz alle Möglichkeiten zusammengefasst:
Öffne diese Datei mal in Excel und schau dir an wie das angezeigt wird.Feld 1;Feld 2;Feld 3 "Feld mit ;";"Feld mit ""Anführungszeichen""";Normales Feld Feld;"Feld mit Zeilenumbruch";Feld
soboo schrieb:
Und wozu sollte das gut sein? Es wird ja beim beschreiben der CSV-Datei nicht htmlentities angewendet!
evtl auch anderes Trenner-Zeichen als ; nehmen, eines, das keine Funktion im HTML hat
sonst wird von & oder von ä das ; abgeschnitten, was dann HTML-Fehler ist
soboo schrieb:
Damit hast du recht.
zudem solltest Du nicht $_POST[key] verwenden sondern $_POST['key'];
bei allen Array Variablen den Key, der String ist, in Anführungszeichen setzen
@php-oop:
Das Einfachste wird sein, Anführungszeichen im Text durch 2 ersetzen (
) und danach alle Werte in Anführungszeichen (") setzen." => ""
-
php-oop schrieb:
.
Wie kann ich die Umlaute auch in die CSV schreiben?.
Wenn Die Eingabe als UTF-8 ankommt, und Du aber ISO willst
dann vor dem Speichern die Eingabe decodieren
if(mb_check_encoding($save_code, 'UTF-8') === TRUE) { $save_code = utf8_decode($save_code); }
oder (besser) DU lässt es UTF-8 und machst bei der Ausgabe dann auch UTF-8 codierung
header("Content-Type: text/html; charset=utf-8");
die Spalten in Anführungszeichen einschließen ist natürlich auch eine (die bessere) Möglichkeit
hackyourlife schrieb:
das ist vollkommen richtig, ABER
Wenn ein Wert unter "Anführungszeichen" steht so wird ein Trennzeichen darin ignoriert..
hackyourlife schrieb:
... das glaube ich nicht .... Zeilenumbruch macht auf jeden Fall Probleme (meiner Ansicht nach)
Gleiches gillt für Zeilenumbrüche. .
weil beim Auslesen mit fgetcsv() wird ja Zeilenweise ausgelesen
hackyourlife schrieb:
Es wird ja beim beschreiben der CSV-Datei nicht htmlentities angewendet!
... naja, aber ein ; kömmt schonmal vor, wenn komplette HTML Webseite eingetragen wird
es könnte ja auch Javascript enthalten oder der Code mit Entities eingetragen werden
wenn er von woanders per Copy+Paste übernommen wird
In dem Beispiel waren ja die Felder nicht mit " enclosure,
da würde es schon Sinn machen den Trenner raus zu filtern
aber wenn man es mit " enclosure macht, dann sollte das egal sein.
bzw. zur Sicherheit könnte man evtl. noch gemeinsames Vorkommen von enclosure und Trenner filtern
also ";" und ": und ;"
denn bei User-Eingabe weiss man ja nie, was übergeben wird ^^
$felder = ''; // ---- Leer-String ... in folgenden Zeilen Felder anfuegen $felder .= '"Add"'.$trenner; $felder .= '"Germany"'.$trenner; $felder .= '"Auction"'.$trenner; $felder .= '"'.$save_code.'"'.$trenner; // usw.
ich würde aber auf jeden Fall Zeilenumbrüche entfernen,
geht ja auch im fertigen $felder String
$felder = str_replace("\r", "", $felder); $felder = str_replace("\n", "", $felder);
denn ich bin immernoch fest der Meinung,
dass Zeilenumbruch in CSV als neuer Datensatz gilt
... vielleicht kann excel damit umgehen, aber PHP: fgetcsv liest immer genau eine Zeile
Beitrag zuletzt geändert: 29.1.2012 12:16:04 von soboo -
php-oop schrieb:
Liegt womögich an der Zeichencodierung (UTF-8?). Wenn das so ist musst du dem Excel mitteilen dass es sich um UTF-8 handelt. Dies erreichst du indem ganz am Anfang der Datei ein UTF-8-Marker(?) steht:
Ich habe noch ein Problem.
Wenn ich im Formular Umlaute eingebe, werden diese nicht richtig angezeigt.
Wie kann ich die Umlaute auch in die CSV schreiben?0xEF 0xBB 0xBF = 
soboo schrieb:
fgetcsv liest wirklich nur eine Zeile.
hackyourlife schrieb:
... das glaube ich nicht .... Zeilenumbruch macht auf jeden Fall Probleme (meiner Ansicht nach)
Gleiches gillt für Zeilenumbrüche. .
weil beim Auslesen mit fgetcsv() wird ja Zeilenweise ausgelesen
...
denn ich bin immernoch fest der Meinung,
dass Zeilenumbruch in CSV als neuer Datensatz gilt
... vielleicht kann excel damit umgehen, aber PHP: fgetcsv liest immer genau eine Zeile
EXCEL: Wenn du es nicht glaubst: kopier dir diese Datei und öffne sie mit Excel. Danach musst du zwar die Zeilenhöhe anpassen, weil das Excel nicht automatisch macht, aber Zeilenumbrüche funktionieren!hackyourlife schrieb:
ABER: wenn du eine CSV-Datei erstellst glaub ich nicht dass du das MySQL vorziehst nur weil du dann sowieso wieder mit PHP die CSV-Datei ausliest
Feld 1;Feld 2;Feld 3 "Feld mit ;";"Feld mit ""Anführungszeichen""";Normales Feld Feld;"Feld mit Zeilenumbruch";Feld
-
Danke für die Antworten!
Nun klappt alles. -
die Idee finde ich eigentlichganz gut, zuerst in MySQL speichern,
und damit kann man dann eine CSV in verschiedenen Varianten exportieren, z.B. UTF-8 oder ISO
auch kann man beim Speichern in MySQL "einfacher" doppelte Einträge abfangen
und man hat die Daten, um sie in verschiedene Formate zu exportieren (z.B. CSV, XML, JSON)
bei CSV schleichen sich schneller "Fehler" ein, welche die Struktur zerschießen können,
aus MySQL kann man dann auch nur Teil-Daten als Export (CSV, etc) ausliefern,
z.B. nur die Datensätze aus einer Kategorie ... oder mit Sortierung nach .... etc.
also ich würde es so machen, in MySQL speichern
und von dort aus Exportieren je nach Kriterium
-
soboo schrieb:
Daten lassen sich auch viel einfacher sortieren, löschen, ändern, ... speziell bei vielen Datensätzen ist MySQL sinnvoller.
die Idee finde ich eigentlichganz gut, zuerst in MySQL speichern,
und damit kann man dann eine CSV in verschiedenen Varianten exportieren, z.B. UTF-8 oder ISO
auch kann man beim Speichern in MySQL "einfacher" doppelte Einträge abfangen
und man hat die Daten, um sie in verschiedene Formate zu exportieren (z.B. CSV, XML, JSON)
bei CSV schleichen sich schneller "Fehler" ein, welche die Struktur zerschießen können,
aus MySQL kann man dann auch nur Teil-Daten als Export (CSV, etc) ausliefern,
z.B. nur die Datensätze aus einer Kategorie ... oder mit Sortierung nach .... etc.
also ich würde es so machen, in MySQL speichern
und von dort aus Exportieren je nach Kriterium
Aber php-oop muss sich selbst zwischen CSV und MySQL entscheiden. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage