Nadja: Wo liegt der Fehler?

Hallo,

ich habe ein Formular, mit dem der Besucher der Seite Kontakt zu mir aufnehmen kann.
Nach Absenden wird u.a. überprüft, ob der Name ein String ist. Aber selbst wenn ich "123" eintrage, geht dieser "Name" durch meine if-Verzweigung :(

Hier ein Teil des Skriptes:

$name = $_POST[name];  
  
  // Variablen senden auf 0 (zulassen) setzen  
  $senden = 0;  
  
  // Abfragen auf Gültigkeit der eingegebenen Daten  
  if((!is_string($name)) || ($name == "")) {  
   $name_falsch = 1;  
  } else {  
   $name_falsch = 0;  
  }  
  
  if(($gesendet == "ok") && ($name_falsch == 1)) {  
   $meldung_name = "*";  
   $senden = 1;  
  }

Selbst wenn der Name aus Zahlen besteht, würde er $senden auf 0 lassen. Wo liegt da der Fehler?

Oder ist es einfach so, dass Formulardaten immer Strings sind??
Wie kann ich dann herausfinden, ob im Namen Zahlen o.ä. enthalten sind (was ja nicht sein darf)?

Liebe Grüße,
Nadja

--
system.exit(0);
  1. Ahoi Nadja,

    Hier ein Teil des Skriptes:
    $name = $_POST[name];

    $name = trim($_POST[name]);

    // Variablen senden auf 0 (zulassen) setzen
      $senden = 0;

    // Abfragen auf Gültigkeit der eingegebenen Daten
      if((!is_string($name)) || ($name == "")) {

      
    da postdaten immer als string kommen solltest du auf is\_numeric() prüfen.  
      
    Des weiteren solltest du nicht =0 bzw. =1 nehmen sondern =true oder =false.  
      
    MfG  
    
    
    1. Hallo Daniel,

      hab's nun mit einem reg. Ausdruck geschafft.

      Des weiteren solltest du nicht =0 bzw. =1 nehmen sondern =true oder =false.

      Warum sollte man nicht 0 und 1 benutzen?

      Mal was anderes: Wie lautet denn der reg. Ausdruck für eine E-Mailadresse?

      Hab jetzt folgendes:

      if((eregi("/^[a-zA-Z0-9_\.-]{2,}@[a-z0-9-]{3,}\.[a-z]{2,4}$/",$email)) || ($email == "")) {  
         $email_falsch = 1;  
        } else {  
         $email_falsch = 0;  
        }  
        if(($gesendet == "ok") && ($email_falsch == 1)) {  
         $meldung_email = "*";  
         $senden = 1;  
        }
      

      Aber das stimmt irgendwie nicht. Zumindest kann ich alles mögliche absenden

      Liebe Grüße,
      Nadja

      --
      system.exit(0);
      1. Ahoi Nadja,

        Mal was anderes: Wie lautet denn der reg. Ausdruck für eine E-Mailadresse?

        ich prüfe emailadressen mit dieser funktion:

          
        function email_valid($email)  
        {  
          if (!ereg("^.+@.+\\..+$", $email))  
          {  
            return false;  
          }  
          else  
          {  
            return true;  
          }  
        }  
        
        

        MfG

        1. Hallo Daniel,

          if (!ereg("^.+@.+\..+$", $email))

            
          Das raff ich irgendwie nicht :(  
            
          Liebe Grüße,  
          Nadja
          
          -- 
          system.exit(0);
          
          1. Ahoi Nadja,

            Das raff ich irgendwie nicht :(

            das entspricht dem z.B. bei der windofsuche eingegebenem wert:

            *@*.*

            MfG

            1. Hallo Daniel,

              das entspricht dem z.B. bei der windofsuche eingegebenem wert:

              *@*.*

              Ich versteh es trotzdem nicht. Ist zwar kurz und bündig, aber leider kenne ich mich nicht *so* gut mit regExp aus.

              Liebe Grüße,
              Nadja

              --
              system.exit(0);
              1. Soll heißen

                irgendeintext @ irgendeinprovider . irgendeinedomain

              2. Hallo Nadja.

                Ich versteh es trotzdem nicht. Ist zwar kurz und bündig, aber leider kenne ich mich nicht *so* gut mit regExp aus.

                Dann lerne es. :-)

                Einen schönen Donnerstag noch.

                Gruß, Ashura

                --
                Selfcode: sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:) fl:( ss:) ls:[ js:|
                30 Days to becoming an Opera8 Lover -- Day 21: Toolbars
                Meine Browser: Opera 8.01 | Firefox 1.0.6 | Lynx 2.8.5 | Netscape 4.7 | IE 6.0
                [Deshalb frei! - Argumente pro freie Software]
                1. Hallo Ashura,

                  Dann lerne es. :-)

                  Danke für den Link :)
                  Hab auch ein "Kurz und gut"-Büchlein darüber zu Hause, aber es war bisher nicht nötig, mich damit zu beschäftigen.

                  Liebe Grüße,
                  Nadja

                  --
                  system.exit(0);
                2. Hallo Ashura,

                  Dann lerne es. :-)

                  P.s.: Eigentlich hatte ich das Thema auch während der Ausbildung, hab's da auch verstanden... Ich glaub, ich werd alt! Hab schon wieder alles vergessen :(

                  Liebe Grüße,
                  Nadja

                  --
                  system.exit(0);
          2. Ahoi Nadja,

            if (!ereg("^.+@.+\..+$", $email))

            
            > Das raff ich irgendwie nicht :(  
              
            das ^ steht für 1 bis beliebig viele zeichen.  
            der . sagt es geht noch weiter.  
            das +@ bedeutet dann kommt ein "@".  
            der . sagt es geht noch weiter.  
            das +\\. sagt danach kommt ein ".".  
            der . sagt es geht noch weiter.  
            das +$ sagt es kommt noch was.  
              
            irgendwie so. sprich in worten ausgedrückt heißt es  
              
            "belibige anzahl zeichen"@"beliebige anzahl zeichen"."beliebige anzahl zeichen"  
              
            also irgendein string indem ein "@" vorkommt und danach ein ".".  
              
            MfG  
            
            
            1. Hallo Daniel,

              [...] irgendwie so. sprich in worten ausgedrückt heißt es

              "belibige anzahl zeichen"@"beliebige anzahl zeichen"."beliebige anzahl zeichen"

              also irgendein string indem ein "@" vorkommt und danach ein ".".

              Wow, ist echt klasse :)
              Danke für die Erklärung ;)

              Liebe Grüße,
              Nadja

              --
              system.exit(0);
            2. Γειά σου, Daniel!

              if (!ereg("^.+@.+\\..+$", $email))

              Das raff ich irgendwie nicht :(

              das ^ steht für 1 bis beliebig viele zeichen.
              der . sagt es geht noch weiter.
              das +@ bedeutet dann kommt ein "@".
              der . sagt es geht noch weiter.
              das +\. sagt danach kommt ein ".".
              der . sagt es geht noch weiter.
              das +$ sagt es kommt noch was.

              irgendwie so.

              Nein, gänzlich nicht.

              ^ -> Die gesuchte Zeichenfolge muss direkt zu Beginn der zu durchsuchenden Zeichenfolge stehen.
              . -> Ein beliebiges Zeichen (nicht zwei oder drei).

              • -> Ein oder beliebig viele Vorkommen des vorausstehenden Zeichens, d.h. .+ bedeutet: eine beliebige Zeichenfolge mit mindestens einem Zeichen.
                @ -> Das ganz normale @ eben. ;-)
                \ -> Sucht nach einem Backslash.
                $ -> Die gesuchte Zeichenfolge muss am Ende der zu durchsuchenden Zeichenfolge stehen.

              also irgendein string indem ein "@" vorkommt und danach ein ".".

              Richtiger wäre folgender Ausdruck:

              /^.+@.+..+$/

              Eine wahrlich vollständige RegExp für Mail-Adressen findet sich auf http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html (Danke, Stefan ;-) ).

              Пока!
              Sven aus Bonn

              --
              Do it yourSELF! ;-)
              Selfcode: ie:% fl:( br:> va:} ls:[ fo:) rl:( n4:{ ss:| de:> js:| ch:) mo:} zu:) - Selfcode dekodieren - Selfcode-Info
              Athen rückt in Sichtweite. ;-)
              1. Hallo Arx,

                Richtiger wäre folgender Ausdruck:

                /^.+@.+..+$/

                Wieso kann bzw. muss man eigentlich in PHP den Beginn- und Ende-Slash weglassen?

                Liebe Grüße,
                Nadja

                --
                system.exit(0);
                1. Hallo Nadja.

                  Richtiger wäre folgender Ausdruck:

                  /^.+@.+..+$/

                  Wieso kann bzw. muss man eigentlich in PHP den Beginn- und Ende-Slash weglassen?

                  Wenn man die Delimiter (korrekter Begriff, es gibt noch weitaus mehr, siehe meinen Link) weglässt, kann man nur die POSIX-Funktionen verwenden, welche aber veraltet und nicht mehr zu empfehlen sind.

                  Heutige RegExe sind alle PCRE (Perl Compatible Regular Expressions) und werden auch mit den entsprechenden Funktionen angewandt.

                  Einen schönen Donnerstag noch.

                  Gruß, Ashura

                  --
                  Selfcode: sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:) fl:( ss:) ls:[ js:|
                  30 Days to becoming an Opera8 Lover -- Day 21: Toolbars
                  Meine Browser: Opera 8.01 | Firefox 1.0.6 | Lynx 2.8.5 | Netscape 4.7 | IE 6.0
                  [Deshalb frei! - Argumente pro freie Software]
                  1. Hallo Ashura,

                    Wenn man die Delimiter (korrekter Begriff, es gibt noch weitaus mehr, siehe meinen Link) weglässt, kann man nur die POSIX-Funktionen verwenden, welche aber veraltet und nicht mehr zu empfehlen sind.

                    Heutige RegExe sind alle PCRE (Perl Compatible Regular Expressions) und werden auch mit den entsprechenden Funktionen angewandt.

                    Ahhhhja :)
                    Da muss ich mir mal mehr Zeit für nehmen um mich da einzulesen, aber danke für die ganzen Links!

                    Liebe Grüße,
                    Nadja

                    --
                    system.exit(0);
      2. Hallo Nadja,

        Des weiteren solltest du nicht =0 bzw. =1 nehmen sondern =true oder =false.
        Warum sollte man nicht 0 und 1 benutzen?

        Das ist 'ne Sache für die Datentyp-Fetischisten. ;)
        In der Praxis ist es vollkommen wurscht, ob du 1 und 0 verwendest oder true und false. Jeder Zahlenwert ungleich 0 wird in einem boolschen Kontext als true interpretiert, und der Zahlenwert 0 als false.

        Sowas wie
          ~~~php $senden = 1;
          ...
          if ($senden)
           { machhierweiter();
           }

        ist also völlig in Ordnung. Aus \_meiner\_ Sicht (ich bin Lowlevel-Programmierung gewöhnt, teils auch in Assembler), liest sich das sogar leichter, aber das ist natürlich Ansichtssache.  
          
        Bye-bye,  
          
         Martin
        
  2. Oder ist es einfach so, dass Formulardaten immer Strings sind??

    Ja das ist so.
    In diesem Fall müsstest du dir eine kleine Funktion schreiben die alle Buchstaben des Strings durchgeht und prüft ob es eine Zahl ist.
    Oder vielleicht gibts eine vorgefertigte Funktion.
    lg Gerhard

    1. Hallo Gerhard,

      In diesem Fall müsstest du dir eine kleine Funktion schreiben die alle Buchstaben des Strings durchgeht und prüft ob es eine Zahl ist.
      Oder vielleicht gibts eine vorgefertigte Funktion.

      Hab jetzt mit einem regulären Ausdruck gearbeitet:

      if((eregi("[0-9]",$name)) || ($name == "")) {  
         $name_falsch = 1;  
        } else {  
         $name_falsch = 0;  
        }
      

      Funktioniert nun :)

      Liebe Grüße,
      Nadja

      --
      system.exit(0);
      1. Ahoi Nadja,

        Funktioniert nun :)

        ist aber keine so tolle lösung? was ist wenn er

        "Friedrich der 1." eingibt, dann verwährst du ihm den kontakt, das ist nicht nett.

        MfG

        1. Hallo Daniel,

          ist aber keine so tolle lösung? was ist wenn er

          "Friedrich der 1." eingibt, dann verwährst du ihm den kontakt, das ist nicht nett.

          Schreibt man dann nicht Friedrich I?

          Liebe Grüße,
          Nadja

          --
          system.exit(0);
          1. Ahoi Nadja,

            Schreibt man dann nicht Friedrich I?

            willst du jmd vorschreiben wie er seinen namen zu schreiben hat? was ist
            wenn R2D2 oder C3PO dich kontaktieren wollen? sollen die dann RzwoDzwo
            bzw. CdreiPO schreiben?

            MfG

            1. Hallo Daniel,

              willst du jmd vorschreiben wie er seinen namen zu schreiben hat? was ist
              wenn R2D2 oder C3PO dich kontaktieren wollen? sollen die dann RzwoDzwo
              bzw. CdreiPO schreiben?

              Hast ja recht. Also sollte man am besten nur mit is_numeric(); prüfen, ob nur Zahlen eingegeben worden sind!?
              Prüfst du überhaupt etwas beim Namen?

              Liebe Grüße,
              Nadja

              --
              system.exit(0);
              1. Ahoi Nadja,

                Hast ja recht. Also sollte man am besten nur mit is_numeric(); prüfen, ob nur Zahlen eingegeben worden sind!?
                Prüfst du überhaupt etwas beim Namen?

                wenn der Name ein pflichtfeld ist ja. ansonsten bei jeder übergebenen
                variable erstmal ein trim(). wenn es pflichtfelder sind dann ein
                strlen()>=1 (oder >=5 je nach mindestlänge) dann evt. auf is_nummeric
                email-format, datumsformat etc.

                bei nicht pflichtfeldern belasse ich es bei dem trim() ausnahmen sind dabei aber datumseingaben.

                MfG

                1. Hallo Daniel,

                  wenn der Name ein pflichtfeld ist ja. ansonsten bei jeder übergebenen
                  variable erstmal ein trim(). wenn es pflichtfelder sind dann ein
                  strlen()>=1 (oder >=5 je nach mindestlänge) dann evt. auf is_nummeric
                  email-format, datumsformat etc.

                  bei nicht pflichtfeldern belasse ich es bei dem trim() ausnahmen sind dabei aber datumseingaben.

                  Danke für die Info.
                  Hab den Namen jetzt folgendermaßen bearbeitet:

                    
                  $name = $_POST[name];  
                  $name = trim($name);  
                  if((is_numeric($name)) || ($name == "") || (strlen($name)<=1)) {  
                   $name_falsch = 1;  
                  } else {  
                   $name_falsch = 0;  
                  }  
                  if(($gesendet == "ok") && ($name_falsch == 1)) {  
                   $meldung_name = "*";  
                   $senden = 1;  
                  }  
                  
                  

                  Bei der E-Mailadresse braucht man mit deinem reg. Ausdruck nicht extra nach der Länge zu gucken, oder?

                  Liebe Grüße,
                  Nadja

                  --
                  system.exit(0);
                  1. Ahoi Nadja,

                    Bei der E-Mailadresse braucht man mit deinem reg. Ausdruck nicht extra nach der Länge zu gucken, oder?

                    nein braucht man nicht, kann man ist aber unnötig. schließlich prüfst du
                    die eingegebene email-adresse ja auch nicht ob sie "geht.dich@nix.an"
                    heißt. was ich damit sagen will, man kann zwar die "Fehlerhaften"
                    eingaben minimieren aber das wirklich nur korekte angaben gemacht werden
                    kann man nicht sicherstellen. daher würde ich auf eine längenüberprüfung
                    der eingegebenen email-adresse verzichten. entweder sie entspricht dem
                    format, oder halt nicht.

                    MfG