ruben: Mit PHP User-Listen parsen -> Datenbank

Hallo!

"Hier kannst du selbst bestimmen, wie die Ausgabe auszusehen hat.
Je nach Bedarf kannst du mehr oder weniger Informationen einschließen, Reihenfolge und Beschreibung ändern. Folgende Bausteine kannst du benutzen, um dem Parser zu signalisieren, wo was eingefügt werden soll: {Sprache},{Wortfeld},{Bekannt},{Fremd}"
Also {Sprache};{Bekannt}={Fremd} -> français;die Katze≠Kater;la chatte

So mache ich es möglich, Datenbankinformationen in benutzerdefinierten Formaten auszugeben/zu exportieren.

Nun mache ich mir darüber Gedanken, wie ich analog dazu benutzerdefinierte Formate beim Import zulassen kann.
Also, dass beispielsweise der Benutzer beim Import angibt
{Sprache};{Bekannt}={Fremd}
und français;die Katze≠Kater;la chatte damit korrekt in die Datenbank eingelesen wird.

Ich mache mir gerade theoretische Überlegungen dazu, und gucke, ob ich vielleicht eine existente Klasse adaptieren könnte.

Probleme: Separator-Zeichensequenzen escaped zulassen? Neue Zeilen müssen in gewissen Listen vorkommen dürfen, dann muss es aber auch einen zusätzlichen Indikator für das Ende einer "Datenzeile" geben.

Außerdem ist das ganze überhaupt recht schwierig und ich denke, im Endeffekt müsste ich anhand eines Strings wie {Sprache};{Bekannt}={Fremd}eine Reg.Exp generieren, ich weiß nicht mal, ob ich das schaffen würde, da das logische-Anforderungen-mäßig vermutlich übersteigt, was ich sonst so mache.

Des Weiteren weiß ich nicht, inwieweit so eine Funktionalität überhaupt benötigt wird. Für den Ottonormal-Nutzer sollte es ziemlich einfach sein, eine Liste mittels Suchen/Ersetzen in das gewünschte Format zu bringen (allerdings kann er die Reihenfolge nicht so einfach verändern).

Dazu kommt noch die Abwägung, welches Format ich als Default benutzen soll.
Optimal sollte es menschenlesbar sein, optionale Angaben ermöglichen, möglichst wenig Escapen erfordern und New-Lines zulassen.
Bisher habe ich
"Sprache"; "Wortfeld"; "Bekannt"; "Fremd"; "Hinweis"; "Phase"; "Fehler"; "Zeit"; "Entstehung";""
und
Bekannt; Fremd; Hinweis

Das zweite kann man lesen, das erste kann New-Lines und diese ganzen optionalen Daten.

Nun kam ich neulich auf den Trichter, dass man das vielleicht mit Tabellen ganz gut machen könnte.
Beim Kopieren einer Tabelle, macht der Browser nämlich automatisch \t zwischen die Zellen, und \t kommt in Benutzereingeben (über Textareas und Inputs) so gut wie nie vor und kann dann leicht einfach nur ein paar Leerzeichen ersetzt werden.
Dann hätte ich zwar noch keinen Newline-Indikator, aber ich dachte, wenn ich einfach erst alle doppelten Tabs ersetze, dann an den Tabs explode und dann die Anzahl aller Teile durch die Anzahl der Teile pro Zeile teile, dann kommm ich schon dran. Diese Methode hat dann als einzigen Nachteil, dass keine Angaben wegfallen dürfen & ich bin mir unsicher, ob man wirklich zuverlässig Tabellen auswählen/kopieren kann und die \t dazwischen kriegt. Und wenn am Anfang irgendein Feld fehlt, dann verschiebt sich bei meiner Methode ja alles ins Falsche.

Naja, dieser Post dient mir ein bisschen dazu, mir selbst darüber klar zu werden, was ich will, aber wenn jemand eine gute Klasse kennt oder mir Tipps geben kann oder weiß, wo ich mich irre, bzw. Nachteile der \t - Trennung kennt, die mir bisher nicht aufgefallen sind: Bitte schreibt!

Vielen Dank,
Ruben

  1. echo $begrüßung;

    [...] {Sprache},{Wortfeld},{Bekannt},{Fremd}
    Nun mache ich mir darüber Gedanken, wie ich analog dazu benutzerdefinierte Formate beim Import zulassen kann.

    Du möchtest also CSV-Daten lesen. Kein Problem, dafür gibt es die Funktion fgetcsv().

    echo "$verabschiedung $name";

    1. echo $begrüßung;

      [...] {Sprache},{Wortfeld},{Bekannt},{Fremd}
      Nun mache ich mir darüber Gedanken, wie ich analog dazu benutzerdefinierte Formate beim Import zulassen kann.
      Du möchtest also CSV-Daten lesen. Kein Problem, dafür gibt es die Funktion fgetcsv().

      Nein, möchte ich nicht.
      "Einzelne Datensätze werden in der Regel durch einen Zeilenumbruch getrennt."
      Das ist schonmal ein Problem (bei fgetcsv).
      Dieses "Bekannt";"Fremd";...;"" Format, das ich im Moment habe, ist zwar CSV-abgeguckt, aber es hat am Ende dieses ;"" damit ich da die Zeilen spalten kann und in den einzelnen Werten Newlines zulassen kann.
      Außerdem erlaubt fgetcsv nur one-char-enclosures und es wäre auch schon schwierig, aus einem String wie {Bekannt},{Fremd} eine funktionierende fgetcsv-Funktion.
      Es ist allerdings eine Idee, falls ich nichts besseres finde, kannte die Funktion aber schon.

      Was sagst du zu der \t Methode?

      Schöne Grüße & Danke,
      Ruben

      1. Mahlzeit,

        Was sagst du zu der \t Methode?

        Mich hast Du zwar nicht gefragt (*g*), aber ich denke, das Problem liegt in Deiner folgenden Formulierung:

        \t kommt in Benutzereingeben (über Textareas und Inputs) so gut wie nie vor

        Kannst Du wirklich 100%ig und absolut sicher ausschließen, dass die Benutzer Tabulatoren eingeben? Wenn ja (bzw. wenn Du evtl. vorhandene Tabulatoren einfach ausfilterst), kannst Du den natürlich als Trennzeichen nehmen. Wenn nicht, läufst Du Gefahr, Datensalat zu produzieren.

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
        1. Was sagst du zu der \t Methode?
          Mich hast Du zwar nicht gefragt (*g*), aber ich denke, das Problem liegt in Deiner folgenden Formulierung:

          \t kommt in Benutzereingeben (über Textareas und Inputs) so gut wie nie vor
          Kannst Du wirklich 100%ig und absolut sicher ausschließen, dass die Benutzer Tabulatoren eingeben? Wenn ja (bzw. wenn Du evtl. vorhandene Tabulatoren einfach ausfilterst), kannst Du den natürlich als Trennzeichen nehmen. Wenn nicht, läufst Du Gefahr, Datensalat zu produzieren.

          Wie gesagt, wenn es mal vorkommt, kann es ja relativ funktionalitätsverlustlos durch Leerzeichen ersetzt werden.
          Ich frage mich, wie du den zweiten Teil dieses Satzes, der deine Frage doch beantwortet " und kann dann leicht einfach nur ein paar Leerzeichen ersetzt werden." übersehen konntest.
          Naja, schade, ich google halt weiter.

          Gruß,
          Ruben