Christian Seiler: Was kann man alles wie validieren?

Hallo Forum,

ich stoße bei PHP-Seiten immer auf das Problem, dass ich Benutzereingaben validieren muss. Ich möchte es jetzt endlich mal richtig[tm] machen, indem ich all diese Funktionen in eine einzige Klasse packe. (bisher hab' ich mir bei jedem Projekt mehr oder weniger immer etwas neues zusammengebastelt) Ich werde diese Klasse dann unter die (L)GPL-Lizenz stellen, sofern mir hier niemand einen triftigen Grund nennt, dies nicht zu tun. ;-)

Als erstes habe ich ein kleines Problem: Ich würde am liebsten \w und \W in den regulären Ausdrücken verwenden, aber die Funktionieren im C-Locale nur mit den Zeichen A-Z (bzw. a-z). setlocale möchte ich nicht verwenden, da das (a) nicht thread-safe ist und (b) hab' ich das unter Windows noch nicht zum laufen gebracht. (und unter Linux noch nicht probiert, nachdem ich so enttäuscht war) Gibt es da eine andere Möglichkeit, als Zeichen hardzucoden? Wie sieht das überhaupt mit anderen Zeichensätzen aus? Ich arbeite bisher nur mit Latin1, aber wie behandle ich prinzipiell z.B. russische oder japanische Zeichensätze? (nicht nur in meinen regulären ausdrücken)

Dann stellt sich die Frage, was meine Klasse alles validieren können soll.

Am Einfachsten geht das mit Emailadressen, da nehme ich mir einfach den Feature-Artikel vor: http://aktuell.de.selfhtml.org/tippstricks/programmiertechnik/email/ Bei Emailadressen werde ich aber nur die Syntax überprüfen, das ganze DNS/SMTP-Zeug ist IMHO schwachsinn. (wenn man sich auf die Existenz verlassen muss, dann schickt man halt eine Email mit einem eindeutigen Link)

Danach gibt's noch URIs, die kann ich mit dem Moster von regulärem Ausdruck aus dem Archiv abdecken. ;-)

Bei Zahlen und Datum habe ich mir überlegt, dass die jew. Methode der Klasse gleich eine für PHP verwertbare Zahl bzw. einen Timestamp zurückliefert.

Dann fängt es an, schwierig zu werden:

* Telefonnummern: Aus welchen Zeichen dürfen Telefonnummern bestehen? Reichen Ziffern, Leerzeichen, runde Klammern, / und am Anfang evtl. ein + aus? Oder ist das zu locker?

* Zahlen: Welche Formen gibt es, Zahlen anzugeben? (die im Internet auch verwendet wird) Ich kenne 0.000,00 sowie 0 000,00 sowie 0,000.00 sowie 0 000.00 sowie 0000,00 sowie 0000.00. Gibt es auch andere Möglichkeiten? Wird das Tausendertrennzeichen immer verwendet, um die Zahl in Dreiergruppen aufzuteilen, oder kann es sein, dass der nur zwischen der dritten und vierten Stelle (von Rechts nach dem Dezimaltrennzeichen) verwendet wird, und nicht zwischen der sechsten und ziebten Stelle?

* Datum: Mit strtotime() möchte ich auch ungern arbeiten, gerade wegen setlocale. Welche Möglichkeiten gibt es, ein Datum einzugeben? Sollte ich da sehr großzügig sein, und vieles erlauben, oder sollte ich das dem Script, das die Klasse verwendet, überlassen. (dass es halt das erwartete Format übergibt) Desweiteren: ich würde gerne Zeitzonen und Sommer- und Winterzeit berücksichtigen (können), daher kommen für mich die lokalisierten Datums- und Zeitfunktionen von PHP nicht in Frage, da der Server selbst ja in sehr verschiedenen Zeitzonen arbeiten kann. (je nachdem, wie er konfiguriert ist) Im Prinzip müsste ich für die ganze lokalisierung (wegen Sonderzeichen, Zeitzonen, Zahlenformate) ja eine eigene Abstraktionsebene einführen, oder?

* Namen: Was darf alles in einem Namen (Eigennamen) enthalten sein? (jetzt mal eine saublöde Frage, ich weiß, aber immer wenn ich meinen regulären Ausdruck basteln will, dann weiß ich nicht so recht weiter)

* Postleitzahlen: Wie sieht das mit Postleitzahlen in anderen Ländern aus? In England hat man ja AFAIK auch Buchstaben in Postleitzahlen. Welche Möglichkeiten hat man da zur Validierung? Gibt es irgendwo (zumindest für Deutschland) eine Liste aller Postleitzahlen? So dass ich für Deutschland alle Postleitzahlen direkt überprüfen könnte und für alle anderen Länder nur die Syntax?

* Tja - und jetzt seid Ihr auch gefragt: Was kann man denn alles noch so validieren? Welche Möglichkeiten von Eingabe gibt es noch?

Wäre für Anregungen dankbar!

Grüße,

Christian

  1. Hallo Christian,

    bei Telefonnummern fällt mir "Vanity" ein. Da sind dann schon wieder Buchstaben drin.

    Du solltest Deine Validierungen vom Gültigkeitsbereich abhängig machen, also unterschiedliche Methoden für die verschiedenen Länder hinterlegen.

    Außerdem solltest Du die Methoden mit einem Parameter steuerbar machen: Absolute Überprüfung, tolereante Überprüfung (es dürfen Teile fehlen), tolerante Überprüfung mit Richtigstellung, usw.

    Beim Datum könnten das zum Beispiel Eigaben der folgenden Form sein:

    08,02,1958
    08-02-1958
    080258
    08021958

    usw.

    Wenn Du schon mal hunderte von Daten eintippen musstest, dann ist dir die Form mit dem Komma sehr angenehm. Die Idioten bei den Tastaturherstellern haben es zwar inzwischen geschafft "Windows-Tasten" einzubauen, aber einen Punkt im Ziffernblock haben sie ja bis heute nicht geschafft.

    Schau Dir einfach mal MS-Access und MS-Excel an, was es dort für Formate gibt. Einige sind ganz praktisch.

    Autonummern, ISBN, Sozialversicherugnsnummer, ...

    Bin gespannt, was du aus der Klasse machst.

    Grüße

    Tom

    1. Hallo Thomas,

      bei Telefonnummern fällt mir "Vanity" ein. Da sind dann schon wieder Buchstaben drin.

      Ich stehe jetzt irgendwie auf dem Schlauch...

      Du solltest Deine Validierungen vom Gültigkeitsbereich abhängig machen, also unterschiedliche Methoden für die verschiedenen Länder hinterlegen.

      Ja - das wird wohl die einzige Möglichkeit sein. Also eine Abstraktionsebene für die Lokalisierung.

      Außerdem solltest Du die Methoden mit einem Parameter steuerbar machen: Absolute Überprüfung, tolereante Überprüfung (es dürfen Teile fehlen), tolerante Überprüfung mit Richtigstellung, usw.

      Gute Idee - werde das realisieren.

      Beim Datum könnten das zum Beispiel Eigaben der folgenden Form sein:

      08,02,1958
      08-02-1958
      080258
      08021958

      usw.

      Weia! Und ich dachte, es wäre schon kompliziert zu unterscheiden, ob man jetzt mit 03/02/2002 den dritten Februar (britisch) oder den zweiten März (amerikanisch) meint...

      Wenn Du schon mal hunderte von Daten eintippen musstest, dann ist dir die Form mit dem Komma sehr angenehm. Die Idioten bei den Tastaturherstellern haben es zwar inzwischen geschafft "Windows-Tasten" einzubauen, aber einen Punkt im Ziffernblock haben sie ja bis heute nicht geschafft.

      Das beweist, dass die Tastaturhersteller ihre Tastaturen warscheinlich nie selbst verwenden. :-)

      Schau Dir einfach mal MS-Access und MS-Excel an, was es dort für Formate gibt. Einige sind ganz praktisch.

      Hab' aber ein Problem: Habe ich alles nicht. :-(

      Autonummern,

      Du meinst Kennzeichen? Tja, soweit ich weiß, gibt es keinen einheitlichen Standard, wie die aussehen sollten. Jedes Land ist anders. Da muss ich wohl im Internet einiges suchen...

      ISBN,

      Gute Idee, danke.

      Vielen Dank erstmal,

      Christian

      1. Hallo,

        'Vanity' ist die Möglichkeit die Ziffern durch Buchstaben zu ersetzen. Jede Ziffer steht für drei verschiedene Buchstaben, die auf den Telefontastaturen mit draufstehen.  Weil man sich ein Wort besser merken kann als eine Zahlenkombination, in  Deutschland noch nicht so verbreitet.

        Gruß,
        Henning

      2. Hallo Christian,

        bei Telefonnummern fällt mir "Vanity" ein. Da sind dann schon wieder Buchstaben drin.

        Ich stehe jetzt irgendwie auf dem Schlauch...

        "Eitelkeitsnummen" z.B. 0700bitworks (hab ich allerdings nicht angemeldet, weil ich es Quatsch finde, gibts aber häufig).

        Außerdem solltest Du die Methoden mit einem Parameter steuerbar machen: Absolute Überprüfung, tolereante Überprüfung (es dürfen Teile fehlen), tolerante Überprüfung mit Richtigstellung, usw.

        Gute Idee - werde das realisieren.

        Beim Datum könnten das zum Beispiel Eigaben der folgenden Form sein:

        08,02,1958
        08-02-1958
        080258
        08021958

        usw.

        Weia! Und ich dachte, es wäre schon kompliziert zu unterscheiden, ob man jetzt mit 03/02/2002 den dritten Februar (britisch) oder den zweiten März (amerikanisch) meint...

        Ob amerikanisch oder deutsch oder britisch oder ISO oder "üblich", das solltest Du über die Ländereinstellung vorgeben. Nur die Richtigstelllung , ob 8-stellig, 10-stellig, mit Uhrzeit oder ohne, mit Punkt, Schrägstrich, Komma oder ohne, das solltest Du berücksichtigen. Wenn Du als Ziel immer die Erleichterung für den Nutzer und nicht die Bevormundung im Auge behältst, dann wird es eine gute Sache.

        Schau Dir einfach mal MS-Access und MS-Excel an, was es dort für Formate gibt. Einige sind ganz praktisch.

        Hab' aber ein Problem: Habe ich alles nicht. :-(

        Wird ja einen geben, der das hat. Bei Staroffice gibt es ähnliche Formatvorgaben.

        Autonummern,

        Du meinst Kennzeichen? Tja, soweit ich weiß, gibt es keinen einheitlichen Standard, wie die aussehen sollten. Jedes Land ist anders. Da muss ich wohl im Internet einiges suchen...

        Ja, über die Länderkennung kann man das dann ja auch steuern.

        Die eingestellte Sprache sendet der Browser ja mit. http://forum.de.selfhtml.org/?m=147474&t=27056

        Ich könnte von Dir noch ein paar gute Tipps gebrauchen, ob oder ob nicht PHP und OOP und wie ich da am besten anfange.

        Ich suche Dir bezüglich Validierung von Eingaben noch mal was raus. Habe da vor Jahren mal eine Bibliothek für die Eingabe in der DOS-Oberfläche geschreieben. Die aufgabenstellung war mehr oder weniger die gleiche.

        Grüße

        Tom

        1. Hallo Thomas, Hallo Henning,

          bei Telefonnummern fällt mir "Vanity" ein. Da sind dann schon wieder Buchstaben drin.

          Ich stehe jetzt irgendwie auf dem Schlauch...

          "Eitelkeitsnummen" z.B. 0700bitworks (hab ich allerdings nicht angemeldet, weil ich es Quatsch finde, gibts aber häufig).

          Ach so, der Quatsch. Naja - das werde ich jetzt mal nicht unterstützen (wenn's jemand braucht kann er es selbst gerne hinzufügen - ist ja OpenSource)

          Wenn Du als Ziel immer die Erleichterung für den Nutzer und nicht die Bevormundung im Auge behältst, dann wird es eine gute Sache.

          Ich bin der letzte, der einen Benutzer bevormunden. ;-)

          Die eingestellte Sprache sendet der Browser ja mit. http://forum.de.selfhtml.org/?m=147474&t=27056

          Da hab' ich sogar schon mal eine Funktion geschrieben, die das Feld HTTP-Konform parsed. Aber die Sprache selbst nützt mir ja wenig, jemand in Deutschland kann ja auch Englisch sprechen (wollen) - von daher muss ich mir was anderes überlegen. (warscheinlich muss der User es am Ende selbst angeben, denn über die IP ist Quatsch)

          Ich könnte von Dir noch ein paar gute Tipps gebrauchen, ob oder ob nicht PHP und OOP und wie ich da am besten anfange.

          Naja - PHP verwendest Du am besten für Webanwendungen - Du kannst zwar auch graphische Oberflächen mit PHP machen (sic!) aber das ist IMHO nur eine nette Spielerei. OOP eignet sich immer dann gut, wenn etwas sehr leicht wiederverwendbar sein soll (und schon etwas komplexer ist als dass man es in eine Funktion packen könnte)

          Ich suche Dir bezüglich Validierung von Eingaben noch mal was raus. Habe da vor Jahren mal eine Bibliothek für die Eingabe in der DOS-Oberfläche geschreieben. Die aufgabenstellung war mehr oder weniger die gleiche.

          Danke - so etwas könnte ich gebrauchen. Welche Sprache?

          Grüße,

          Christian

  2. Hallo Forum,

    Am Einfachsten geht das mit Emailadressen, da nehme ich mir einfach den Feature-Artikel vor: http://aktuell.de.selfhtml.org/tippstricks/programmiertechnik/email/ Bei Emailadressen werde ich aber nur die Syntax überprüfen, das ganze DNS/SMTP-Zeug ist IMHO schwachsinn. (wenn man sich auf die Existenz verlassen muss, dann schickt man halt eine Email mit einem eindeutigen Link)

    Daß dort falsches steht, ist Dir aber klar? Dort werden für die tld nur 5 Zeichen zugelassen (.museum hat aber 6)...

    Danach gibt's noch URIs, die kann ich mit dem Moster von regulärem Ausdruck aus dem Archiv abdecken. ;-)

    Hast Du das mehrseitige Monster gesehen? (http://www.w3.org/TR/REC-CSS2/syndata.html#uri)

    * Telefonnummern: Aus welchen Zeichen dürfen Telefonnummern bestehen? Reichen Ziffern, Leerzeichen, runde Klammern, / und am Anfang evtl. ein + aus? Oder ist das zu locker?

    • für die anschlußinterne Nummer (Durchwahl)

    * Zahlen: Welche Formen gibt es, Zahlen anzugeben? (die im Internet auch verwendet wird) Ich kenne 0.000,00 sowie 0 000,00 sowie 0,000.00 sowie 0 000.00 sowie 0000,00 sowie 0000.00. Gibt es auch andere Möglichkeiten? Wird das Tausendertrennzeichen immer verwendet, um die Zahl in Dreiergruppen aufzuteilen, oder kann es sein, dass der nur zwischen der dritten und vierten Stelle (von Rechts nach dem Dezimaltrennzeichen) verwendet wird, und nicht zwischen der sechsten und ziebten Stelle?

    1.23e34
    -1.23e-45

    * Namen: Was darf alles in einem Namen (Eigennamen) enthalten sein? (jetzt mal eine saublöde Frage, ich weiß, aber immer wenn ich meinen regulären Ausdruck basteln will, dann weiß ich nicht so recht weiter)

    Sämtliche chinesischen, thailändischen, koreanischen, russischen, griechischen, dänischen, usw. 'Alphabet'-Bestandteile...
    Leerzeichen, Bindestriche, Schrägstriche, Klammern, ...

    * Postleitzahlen: Wie sieht das mit Postleitzahlen in anderen Ländern aus? In England hat man ja AFAIK auch Buchstaben in Postleitzahlen. Welche Möglichkeiten hat man da zur Validierung? Gibt es irgendwo (zumindest für Deutschland) eine Liste aller Postleitzahlen? So dass ich für Deutschland alle Postleitzahlen direkt überprüfen könnte und für alle anderen Länder nur die Syntax?

    Zur Syntax die Post der einzelnen Länder befragen:
    Österreich z.B.: 4 Ziffern
    USA 2 Buchstaben für den Staat, 5 Ziffern
    usw.

    Andreas

    1. Hallo Andreas,

      Daß dort falsches steht, ist Dir aber klar? Dort werden für die tld nur 5 Zeichen zugelassen (.museum hat aber 6)...

      Naja - den regulären Ausdruck abzuändern dürfte ein Kinderspiel sein.

      Hast Du das mehrseitige Monster gesehen? (http://www.w3.org/TR/REC-CSS2/syndata.html#uri)

      Verstehe jetzt nicht ganz, worauf Du hinauswillst - das hat doch nichts mit regulären Ausdrücken zu tun, oder?

      • für die anschlußinterne Nummer (Durchwahl)

      Du meinst, dass man eine 0 vorwählen muss? Aber das ist doch eine Ziffer.

      1.23e34
      -1.23e-45

      OK. Das kommt auch noch rein.

      Sämtliche chinesischen, thailändischen, koreanischen, russischen, griechischen, dänischen, usw. 'Alphabet'-Bestandteile...

      Tja - das ist ja gerade eines meiner Probleme: die Behandlung von Zeichensätzen. Kennt da jemand einen Link?

      Leerzeichen, Bindestriche, Schrägstriche, Klammern, ...

      Schrägstriche?

      Zur Syntax die Post der einzelnen Länder befragen:
      Österreich z.B.: 4 Ziffern
      USA 2 Buchstaben für den Staat, 5 Ziffern
      usw.

      Danke schon mal.

      Grüße,

      Christian

      1. Hi Christian,

        Tja - das ist ja gerade eines meiner Probleme: die Behandlung von Zeichensätzen. Kennt da jemand einen Link?

        http://der-schwarze-thomas.bei.t-online.de/zeichensatz.html#194

        Ob's was nützt, weiß ich nicht. Aber schau mal rein.

        Grüße

        Tom

        1. Hallo Thomas,

          http://der-schwarze-thomas.bei.t-online.de/zeichensatz.html#194

          Ob's was nützt, weiß ich nicht. Aber schau mal rein.

          Ist mir sicher auf jeden Fall eine Hilfe, sobald ich die Zeichen dann hardcoden werde, aber mein Problem ist ja folgendes:

          Ich schicke mein Dokument mit ISO-8859-1 an den Browser. Der müsste es mir ja auch in ISO-8859-1 zurückschicken, oder? Und wenn da jetzt z.B. kyrillische Zeichen vorkommen, wie werden die da kodiert? Oder gar japanische oder chinesische? Oder denke ich da viel zu kompliziert?

          Grüße,

          Christian

  3. Hallo,

    ich stoße bei PHP-Seiten immer auf das Problem, dass ich Benutzereingaben validieren muss. Ich möchte es jetzt endlich mal richtig[tm] machen, indem ich all diese Funktionen in eine einzige Klasse packe. (bisher hab' ich mir bei jedem Projekt mehr oder weniger immer etwas neues zusammengebastelt) Ich werde diese Klasse dann unter die (L)GPL-Lizenz stellen, sofern mir hier niemand einen triftigen Grund nennt, dies nicht zu tun. ;-)

    PHP ist seit der Version 4 _nicht_ mehr GPL!
    Zu empfehlen ist also die Variante LGPL, um jedwedem Ärger von Vornherein aus dem Wege zu gehen.
    Jedoch könnte es trotzdem Äger geben, wenn Du Funktionen speziell aus PHP4 nimmst, würde ich bei denen aus PHP3 belassen (wird weiterentwickelt). Da Du eh nur Regexe brauchst ("nur" ist gut ;-) sollte das keine allzugroßen Schwierigkeiten darstellen
    Ich bin mir aber noch nicht einmal sicher, ob das überhaupt nötig ist, ich glaube nämlich: nicht. Würde aber trotzdem mal durch die PHP4-Lizenz gehen.

    Dann stellt sich die Frage, was meine Klasse alles validieren können soll.

    Na, _da_ hast Du Dir aber etwas vorgenommen!
    Aber löblich, _sehr_ löblich!

    so short

    Christoph Zurnieden

    1. Hallo Christoph,

      PHP ist seit der Version 4 _nicht_ mehr GPL!

      Ja - aber dafür mehr in Richtung Apache-License. Bis auf den Disclaimer und die Verwendung des Namens PHP sind folgende Stellen interessant:

      ----------------------------------------------------
      Redistribution and use in source and binary forms, with or without
      modification, is permitted provided that the following conditions
      are met:

      1. Redistributions of source code must retain the above copyright
           notice, this list of conditions and the following disclaimer.

      2. Redistributions in binary form must reproduce the above copyright
           notice, this list of conditions and the following disclaimer in
           the documentation and/or other materials provided with the
           distribution.
      ----------------------------------------------------
      (http://www.php.net/license/3_0.txt - zu beachten ist, dass die Lizenz die Version 3.0 trägt und nicht PHP selbst)

      IMHO ist das mit der GPL verträglich und erlaubt eine Relizenzierung unter der GPL, ergo dürfte ich sogar GPL-Software damit verlinken, was ich nicht einmal tue, da das schreiben von Scripten der normale Gebrauch von PHP ist, genauso wie das kompilieren von Programmen der normale Gebrauch vom GCC ist.

      Zu empfehlen ist also die Variante LGPL, um jedwedem Ärger von Vornherein aus dem Wege zu gehen.

      Ja - ich werd's mir überlegen. Dann könnten auch die Schergen von meiner Arbeit profitieren. ;-)

      Ich bin mir aber noch nicht einmal sicher, ob das überhaupt nötig ist, ich glaube nämlich: nicht. Würde aber trotzdem mal durch die PHP4-Lizenz gehen.

      s.o.

      Dann stellt sich die Frage, was meine Klasse alles validieren können soll.

      Na, _da_ hast Du Dir aber etwas vorgenommen!

      Ich weiß, ich weiß...

      Aber löblich, _sehr_ löblich!

      Tja - ich wollte es halt ein für allemal richtig[tm] machen, denn dann können auch die Newbies nicht mehr so meckern "Validierung ist aber eine viel zu aufwendige Sache".

      Grüße,

      Christian

      1. Hallo,

        PHP ist seit der Version 4 _nicht_ mehr GPL!

        Ja - aber dafür mehr in Richtung Apache-License. Bis auf den Disclaimer und die Verwendung des Namens PHP sind folgende Stellen interessant:

        (Auch die Apache Lizenz ist nicht so ganz ...)

        [...]

        (http://www.php.net/license/3_0.txt - zu beachten ist, dass die Lizenz die Version 3.0 trägt und nicht PHP selbst)

        Mit Diesem Stichwort bin ich an die Quelle gegangen:
        http://www.gnu.org/licenses/license-list.html#TOCGPLIncompatibleLicenses
        Hätte ich auch gleich draufkommen können ;-)

        Ist also nicht ganz koscher, nimm lieber gleich die PHP4 Lizenz (also Lizenzversion 3), wenn es Dir nichts ausmacht.

        Ja, ich weiß, solche Beckmesserei scheint müßig, aber ich habe da schlechte Erfahrungen und möchte nicht, das anderer Leute Arbeit auf ähnlichen Wegen verschwindet.

        IMHO ist das mit der GPL verträglich und erlaubt eine Relizenzierung unter der GPL,

        Nein, leider nicht, siehe oben.

        ergo dürfte ich sogar GPL-Software damit verlinken, was ich nicht einmal tue, da das schreiben von Scripten der normale Gebrauch von PHP ist, genauso wie das kompilieren von Programmen der normale Gebrauch vom GCC ist.

        Das ist bei Interpretersprachen etwas anders, wenn Du einige Spezialfunktionen von denen nimmst.

        Wie gesagt: wenn es Dich nicht stört, nimm die PHP4 Lizenz.

        Aber löblich, _sehr_ löblich!

        Tja - ich wollte es halt ein für allemal richtig[tm] machen, denn dann können auch die Newbies nicht mehr so meckern "Validierung ist aber eine viel zu aufwendige Sache".

        Dann mach aber auch die Benutzung einfach, sonst quengeln die schon wieder ;-)

        so short

        Christoph Zurnieden

        1. Hallo Christoph,

          Mit Diesem Stichwort bin ich an die Quelle gegangen:
          http://www.gnu.org/licenses/license-list.html#TOCGPLIncompatibleLicenses
          Hätte ich auch gleich draufkommen können ;-)

          Waah! Langsam kann ich Bio verstehen. Hmmm, ich überlege mir da mal was...

          Ja, ich weiß, solche Beckmesserei scheint müßig, aber ich habe da schlechte Erfahrungen und möchte nicht, das anderer Leute Arbeit auf ähnlichen Wegen verschwindet.

          Ich bin Dir dankbar, dass Du mich auf so etwas hinweist.

          Dann mach aber auch die Benutzung einfach, sonst quengeln die schon wieder ;-)

          Wenn man es wirklich richtig macht, dann wird es aber leider auch nicht einfach. :-( Aber wie das ganze Konzept jetzt exakt aussehen soll, überlege ich mir dann noch - schließlich brauche ich jetzt erst einmal Anforderungen an meine Klasse.

          Ich habe übrigens etwas mit so Zeichensätzen experimentiert. Folgendes Problem: Wenn der Zeichensatz, der mit der Seite mit dem Formular mitgeliefert wird, iso-8859-15 ist, dann wird das Euro-Zeichen, das vom Browser an die Verarbeitungsseite geschickt wird, korrekt kodiert (Dezimal 164) Wenn der Zeichensatz ein anderer ohne Euro-Unterstützung ist, dann liefert mir zumindest der Mozilla (andere Browser (noch) nicht getestet) eine HTML-Entity (€) die ja auch korrekt ist. Wenn der Zeichensatz jedoch iso-8859-1 ist und man die Microsoft-Schriftarten verwendet (auch unter Linux) dann wird das Zeichen mit der Nummer 128 geschickt, welches ja eigentlich verboten ist. (ich kenne die Geschichte mit Microsoft und dem €-Zeichen)

          Folglich bekomme ich entweder

          * das Zeichen als "normales" Zeichen geliefert, sofern es im aktuellen Zeichensatz enthalten ist (Eurozeichenausnahmen ausgenommen)
           * das Zeichen als HTML-Entity geliefert, sofern es nicht im aktuellen Zeichensatz enthalten ist

          Wenn ich jetzt aber & eingebe, dann kodiert der Browser das *nicht* als & sondern lässt es nicht kodiert.

          Die Funktion htmlspecialchars verhält desweiteren nicht ganz korrekt, dass sie das &-Zeichen nur dann maskiert, wenn es vor einer weiteren Entity steht. Wenn ich aber z.B. € in ein Textfeld eingebe und das dann abschicke und dann htmlspecialchars drüber laufen lasse, dann wird das €-Zeichen als € dargestellt.

          verwirrte Grüße,

          Christian

          1. Hallo,

            Ja, ich weiß, solche Beckmesserei scheint müßig, aber ich habe da schlechte Erfahrungen und möchte nicht, das anderer Leute Arbeit auf ähnlichen Wegen verschwindet.

            Ich bin Dir dankbar, dass Du mich auf so etwas hinweist.

            Du hattest gefragt.
            Wenn auch nicht gerade in der Erwartung tatsächlicher Schwierigkeiten ;-)

            Dann mach aber auch die Benutzung einfach, sonst quengeln die schon wieder ;-)

            Wenn man es wirklich richtig macht, dann wird es aber leider auch nicht einfach. :-( Aber wie das ganze Konzept jetzt exakt aussehen soll, überlege ich mir dann noch - schließlich brauche ich jetzt erst einmal Anforderungen an meine Klasse.

            Warum kann das nicht einfach werden?

            CS_validate_mailaddresssyntax(const char *)
            Returns 1 on success or 0 on faillure respectivly.

            Reicht doch, oder?

            Ich habe übrigens etwas mit so Zeichensätzen experimentiert.

            Auha.

            Folgendes Problem: Wenn der Zeichensatz, der mit der Seite mit dem Formular mitgeliefert wird, iso-8859-15 ist, dann wird das Euro-Zeichen, das vom Browser an die Verarbeitungsseite geschickt wird, korrekt kodiert (Dezimal 164) Wenn der Zeichensatz ein anderer ohne Euro-Unterstützung ist, dann liefert mir zumindest der Mozilla (andere Browser (noch) nicht getestet) eine HTML-Entity (€) die ja auch korrekt ist. Wenn der Zeichensatz jedoch iso-8859-1 ist und man die Microsoft-Schriftarten verwendet (auch unter Linux) dann wird das Zeichen mit der Nummer 128 geschickt, welches ja eigentlich verboten ist. (ich kenne die Geschichte mit Microsoft und dem ?-Zeichen)

            Es gbt keine Serverseitige Lösung für dieses Problem, da es das HTTP nicht vorhergesehen hat.
            Dort ist nur ASCII erlaubt.
            Es muß also schon auf der Clientseite dafür Sorge getragen werden, das das nicht passiert (Das Eurozeichen kann man z.B. schon vorgeben)
            Auch ist es weder in Mailadressen, noch in URIs erlaubt andere Zeichen als aus ASCII zu benutzen.
            Die beiden wärst Du also schonmal los ;-)

            Und da sich für solch eine Validierung ein modulares Konzept geradezu aufdrängt und die beiden das größte Problem darstellen, wäre ein Gutteil der Arbeit getan, wenn denn beide funktionieren würden.

            Folglich bekomme ich entweder

            * das Zeichen als "normales" Zeichen geliefert, sofern es im aktuellen Zeichensatz enthalten ist (Eurozeichenausnahmen ausgenommen)
            * das Zeichen als HTML-Entity geliefert, sofern es nicht im aktuellen Zeichensatz enthalten ist

            Soweit, so richtig.

            Wenn ich jetzt aber & eingebe, dann kodiert der Browser das *nicht* als & sondern lässt es nicht kodiert.

            Das verstehe ich nicht ganz,  bitte um erweiteretes Beispiel.

            Die Funktion htmlspecialchars verhält desweiteren nicht ganz korrekt, dass sie das &-Zeichen nur dann maskiert, wenn es vor einer weiteren Entity steht.

            Mieser Bug! Wird doch hoffentlich schon dran gearbeitet, oder?

            Wenn ich aber z.B. ? in ein Textfeld eingebe und das dann abschicke und dann htmlspecialchars drüber laufen lasse, dann wird das ?-Zeichen als € dargestellt.

            So weit, so (ziemlich) korrekt.
            Aber wenn diese Funktion so buggy ist, dann schreibe entweder Deine Eigene oder such etwas anderes.
            Könntest natürlich auch den Bug fixen ,-)

            BTW: möchtest du eigentlich in reinem PHP bleiben? (ich gehe davon aus, frage aber lieber mal ;-)

            so short

            Christoph Zurnieden

            1. Hallo,

              Warum kann das nicht einfach werden?

              CS_validate_mailaddresssyntax(const char *)
              Returns 1 on success or 0 on faillure respectivly.

              Reicht doch, oder?

              Klar, für Email-Adressen und URIs ja. Aber für etwas anderes...

              Ich habe übrigens etwas mit so Zeichensätzen experimentiert.

              Auha.

              dito.

              Es gbt keine Serverseitige Lösung für dieses Problem, da es das HTTP nicht vorhergesehen hat.
              Dort ist nur ASCII erlaubt.
              Es muß also schon auf der Clientseite dafür Sorge getragen werden, das das nicht passiert (Das Eurozeichen kann man z.B. schon vorgeben)

              Klar, das mit dem Eurozeichen wollte ich halt mal probieren, weil es das einzige Zeichen auf meiner Tastatur ist, das nicht in iso-8859-1, iso-8859-2 und iso-8859-15 (mit denen ich experimentiert habe) enthalten ist.

              Auch ist es weder in Mailadressen, noch in URIs erlaubt andere Zeichen als aus ASCII zu benutzen.
              Die beiden wärst Du also schonmal los ;-)

              Schon klar.

              Und da sich für solch eine Validierung ein modulares Konzept geradezu aufdrängt und die beiden das größte Problem darstellen, wäre ein Gutteil der Arbeit getan, wenn denn beide funktionieren würden.

              Natürlich,

              Wenn ich jetzt aber & eingebe, dann kodiert der Browser das *nicht* als & sondern lässt es nicht kodiert.

              Das verstehe ich nicht ganz,  bitte um erweiteretes Beispiel.

              Ich habe ein Textfeld. Da gebe ich das &-Zeichen ein. Das wird einfach so übertragen, nicht als & - was aber falsch ist, wenn der Browser andere Zeichen wie z.B. das Eurozeichen kodiert. Waaah! Ich stelle gerade fest, dass er nicht einmal < und > kodiert. Hiillffeee!

              Mieser Bug! Wird doch hoffentlich schon dran gearbeitet, oder?

              Keine Ahnung, weiß nicht einmal, ob das überhaupt ein Bug sein soll... :-(

              So weit, so (ziemlich) korrekt.
              Aber wenn diese Funktion so buggy ist, dann schreibe entweder Deine Eigene.

              Werde ich wohl machen...

              BTW: möchtest du eigentlich in reinem PHP bleiben? (ich gehe davon aus, frage aber lieber mal ;-)

              Eine C-Erweiterung kommt nicht in Frage, da das ja möglichst portabel sein soll. Aber wenn das so weiter geht, wechsle ich zu Perl. :-(

              Grüße,

              Christian

              1. Hallo,

                Wenn ich jetzt aber & eingebe, dann kodiert der Browser das *nicht* als & sondern lässt es nicht kodiert.

                Das verstehe ich nicht ganz,  bitte um erweiteretes Beispiel.

                Ich habe ein Textfeld. Da gebe ich das &-Zeichen ein. Das wird einfach so übertragen, nicht als & - was aber falsch ist, wenn der Browser andere Zeichen wie z.B. das Eurozeichen kodiert. Waaah! Ich stelle gerade fest, dass er nicht einmal < und > kodiert. Hiillffeee!

                Das mit dem "&" ist korrekt , das mit den <, > dagegen nicht. (siehe RFC 2396 und 2732 (letztere ist für IP6 und setzt lediglich die beiden eckigen Klammern [, ] von "unwise" nach "reserved")
                Wer macht denn sowas? (bitte mit Version und OS)

                Mieser Bug! Wird doch hoffentlich schon dran gearbeitet, oder?
                Keine Ahnung, weiß nicht einmal, ob das überhaupt ein Bug sein soll... :-(

                Auch PHP wird ein Bugtraq haben ;-)
                Aber hast Recht, man ist doch eh meist zu faul dazu ;-)

                So weit, so (ziemlich) korrekt.
                Aber wenn diese Funktion so buggy ist, dann schreibe entweder Deine Eigene.

                Werde ich wohl machen...

                Befürchte das das in reinem PHP zu lahm werden dürfte.

                BTW: möchtest du eigentlich in reinem PHP bleiben? (ich gehe davon aus, frage aber lieber mal ;-)

                Eine C-Erweiterung kommt nicht in Frage, da das ja möglichst portabel sein soll.

                Also in C ist das ja wohl portabler als in PHP, oder?
                (Aber ich verstehe durchaus, konnte lediglich nicht wiederstehen ;-)

                Aber wenn das so weiter geht, wechsle ich zu Perl. :-(

                Um einen Kasten Bier, das es sowas da schon gibt!

                Nä nä, bleib mal schön in PHP! ;-)

                so short

                Christoph Zurnieden

                1. Hallo,

                  Das mit dem "&" ist korrekt , das mit den <, > dagegen nicht. (siehe RFC 2396 und 2732 (letztere ist für IP6 und setzt lediglich die beiden eckigen Klammern [, ] von "unwise" nach "reserved")
                  Wer macht denn sowas? (bitte mit Version und OS)

                  Erinnere mich nicht mehr, schaue heute abend mal nach...

                  Auch PHP wird ein Bugtraq haben ;-)
                  Aber hast Recht, man ist doch eh meist zu faul dazu ;-)

                  Da hast Du recht. Werde das mal in Ruhe durchtesten. ;-)

                  Eine C-Erweiterung kommt nicht in Frage, da das ja möglichst portabel sein soll.

                  Also in C ist das ja wohl portabler als in PHP, oder?

                  Meinst Du? Das kann man dann z.B. aber nicht auf Hostern verwenden, sondern muss selbst den Server einrichten.

                  Aber wenn das so weiter geht, wechsle ich zu Perl. :-(

                  Um einen Kasten Bier, das es sowas da schon gibt!

                  Die Wette gewinnst Du.

                  Grüße,

                  Christian

                  1. Hallo,

                    Eine C-Erweiterung kommt nicht in Frage, da das ja möglichst portabel sein soll.

                    Also in C ist das ja wohl portabler als in PHP, oder?

                    Meinst Du? Das kann man dann z.B. aber nicht auf Hostern verwenden, sondern muss selbst den Server einrichten.

                    Ich hatte ja schon erwähnt, das ich da lediglich nicht wiederstehen konnte ;-)

                    Das man nur Skripte auf den üblichen Billighostern laufen lassen kann, liegt übrigens an der Faulheit und nicht zuletzt an mangelndem Sachverstand der Anbieter. Allerdings wird die Anmietung eines ganzen Rechners (ob nun virtuell oder tatsächlich spielt nur eine untergeordnete Rolle) auch immer billiger.

                    Aber wenn das so weiter geht, wechsle ich zu Perl. :-(
                    Um einen Kasten Bier, das es sowas da schon gibt!
                    Die Wette gewinnst Du.

                    Um einen weiteren Kasten: Du hast gar nicht erst nachgeschaut, sondern bist Dir auch so schon sicher ;-)

                    harrend des Browsernamens, der solchen Unsinn mit < und > anstellt

                    Christoph Zurnieden

                    1. Hallo Christoph,

                      Das man nur Skripte auf den üblichen Billighostern laufen lassen kann, liegt übrigens an der Faulheit und nicht zuletzt an mangelndem Sachverstand der Anbieter.

                      Klar. Wenn *ich* Hoster wäre...

                      Um einen weiteren Kasten: Du hast gar nicht erst nachgeschaut, sondern bist Dir auch so schon sicher ;-)

                      Die Wette gewinnst Du auch? Kann das auch virtuelles Bier sein? *g*

                      harrend des Browsernamens, der solchen Unsinn mit < und > anstellt

                      Arrgh - diese verdammten Zeichensätze haben mich so sehr verwirrt, dass ich verkehrt gedacht habe. Die Browser sollen ja < und > nicht kodieren, ist ja Quatsch! Und htmlspecialchars macht es nur mit dem & falsch, alles andere Funktioniert richtig. (auch < und >)

                      Ich muss wohl erst noch etwas Klarheit in meinem Kopf schaffen. :-(

                      Was habe ich mir da eingebrockt!

                      Grüße,

                      Christian

                      1. Hallo,

                        Das man nur Skripte auf den üblichen Billighostern laufen lassen kann, liegt übrigens an der Faulheit und nicht zuletzt an mangelndem Sachverstand der Anbieter.

                        Klar. Wenn *ich* Hoster wäre...

                        ... würdest Du es genauso machen, denn Sachverstand und Fleiß sind teuer >;->

                        Um einen weiteren Kasten: Du hast gar nicht erst nachgeschaut, sondern bist Dir auch so schon sicher ;-)

                        Die Wette gewinnst Du auch? Kann das auch virtuelles Bier sein? *g*

                        Klar, aber nur GNU-Gebräu, Pinguin-Pils oder Devils-Draught und wehe, Du reichst mir das durchs Fenster! ;-)

                        harrend des Browsernamens, der solchen Unsinn mit < und > anstellt

                        Arrgh - diese verdammten Zeichensätze haben mich so sehr verwirrt, dass ich verkehrt gedacht habe. Die Browser sollen ja < und > nicht kodieren, ist ja Quatsch! Und htmlspecialchars macht es nur mit dem & falsch, alles andere Funktioniert richtig. (auch < und >)

                        Aha, also scheint's doch ein Bug zu sein. Also fixen oder selberschreiben, aber damit ...

                        Was habe ich mir da eingebrockt!

                        genau ;-)

                        so short

                        Christoph Zurnieden

                        1. Hallo,

                          Klar. Wenn *ich* Hoster wäre...

                          ... würdest Du es genauso machen, denn Sachverstand und Fleiß sind teuer >;->

                          Was meinst Du, warum ich kein Interesse daran habe, Hoster zu "sein". ;-)

                          Klar, aber nur GNU-Gebräu, Pinguin-Pils oder Devils-Draught und wehe, Du reichst mir das durchs Fenster! ;-)

                          Keine Angst, ich geh' schon vor die virtuelle Haustür.

                          Was habe ich mir da eingebrockt!

                          genau ;-)

                          Tjö, dann werde ich mich mal an die Arbeit machen...

                          Grüße,

                          Christian

  4. Hallo, Christian,

    Ich finde dein Vorhaben interessant, aber ich weiß nicht genau, worauf du hinauswillst. Ich habe so etwas Ähnliches auch in einer Form automatisiert, mir ging es aber darum, ein Script zu entwerfen, welches die Formulareingaben nach von mir "händisch" vorgegebenen Kriterien überprüft (muss gesetzt sein, muss RegExp entsprechen usw.) und sie bemängelt, also das Formular solange wieder anzeigt, bis der Benutzer alle Eingaben berichtigt hat. Dazu habe ich die Struktur des Formulars erst einmal auf ein Array abgebildet (könnte man auch mit Objekten machen, oder XML, inwieweit XForms schon hilfreich wären, weiß ich nicht).

    Hier einmal ein Beispiel:
    http://reich-gym.de/ehem_anmeldung_eintragen.php (Es kommen sofort die Fehlermeldungen, das erste Formular ist http://reich-gym.de/ehem_anmeldung_form.php. Wenn du "aus Versehen" etwas richtiges eingibst, wird natürlich ein Datenbankeintrag erzeugt, also bitte nach Möglichkeit vermeiden.)
    Code: http://reich-gym.de/ehem_anmeldung_eintragen.php.txt. Steht nix geheimes drin, wenn, dann nur wie man das die Abfragen narren kann, aber da habe ich sowieso ein Auge drüber und verlasse mich nicht auf die Technik. Und ja, die MySQl-Zugangsdaten liegen innerhalb des document roots. Interessant sind die ersten beiden Funktionen, die die POST-Eingaben mit denen des Arrays abgleichen und danach den valide-Flag setzen. Ich weiß, der Code ist grausig und bedarf einer Überarbeitung, die Algos sind extrem suboptimal, aber sie erfüllen ihren Zweck.
    (Der Quelltext des o.g. Scripts ist meinetwegen public domain, wenn du etwas verwenden kannst [nicht dass ich das denke *fg*], verwende es...)

    Kurz gesagt, so etwas in einer Klasse fände ich nützlicher als eine Klasse, welche 20 verschiedene PLZ-Notationen und 10 verschiedene Telefonnummersyntaxen mitbringt. Sicherlich könnte so etwas vorgegeben werden, aber ich würde nicht die Hauptarbeit in das Sammeln von Telefonnummermöglichkeiten stecken. Mich würde es mehr interessieren, die Regulären Ausdrücke selbst festlegen zu können. Nebenbei finde ich, dass die Validierung selbst der kleinste Aufwand ist, das automatische generieren des Formulars bei Fehlern finde ich viel zeitraubender. Immer und immer wieder will man kleine Formulare gestalten und ist gezwungen, jedes mal den Validierungs- und Ausgabealgorithmus neuzuschreiben, hier wäre eine Klasse wirklich nützlich. Wenn man die Formulardaten zudem in XML angeben könnte, welche die Klasse parsen würde, wäre es perfekt. Diese könnte man mit fieldset und legend strukturieren und das Formular ggf. mit den Korrekturanmerkungen anhand von Templates ausgeben, oder die CSS-Klassen vorgeben, sodass man verschiedene Formatierungen anwenden könnte.

    Wenn man die Eingaben von Benutzern betrachtet leuchtet auch schnell ein, dass oft gar nicht die Möglichkeit besteht, alles von Name über Straßen und Adresse bis zu Telefonnummer zu normieren, angesichts der Benutzerdaten der o.g. Datenbank habe ich viele RegExps wieder herausgenommen bzw. entschärft, da von USA über Mexiko und Neuseeland bis Australien alle möglichen Kombinationen für die persönlichen Daten vorhanden sind. Ich wüsste beim besten Willen keine RegExp, welche all diese Eventualitäten berücksichtigen kann... ein paar Beispiele:

    NE2 3DB Newcastle Upon Tyne
    75126 Forney, TX
    2300 Newcastle NSW
    CP 16029 Mexico DF
    AT-1130 Wien
    L8E 1B8 Hamilton

    Das einzige was mir dazu einfällt ist .+ ;) - naja, vielleich [A-Za-z0-9,-]+ oder so etwas, aber das hat nichts mit "Validierung" zu tun. Im Endeffekt läuft es darauf hinaus, dass ich die Daten manuell überprüfe, denn automatisiert geht es beim besten Willen nicht.

    Nur meine zwei Kopeken... :)
    Mathias

    1. Hallo Mathias,

      ich fasse mich kurz, das tabbed browsing vom Mozilla 1.2b hat gerade mein hablfertiges Posting verschluckt. *ärger* (sorry, aber ich hab jetzt echt nicht die Nerven, das alles nochmal zu schreiben)

      Zum Form-Generator: Thomas (Schmieder) wollte auch so etwas, vielleicht können wir uns ja mal zusammen ein Konzept überlegen, wie wir das alles realisieren können.

      Im Prinzip bin ich noch am verzweifeln mit den Zeichensätzen. (muss da erst noch "recherchieren", wie die Perl-Leute das gemanaged haben (*g*), irgendwie stehe ich vor einem Problem) (Moment: Test dieses Forums: &#8364; <- wenn da ein Eurozeichen kommt, dann gibt es keine Lösung für mein Problem; weiterer Test: ↓→ø←ŧŧ¶ŋħjĸ𓻢”ĸjłjĸ)

      Desweiteren: Abstraktionebene für Länder: Jedes Land bekommt seine eigene Klasse, die bestimmte Methoden definieren muss. Der Klassenname sätzt sich aus einem Präfix und dem ISO-Ländercode (de, at, us, uk, etc.) zusammen. Diese Klasse kümmert sich um länderspezifische Details, wie Interpretation der Datumsformate, etc.

      Danach: Validierung: Hier bastle ich am Besten eine Klasse, die möglichst flexibel ist. Die genaue Struktur muss ich mir noch überlegen. Ich habe mir gedacht, dass die Validierungsmethode(n) entweder den Wert oder halt false zurückgebe(n) (kann man dann mit === prüfen) und dass sie für bestimmte Dinge, wie Zahlen und Datume gleich weiterverwertbare Formen liefern wie "normale" PHP-Zahlen und Timestamps. Hier kommen dann die länderspezifischen Dinge ins Spiel, denn ich muss ja auch die Zeitzonen berücksichtigen.

      Zu guter letzt: "Form-Generator": Tja - da könntest Du Dir vielleicht mal zusammen mit Thomas an ein Konzept machen, und dann können wir das ganze verknüpfen. Aber alleine prorammiere ich das nicht, habe mir schon genug aufgehalst.

      Grüße,

      Christian