Siechfred: Eine ungewöhnliche Bitte

Hallo alle,

nun ist es passiert, ich habe begonnen, mich mit PHP zu beschäftigen. Da es in meinem unmittelbaren Umfeld niemanden gibt, der mir diesbezüglich weiter helfen kann, bitte ich euch, den folgenden Code zu begutachten und mir eventuelle Denkfehler oder Umständlichkeiten aufzuzeigen (ich bitte um Nachsicht für den Umfang). Zur Erklärung, es geht um ein Kontaktformular namens kontakt.php, live kann man sich das Ganze hier ansehen: http://wartburgchor-net.keymachine.de/kontakt.php

<?php
  function check() {
    global $focus;
    global $fehler;
    global $name;
    global $mail;
    global $mess;
    if($_POST['form'] != "kont") {
      $focus = "subj";
      return False;
    }
    if(empty($_POST['subj'])) {
      $focus = "subj";
      $fehler = "Bla.";
      return False;
    }
    else {
      $subj = $_POST['subj'];
    }
    if(empty($_POST['name']) || !preg_match("/[1]{3,}$/", $_POST['name'])) {
      $focus = "name";
      $fehler = "Blubb.";
      return False;
    }
    else {
      $name = $_POST['name'];
    }
    if(empty($_POST['mail']) || !preg_match("/[2]{1,}@[a-zA-Z0-9._-]{1,}$/", $_POST['mail'])) {
      $focus = "mail";
      $fehler = "Fasel.";
      return False;
    }
    else {
      $mail = $_POST['mail'];
    }
    if(empty($_POST['mess'])) {
      $focus = "mess";
      $fehler = "Schwaetz.";
      return False;
    }
    else {
      $mess = htmlentities($_POST['mess']);
    }
    return True;
  }
  if(!check()) {
?>

(hier folgt die Ausgabe des Formulars mit Fehlermeldung und via JS fokussiertem fehlerhaften Eingabefeld, im else-Zweig wird die Mail versandt und eine Erfolgsmeldung ausgegeben)

Vielen Dank für eure Mühe.

Freundschaft!
Siechfred

--
Punk's not dead: http://www.siechfreds-welt.de/badreligion.shtml
Dankbarkeit, man spürt sie ja so selten bei den Menschen, und gerade die Dankbarsten finden nicht den Ausdruck dafür, sie schweigen verwirrt, sie schämen sich und tun manchmal stockig, um ihr Gefühl zu verbergen. (Stefan Zweig)

  1. a-zA-Z0-9äöüÄÖÜß._ ↩︎

  2. a-zA-Z0-9._- ↩︎

  1. Hallo Siechfred,

    bin zwar kein PHP Experte, aber ich mach es so das ich bei Formularprüfungen eventuelle Leerzeichen am Anfang und Ende entferne und dann erst schaue ob da noch was bleibt. Denn dann sind 3 Leerzeichen im Namensfeld/Nachrichtenfeld bei Deinem Formular nicht mehr OK ;-))

    Auch ist es immer gut auf eine Maximale Länge der Eingaben zu achten. Wenn einer Das Formular nämlich runterlädt, die Form Tags manipuliert, und dann "Massenpost" sendet ist das auch nicht so gut.

    Gruß Helmut

    1. Hallo Helmut.

      bin zwar kein PHP Experte, aber ich mach es so das ich bei Formularprüfungen eventuelle Leerzeichen am Anfang und Ende entferne und dann erst schaue ob da noch was bleibt. Denn dann sind 3 Leerzeichen im Namensfeld/Nachrichtenfeld bei Deinem Formular nicht mehr OK ;-))

      Ja, gute Idee, danke für den Tipp.

      Auch ist es immer gut auf eine Maximale Länge der Eingaben zu achten. Wenn einer Das Formular nämlich runterlädt, die Form Tags manipuliert, und dann "Massenpost" sendet ist das auch nicht so gut.

      Auch dies werde ich beherzigen.

      Freundschaft!
      Siechfred

      --
      Punk's not dead: http://www.siechfreds-welt.de/badreligion.shtml
      Dankbarkeit, man spürt sie ja so selten bei den Menschen, und gerade die Dankbarsten finden nicht den Ausdruck dafür, sie schweigen verwirrt, sie schämen sich und tun manchmal stockig, um ihr Gefühl zu verbergen. (Stefan Zweig)
  2. hi,

    function check() {
        global $focus;
        global $fehler;

    egal in welcher programmiersprache - mit globalen variablen zu arbeiten, gilt in den allermeisten fällen als ziemlich unfein.

    wenn deine funktion mehrere werte zurückgeben soll - dann verpacke diese doch ggf. in ein array, und lasse die funktion dann dieses aray zurückgeben.

    gruß,
    wahsaga

    --
    [ Hier könnte Ihre Werbung stehen! ]
    1. Hallo wahsaga.

      egal in welcher programmiersprache - mit globalen variablen zu arbeiten, gilt in den allermeisten fällen als ziemlich unfein.

      Hm, warum dieses? Ich brauche doch die Variablen im gesamten Script.

      wenn deine funktion mehrere werte zurückgeben soll - dann verpacke diese doch ggf. in ein array, und lasse die funktion dann dieses aray zurückgeben.

      Ok, werde ich mir mal anschauen. Danke für die Tipps.

      Freundschaft!
      Siechfred

      --
      Punk's not dead: http://www.siechfreds-welt.de/badreligion.shtml
      Dankbarkeit, man spürt sie ja so selten bei den Menschen, und gerade die Dankbarsten finden nicht den Ausdruck dafür, sie schweigen verwirrt, sie schämen sich und tun manchmal stockig, um ihr Gefühl zu verbergen. (Stefan Zweig)
      1. hi,

        egal in welcher programmiersprache - mit globalen variablen zu arbeiten, gilt in den allermeisten fällen als ziemlich unfein.

        Hm, warum dieses? Ich brauche doch die Variablen im gesamten Script.

        du hast sie ja auch "im gesamten script", "von oben bis unten" sozusagen, zur verfügung. da musst du sie ja nicht irgendwie "global" machen.

        allerdings ist eine _funktion_ gar nicht teil deines scriptes, sondern ja etwas bewusst ausgelagertes (ob jetzt wirklich extern in einem include-file oder im selben script, ist wurscht).

        also existiert von deinem script in richtung funktion und zurück von der funktion an dein script jeweils eine schnittstelle, die dann auch konkret definiert sein sollte, und an der man sich nicht irgendwie "vorbeischummelt".

        die größte gefahr bei der verwendung globaler variablen ist einfach, dass man ihren wert innerhlab einer funktion evtl. mal "versehentlich" ändert, und dann nachher das script unerwartete reaktionen zeigt.
        durch eine saubere schnittstelle verhindert man das, da kannst du beim debuggen vorher und nachher ganz genau prüfen, was geht rein, was kommt raus.

        stell' es dir einfach mal wie zwei benachbarte zimmer in einem haus vor - um sachen von einem zimmer ins andere zu bekommen, musst du sie alle durch die tür tragen.

        jetzt mag natürlich jemand sagen, "das ist mir zu umständlich, lieber lasse ich die wand zwischen beiden zimmern komplett weg, dann brauche ich einfach nur den teppich auf der kompletten breite vom einen zimmer ins andere rüberziehen, und alle sachen sind da - ohne das ich mit ihnen durch die dumme tür muss".
        der wird dann aber ziemlich bald feststellen, dass es ohne wand doch irgendwie zieht, und ungemütlich ist.

        (es muss hinken, sonst wär's ja kein vergleich ...)

        ausserdem machst du dir duch eine funktion, die die global verfügbaren variablen $a und $b benutzt, um daraus einen wert für $c zu berechnen, ja den größten vorteil von funktionen kaputt - wie willst du diese funktion verwenden, um aus $x und $y nach dem gleichen algorithmus $z zu berechnen, wenn deine funktion doch immer mit den selben globalen variablen arbeitet ...?

        gruß,
        wahsaga

        --
        [ Hier könnte Ihre Werbung stehen! ]
        1. Hallo wahsaga.

          du hast sie ja auch "im gesamten script", "von oben bis unten" sozusagen, zur verfügung. da musst du sie ja nicht irgendwie "global" machen.

          Ich hatte es mir so vorgestellt, dass die Funktion check() überprüft, ob die Formulareingaben meinen Vorstellungen entsprechen und wenn ja, dass den Variablen dann der entsprechende Wert zugewiesen wird, sodass ich sie im Folgenden nutzen kann. Und dafür muss man ja die Variablen global machen. Das ist jetzt natürlich eine Frage der Logik, ich werde mal in mich gehen und die noch mal überdenken, vielleicht ist ja bereits der Ansatz ein unglücklicher.

          die größte gefahr bei der verwendung globaler variablen ist einfach, dass man ihren wert innerhlab einer funktion evtl. mal "versehentlich" ändert, und dann nachher das script unerwartete reaktionen zeigt.

          Das ist in meinem Fall unwahrscheinlich, da den Variablen erst innerhalb der Funktion nach erfolgter Prüfung ein Wert zugewiesen wird, der dann im gesamte Script unverändert gelten soll.

          ausserdem machst du dir duch eine funktion, die die global verfügbaren variablen $a und $b benutzt, um daraus einen wert für $c zu berechnen, ja den größten vorteil von funktionen kaputt - wie willst du diese funktion verwenden, um aus $x und $y nach dem gleichen algorithmus $z zu berechnen, wenn deine funktion doch immer mit den selben globalen variablen arbeitet ...?

          Wie bereits gesagt, ob die Verwendung einer Funktion hier wirklich nötig ist, muss ich nochmal überdenken.

          Freundschaft!
          Siechfred

          --
          Punk's not dead: http://www.siechfreds-welt.de/badreligion.shtml
          Dankbarkeit, man spürt sie ja so selten bei den Menschen, und gerade die Dankbarsten finden nicht den Ausdruck dafür, sie schweigen verwirrt, sie schämen sich und tun manchmal stockig, um ihr Gefühl zu verbergen. (Stefan Zweig)
          1. Hallo wahsaga.

            du hast sie ja auch "im gesamten script", "von oben bis unten" sozusagen, zur verfügung. da musst du sie ja nicht irgendwie "global" machen.

            Ich hatte es mir so vorgestellt, dass die Funktion check() überprüft, ob die Formulareingaben meinen Vorstellungen entsprechen und wenn ja, dass den Variablen dann der entsprechende Wert zugewiesen wird, sodass ich sie im Folgenden nutzen kann. Und dafür muss man ja die Variablen global machen. Das ist jetzt natürlich eine Frage der Logik, ich werde mal in mich gehen und die noch mal überdenken, vielleicht ist ja bereits der Ansatz ein unglücklicher.

            Nönö dafür mußt Du die Variabeln nicht global verfügbar machen.
            Du kannst auch mit Return ein Array zurrückgeben lassen.
            Richtig ist dass Du für die überprüfung nicht zwingend eine Funktion benötigts.
            Es gibt so tolle Funktionen wie isset ().

            Viele grüße TomIRL

            1. Morgen TomIRL.

              Nönö dafür mußt Du die Variabeln nicht global verfügbar machen.

              Hm, wenn ich Variablen, denen in einer Funktion ein Wert zugewiesen wird, im weiteren Script nutzen will, ohne sie mit return zurückzugeben, muss ich sie doch global definieren, oder habe ich da was falsch verstanden?

              Du kannst auch mit Return ein Array zurrückgeben lassen.

              Das ist mir klar.

              Richtig ist dass Du für die überprüfung nicht zwingend eine Funktion benötigts.

              Wie gesagt, ist gut möglich, dass mein bisheriger Ansatz nicht optimal ist, mal sehen, ob mir noch was besseres und funktionelleres einfällt.

              Es gibt so tolle Funktionen wie isset ().

              Ich weiß :-)

              Freundschaft!
              Siechfred

              --
              Punk's not dead: http://www.siechfreds-welt.de/badreligion.shtml
              Dankbarkeit, man spürt sie ja so selten bei den Menschen, und gerade die Dankbarsten finden nicht den Ausdruck dafür, sie schweigen verwirrt, sie schämen sich und tun manchmal stockig, um ihr Gefühl zu verbergen. (Stefan Zweig)
              1. Morgen TomIRL.

                Nönö dafür mußt Du die Variabeln nicht global verfügbar machen.

                Hm, wenn ich Variablen, denen in einer Funktion ein Wert zugewiesen wird, im weiteren Script nutzen will, ohne sie mit return zurückzugeben, muss ich sie doch global definieren, oder habe ich da was falsch verstanden?

                Jaein Dein Ansatz würde aber dem Grundansatz von Funktionen und objektorientierter Programierung widersprechen. Du verwendest Funktionen ja in aller Regel um ein Kontrolle über die Werte von Variablen zu haben.
                Du kannst Funktionen ja auch ineinander verschachteln also eine andere Funktion in einer Funktion aufrufen.
                Viele Grüße und noch viel Spaß
                TomIRL

  3. Hi,

    Umständlichkeiten aufzuzeigen

    Warum so misstrauisch - ist doch lediglich ein Kontaktformular? Eine IP-Sperre, damit dein Postfach nicht geflutet wird, währe hier sinnvoller. Will ein Nutzer seinen Namen nicht angeben - lass ihn doch.

    E7

    1. Hallo e7,

      Umständlichkeiten aufzuzeigen
      Warum so misstrauisch - ist doch lediglich ein Kontaktformular?

      Die Erfahrung lehrt Misstrauen :-)

      Eine IP-Sperre, damit dein Postfach nicht geflutet wird, währe hier sinnvoller.

      Sinnvoller als was? Jedenfalls dachte ich an die Verwendung von Session-IDs, muss mich da aber erstmal einlesen.

      Will ein Nutzer seinen Namen nicht angeben - lass ihn doch.

      Ich mag's halt persönlicher ;-)

      Danke auch dir für die Tipps.

      Freundschaft!
      Siechfred

      --
      Punk's not dead: http://www.siechfreds-welt.de/badreligion.shtml
      Dankbarkeit, man spürt sie ja so selten bei den Menschen, und gerade die Dankbarsten finden nicht den Ausdruck dafür, sie schweigen verwirrt, sie schämen sich und tun manchmal stockig, um ihr Gefühl zu verbergen. (Stefan Zweig)
      1. Hi,

        Eine IP-Sperre, damit dein Postfach nicht geflutet wird, währe hier sinnvoller.
        Sinnvoller als was? Jedenfalls dachte ich an die Verwendung von Session-IDs, muss mich da aber erstmal einlesen.

        Für was brauchst du bei einem Kontaktformular SessionID's? Die sind auch kein Hindernis. Wenn jemand die Seite 200x aufruft - was dann? Dann hilft nur eine IP-Sperre (und eine Zeitsperre, falls jemand über mehrere Proxy's reingeht etc.)

        Will ein Nutzer seinen Namen nicht angeben - lass ihn doch.
        Ich mag's halt persönlicher ;-)

        Du kannst ja hinschreiben, dass das Feld ausgefüllt werden muss - wenn jemand seinen Namen nicht angeben will, setzt er da sowieso blos zufällige Buchstabenkombinationen rein...

        E7

        1. Hallo e7.

          Für was brauchst du bei einem Kontaktformular SessionID's? Die sind auch kein Hindernis. Wenn jemand die Seite 200x aufruft - was dann? Dann hilft nur eine IP-Sperre (und eine Zeitsperre, falls jemand über mehrere Proxy's reingeht etc.)

          Ich habe wie gesagt keine Ahnung von Sessions, damit muss ich mich erstmal näher beschäftigen, um feststellen zu können, ob dies ein probates Mittel ist oder nicht. Und eine IP-Sperre ist in Perl kein Problem, in PHP muss ich mich auch da auch erstmal einlesen.

          Freundschaft!
          Siechfred

          --
          Punk's not dead: http://www.siechfreds-welt.de/badreligion.shtml
          Dankbarkeit, man spürt sie ja so selten bei den Menschen, und gerade die Dankbarsten finden nicht den Ausdruck dafür, sie schweigen verwirrt, sie schämen sich und tun manchmal stockig, um ihr Gefühl zu verbergen. (Stefan Zweig)
        2. Hallo nochmal.

          Für was brauchst du bei einem Kontaktformular SessionID's? Die sind auch kein Hindernis.

          Ich halte die Verwendung von Sessions trotzdem für sinnvoll.

          Wenn jemand die Seite 200x aufruft - was dann?

          Das geht nicht, jedenfalls nicht, so lange die jeweilige Browsersitzung nicht geschlossen wird. Und wer das Mailformular spammen will, für den sind auch IP- und Zeitsperren keine Hürde.

          Freundschaft!
          Siechfred

          --
          Punk's not dead: http://www.siechfreds-welt.de/badreligion.shtml
          Dankbarkeit, man spürt sie ja so selten bei den Menschen, und gerade die Dankbarsten finden nicht den Ausdruck dafür, sie schweigen verwirrt, sie schämen sich und tun manchmal stockig, um ihr Gefühl zu verbergen. (Stefan Zweig)
          1. Hi,

            Das geht nicht, jedenfalls nicht, so lange die jeweilige Browsersitzung nicht geschlossen wird.

            Wie definierst du >>Browsersitzung schließen<<? Etwa der Moment, in dem sich der Browser urplötzlich nicht mehr an die SessionID erinnern kann, weil der Surfer die Parameter der URI entfernt hat (Komm jetzt nicht mit Cookies, Cookies kann man löschen und deaktivieren, dann MUSST du die SessionID in der URI mitgeben)?

            Und wer das Mailformular spammen will, für den sind auch IP- und Zeitsperren keine Hürde.

            Ich weiß. Aber es ist eine sehr effektive Maßnahme, um die meisten, die das vorhaben, auszuschließen... Und durch die Zeitsperre (dass man dir beispielsweise innerhalb 60 Sekunden nur zwei Feedbacks schicken kann) reduzierst du die Mails erheblich (normalerweise würde man ja so 10 Mails in der Sekunde schaffen)

            E7

  4. Hallo an alle,

    scheint so, als obe der von mir produzierte PHP-Code gar nicht so schlimm verkehrt ist, freut mich. Ich habe zur Vermeidung des mehrfachen Absendens jetzt Sessions eingebaut, die kann ich dann ggf. auch in anderen Teilen der Seite weiterverwenden. Ist zwar noch ein kleiner Fehler in der Programmlogik, aber der wird später noch ausgebessert ;-)

    Vielen Dank an die Helfer.

    Freundschaft!
    Siechfred

    --
    Punk's not dead: http://www.siechfreds-welt.de/badreligion.shtml
    Dankbarkeit, man spürt sie ja so selten bei den Menschen, und gerade die Dankbarsten finden nicht den Ausdruck dafür, sie schweigen verwirrt, sie schämen sich und tun manchmal stockig, um ihr Gefühl zu verbergen. (Stefan Zweig)