kostenloser Webspace werbefrei: lima-city


Textarea wird nicht richtig in CSV geschrieben

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    php-oop

    php-oop hat kostenlosen Webspace.

    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?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. 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 &amp; oder von &auml; 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
  4. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    soboo schrieb:
    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
    Hier kennt jemand das CSV-Format nicht ganz...
    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:
    Feld 1;Feld 2;Feld 3
    "Feld mit ;";"Feld mit ""Anführungszeichen""";Normales Feld
    Feld;"Feld mit
    Zeilenumbruch";Feld
    Öffne diese Datei mal in Excel und schau dir an wie das angezeigt wird.

    soboo schrieb:
    evtl auch anderes Trenner-Zeichen als ; nehmen, eines, das keine Funktion im HTML hat
    sonst wird von &amp; oder von &auml; das ; abgeschnitten, was dann HTML-Fehler ist
    Und wozu sollte das gut sein? Es wird ja beim beschreiben der CSV-Datei nicht htmlentities angewendet!

    soboo schrieb:
    zudem solltest Du nicht $_POST[key] verwenden sondern $_POST['key'];
    bei allen Array Variablen den Key, der String ist, in Anführungszeichen setzen
    Damit hast du recht.

    @php-oop:
    Das Einfachste wird sein, Anführungszeichen im Text durch 2 ersetzen (
    " => ""
    ) und danach alle Werte in Anführungszeichen (") setzen.
  5. Autor dieses Themas

    php-oop

    php-oop hat kostenlosen Webspace.

    Danke für die Antworten!

    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?

    @soboo: Danke! Das klappt wunderbar!

    Beitrag zuletzt geändert: 29.1.2012 11:43:53 von php-oop
  6. 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:
    Wenn ein Wert unter "Anführungszeichen" steht so wird ein Trennzeichen darin ignoriert..
    das ist vollkommen richtig, ABER

    hackyourlife schrieb:
    Gleiches gillt für Zeilenumbrüche. .
    ... das glaube ich nicht .... Zeilenumbruch macht auf jeden Fall Probleme (meiner Ansicht nach)
    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
  7. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    php-oop schrieb:
    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?
    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:
    0xEF 0xBB 0xBF = 


    soboo schrieb:
    hackyourlife schrieb:
    Gleiches gillt für Zeilenumbrüche. .
    ... das glaube ich nicht .... Zeilenumbruch macht auf jeden Fall Probleme (meiner Ansicht nach)
    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
    fgetcsv liest wirklich nur 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:
    Feld 1;Feld 2;Feld 3
    "Feld mit ;";"Feld mit ""Anführungszeichen""";Normales Feld
    Feld;"Feld mit
    Zeilenumbruch";Feld
    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
  8. Autor dieses Themas

    php-oop

    php-oop hat kostenlosen Webspace.

    Danke für die Antworten!
    Nun klappt alles.
  9. 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


  10. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    soboo schrieb:
    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
    Daten lassen sich auch viel einfacher sortieren, löschen, ändern, ... speziell bei vielen Datensätzen ist MySQL sinnvoller.

    Aber php-oop muss sich selbst zwischen CSV und MySQL entscheiden. ;-)
  11. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!