Ankündigung

Einklappen
Keine Ankündigung bisher.

Prüfen ob mehr als ein Datenfeld leer ist

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Prüfen ob mehr als ein Datenfeld leer ist

    Hallo Leute,

    Ich habe für leere Formularfelder spezifische Fehlermeldungen, je nachdem welches Feld leer war.

    Da für das Formular eh nur wenige Felder definiert sind und alle Pflichtfelder sind, möchte ich das ab 2 nicht eingetragenen Feldern nicht mehr die spezifische Fehlermeldung sondern "Bitte füllen Sie alle Felder aus ausgegeben wird".

    Wie ich das mit if-else machen könnte weiß ich, allerdings wären dass zu viele if-else Abfragen im allg und auch zu tief verschachtelt (siehe Code),
    wie ich allerdings bewerkstelligen könnte dass geprüft wird ob mehr als ein Feld leer ist weiß ich nicht weil ich in PHP nicht stark genug bin.

    Ich denke am leichtesten Wäre die Fehlermeldung in ein Array umzuwandeln und abzufragen wie die length-Eigenschaft ist, wenn größer 1 dann...

    oder hat jmd eine bessere Idee, leider weiß ich nicht wie ich das mit dem Array umsetzen könnte und ob es überhaupt diese Eigenschaft wie in JavaScript gibt.


    PHP-Code:
    function formverarbeiten()                  
    {
      isset(
    $_POST['name'])  && is_string($_POST['name'])  ? $name stripslashes(ucwords(trim(htmlspecialchars($_POST['name'])))) : $name'';
      isset(
    $_POST['tel'])  && is_string($_POST['tel'])  ? $tel =  stripslashes(trim(htmlspecialchars($_POST['tel']))) : $tel'';
      isset(
    $_POST['email'])  && is_string($_POST['email'])  ? $email =  stripslashes(trim(htmlspecialchars($_POST['email']))) : $email'';
      isset(
    $_POST['message'])  && is_string($_POST['message'])  ? $message wordwrap(stripslashes(trim(htmlspecialchars($_POST['message']))), 70) : $message'';
      
      
      
    $fehler '';

      if (empty(
    $name)) {
        
    $fehler 'Bitte geben Sie Ihren Namen an. <br />';
      }
      if (empty(
    $tel)) {
        
    $fehler .= 'Bitte geben Sie Ihre Telefonnummer an. <br />';
      }
      if (
    filter_var($emailFILTER_VALIDATE_EMAIL) === false) {
          if (empty(
    $email)){
             
    $fehler .=  'Bitte geben Sie Ihre E-Mail-Adresse an. ';
          }
          else {  
            
    $fehler .= 'Die angegebene E-Mail-Adresse hat nicht das richtige Format, <br />bitte prüfen Sie auf eventuelle Tippfehler. ';
          }
      }
      if (empty(
    $message)) {
        
    $fehler .= 'Bitte füllen Sie das Nachrichtenfeld aus. ';
      }
      if (
    strlen($fehler) > 0) {
        
    formausgeben($name$tel$email$message$fehler);
      } else {
        echo 
    '<p class="success">Kontaktformular erfolgreich versendet!<br /><br /><br />Sehr geehrte/r Frau/Herr '.$name .',<br /><br />
        wir haben Ihre Anfrage erhalten und werden uns sobald wie möglich mit Ihnen in Verbindung setzen.</p>'
    ;
     
          
         
    /* Mailversand */ 




    danke im voraus für

    PS: Für verbesserunsvorschläge im vorhandenen Code wäre ich auch sehr dankbar, obwohl dieser zumindest einwandfrei funktioniert

  • #2
    Ich denke am leichtesten Wäre die Fehlermeldung in ein Array umzuwandeln und abzufragen wie die length-Eigenschaft ist, wenn größer 1 dann...
    Joa, aber könntest auch einfach einen Zähler setzen und dann den Abfragen. Die Array-Variante wäre besser wenn du dazu auch noch die verschiedenen Fehler ausgeben möchtest.
    PHP-Code:
      $fehler '';
      
    $fehlerCount 0;
      if (empty(
    $name)) {
        
    $fehler 'Bitte geben Sie Ihren Namen an. <br />';
        
    // $fehlerCount++;
      
    }
      if (empty(
    $tel)) {
        
    $fehler .= 'Bitte geben Sie Ihre Telefonnummer an. <br />';
        
    // $fehlerCount++;
      

    //...
    if (strlen($fehler) > 0) { 
        if(
    $fehlerCount 1){
            echo 
    "Bitte füllen Sie alle Felder aus.";
        }else{
            echo 
    $fehler;
        }
    }
    // bzw
      
    $fehlerArray= array();
      if (empty(
    $name)) {
        
    $fehlerArray[] = 'Bitte geben Sie Ihren Namen an. <br />';
      }
      if (empty(
    $tel)) {
        
    $fehlerArray[] = 'Bitte geben Sie Ihre Telefonnummer an. <br />';
      }
    if(
    count($fehler) > 0){
        foreach(
    $fehlerArray as $fehler){
            echo 
    $fehler;
        }

    PHP-Code:
    //...
    stripslashes(trim(htmlspecialchars($_POST['email']))) 
    Da bist du ja ganz wild. Beim trim() würde ich noch mitgehen, für den Rest*:
    - Nutz bei Datenbanken eine Escape-Funktion(mysqli_real_escape_string z.B.), oder gleich prepared Statements
    - Nutz beim Ausgeben der Daten eine der Escape-Funktionen, htmlentities oder htmlspecialchars
    (*) - meine Meinung, solltest dich da selbst noch weiter erkundigen
    [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
    [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

    Kommentar


    • #3
      @vsenol:
      Ganz ehrlich, überleg dir ein wirkliches Konzept zur Validierung. Alles andere kann nur in Flickschusterei ausarten. Bei dir haben selbst redundante Redundanzen noch Redundanzen.

      Andererseits, wahrscheinlich ist es dafür längst zu spät, die Architektur ist schon misslungen und auch eigene Klassen zur Validierung zu erstellen wäre nur vergebliche Mühe.

      Dennoch hier ein Vorschlag:
      PHP-Code:
      isset($_POST['name'])  && is_string($_POST['name'])  ? $name stripslashes(ucwords(trim(htmlspecialchars($_POST['name'])))) : $name''
        isset(
      $_POST['tel'])  && is_string($_POST['tel'])  ? $tel =  stripslashes(trim(htmlspecialchars($_POST['tel']))) : $tel''
        isset(
      $_POST['email'])  && is_string($_POST['email'])  ? $email =  stripslashes(trim(htmlspecialchars($_POST['email']))) : $email''
        isset(
      $_POST['message'])  && is_string($_POST['message'])  ? $message wordwrap(stripslashes(trim(htmlspecialchars($_POST['message']))), 70) : $message''
      Anstatt diesen Copy+Paste-Salat zu kreieren - wie wär's mit einer zusätzlichen Funktion die du dann nur noch aufrufen musst? So:
      PHP-Code:
      $name meine_funktion('name');
      $tel meine_funktion('tel');
      $email meine_funktion('email');
      $message meine_funktion('message'); 
      In diese Funktion lagerst du dann alles von oben aus.

      Naja aber für die nächste Application: Eine Validator-Klasse in die du Feldnamen und Regeln reinwirfst und die dir dann Fehler rausgibt wäre ein besseres Konzept.

      Beispiel nach Laravel:
      PHP-Code:
      $validator Validator::make(
          
      Input::all(),
          array(
      'email' => 'required|email''name' => 'required|min:5')
      );

      if (
      $validator->fails()) // The given data did not pass validation
      {
          
      $messages $validator->messages();

          if (
      sizeof($messages) > 2) {
              echo 
      'Bitte alle Felder korrekt ausfüllen!';
          } else {
              ... 
      // messages ausgeben
          
      }
          

      (Ungefähr) So einfach könnte es sein!

      Kommentar


      • #4
        Uff Schuster bleib bei deinen Leisten heißt es ja nicht umsonst, ich poste euch mal den gesamten Code so viel ist es gar nicht, ich muss die Daten aus den Feldern auslesen und per Mail verschicken, natürlich eben noch einfache Überprüfungen machen ob alles so ist wie es sein sollte.

        vielen Dank für eure Hilfen aber ich bin in PHP nicht so gut als dass ich eure Vorschläge umsetzen könnte, ich bin Frontendentwickler und habe sehr sehr selten mit PHP zu tun.

        Bitte seid so nett und helft mir in meinem Code dass rauszunehmen oder zu verbessern was eindeutig zu viel oder von schlechter Qualität ist.

        Also mit Hilfe meine ich nennt mir bitte beim Namen was genau falsch ist. Weil der Code funktioniert eigentlich einwandfrei

        PHP-Code:
        <?php
        if (isset($_POST['gesendet'])) {
          
        formverarbeiten();
        } else {
          
        formausgeben();
        }


        function 
        formausgeben($name''$tel =''$email =''$message ='',  $fehler=''

          if (!empty(
        $fehler)) {
            echo 
        '<p class="error">'.$fehler.'</p>';
          }
        ?>
              
            <form accept-charset="utf-8" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="post" class="TTWForm">
              <div id="field1-container" class="field f_50">
                <label for="field1">Ihr Name*</label>
                <input name="name" id="field1" type="text" value="<?php echo $name?>">
              </div>
              <div id="field2-container" class="field f_50">
                <label for="field2">Ihre Telefonnummer*</label>
                <input name="tel" id="field2" type="text" value="<?php echo $tel?>">
              </div>
              <div id="field5-container" class="field f_50">
                <label for="field5">Ihre E-Mail Adresse*</label>
                <input name="email" id="field5" type="email" value="<?php echo $email?>">
              </div> 
              <div id="field4-container" class="field f_100">
                <label for="field4">Ihre Nachricht</label>
                <textarea rows="5" cols="20" name="message" id="field4"><?php echo $message?></textarea>
              </div>
              <div id="form-submit" class="field f_100 clearfix submit">
                <input name="gesendet" type="submit" value="Abschicken">
              </div>
            </form>

        <?php
        }
        function 
        formverarbeiten()                  
        {
          isset(
        $_POST['name'])  && is_string($_POST['name'])  ? $name stripslashes(ucwords(trim(htmlspecialchars($_POST['name'])))) : $name'';
          isset(
        $_POST['tel'])  && is_string($_POST['tel'])  ? $tel =  stripslashes(trim(htmlspecialchars($_POST['tel']))) : $tel'';
          isset(
        $_POST['email'])  && is_string($_POST['email'])  ? $email =  stripslashes(trim(htmlspecialchars($_POST['email']))) : $email'';
          isset(
        $_POST['message'])  && is_string($_POST['message'])  ? $message wordwrap(stripslashes(trim(htmlspecialchars($_POST['message']))), 70) : $message'';
          
          
          
        $fehler '';
          if (empty(
        $name)) {
            
        $fehler 'Bitte geben Sie Ihren Namen an. <br />';
          }
          if (empty(
        $tel)) {
            
        $fehler .= 'Bitte geben Sie Ihre Telefonnummer an. <br />';
          }
          if (
        filter_var($emailFILTER_VALIDATE_EMAIL) === false) {
              if (empty(
        $email)){
                 
        $fehler .=  'Bitte geben Sie Ihre E-Mail-Adresse an. ';
              }
              else {  
                
        $fehler .= 'Die angegebene E-Mail-Adresse hat nicht das richtige Format, <br />bitte prüfen Sie auf eventuelle Tippfehler. ';
              }
          }
          if (empty(
        $message)) {
            
        $fehler .= 'Bitte füllen Sie das Nachrichtenfeld aus. ';
          }
          if (
        strlen($fehler) > 0) {
            
        formausgeben($name$tel$email$message$fehler);
          } else {
            echo 
        '<p class="success">Kontaktformular erfolgreich versendet!<br /><br /><br />Sehr geehrte/r Frau/Herr '.$name .',<br /><br />
            wir haben Ihre Anfrage erhalten und werden uns sobald wie möglich mit Ihnen in Verbindung setzen.</p>'
        ;
         
              
             
        /* Mailversand */  
            
        $to='blabla@web.de';    
            
        $subject='Anfrage an blabla Verfahren GmbH';     
            
        $mailtext='Kundenkontakt über Kontaktformular
            
            Name: '
        .$name.'
            Telefon: '
        .$tel.'
            E-Mail: '
        .$email.'
            
            
        '
        .$message;
              
            
        $header   = array();
            
        $header[] = "MIME-Version: 1.0";
            
        $header[] = "Content-type: text/plain; charset=UTF-8";
            
        $header[] = "From:" .$name;  
            
        $header[] = "X-Mailer: PHP/" phpversion();   
              
           
                @
        mail($to$subject$mailtextimplode("\r\n"$header));
              } 
            }
            
        ?>
          </div>

        Kommentar


        • #5
          Wenn der Code funktioniert, ist nichts falsch... Was genau erwartest du nun von uns?

          Kommentar


          • #6
            hehe ich erwarte nicht ich bitte drum, mir beim Namen zu nennen wo ihr Probleme seht, z.B. hatte VPh geschrieben,

            Da bist du ja ganz wild. Beim trim() würde ich noch mitgehen, für den Rest*:
            - Nutz bei Datenbanken eine Escape-Funktion(mysqli_real_escape_string z.B.), oder gleich prepared Statements
            - Nutz beim Ausgeben der Daten eine der Escape-Funktionen, htmlentities oder htmlspecialchars
            (*) - meine Meinung, solltest dich da selbst noch weiter erkundigen
            ich verstehe nicht genau was da zu viel ist, übrigens wird ja keine Datenbank benutzt, weil ja alles per Mail verschickt wird.
            Eure bisherige Hilfestellung bringt mich auch schon weiter, dafür bedanke ich mich recht herzlich


            schöne Grüße

            Kommentar


            • #7
              Er vertritt die Ansicht, dass du statt htmlspecialchars vor dem Speichern der Daten zu benutzen das erst beim Ausgeben tun sollst (also die Rohdaten auch als Rohdaten speichern und erst bei der Ausgabe transformieren sollst).

              Vereinfachtes Beispiel:
              PHP-Code:
              $name $_POST['name'];

              speichere($name); // Irgendwie in DB speichern 
              PHP-Code:
              $name lade('name'); // Irgendwie aus DB lesen

              echo htmlspecialchars($name); 
              Niemand zwingt dich das zu tun, ist aber populär.

              Kommentar


              • #8
                Ok ich habe den Code so wie ich ihn wollte, hätte noch 2 kleine Fragen:

                1. Wie kann ich in diesem Codefragment das Absendedatum in die E-Mail einfügen und
                2. gibt es auch eine Möglichkeit text/plain von PHP aus zu formatieren (ausser durch Zeilenumbrüche im Editor)?


                PHP-Code:
                $to='bla@bla.de';    //E-Mail-Adresse des Kunden eintragen
                    
                $subject='Anfrage an blabla GmbH';     
                    
                $mailtext='Kundenkontakt über Kontaktformular
                    
                    Name: ' 
                .$name'
                    Telefon: ' 
                .$tel'
                    E-Mail: ' 
                .$email'
                    
                    
                '
                .$message;
                      
                    
                $header   = array();
                    
                $header[] = "MIME-Version: 1.0";
                    
                $header[] = "Content-type: text/plain; charset=UTF-8";
                    
                $header[] = "From:" .$name;  
                    
                $header[] = "X-Mailer: PHP/" phpversion();   
                      
                   
                        @
                mail($to$subject$mailtextimplode("\r\n"$header)); 

                Kommentar


                • #9
                  1. Wie kann ich in diesem Codefragment das Absendedatum in die E-Mail einfügen und
                  Indem du es an den Mailtext anhängst? Seltsame Frage. Vielleicht suchst du date oder so.

                  2. gibt es auch eine Möglichkeit text/plain von PHP aus zu formatieren (ausser durch Zeilenumbrüche im Editor)?
                  Wie meinst du das konkret? Also, welche Formatierungen schweben dir da vor? (Technisch gesehen ist die Antwort sicherlich „Ja“, denn prinzipiell möglich ist vieles. )

                  Am Rande:

                  PHP-Code:
                  $header[] = "From:" .$name
                  Das dürfte anfällig für E-Mail-Injection sein.

                  - http://securephpwiki.com/index.php/Email_Injection
                  - http://php-de.github.io/jumpto/faq/#mailerklasse

                  Kommentar

                  Lädt...
                  X