Yin: von hinten durch die Brust ins Auge

Hi,
folgendes Szenario:
Eine Adresse besteht immer aus Strasse, Hausnummer, PLZ, Stadt und Land.
Ein User kann bis zu 4 Adressen in ein Formular eingeben.
Sobald er ein Feld füllt, müssen zwingend auch die übrigen Felder zu der Adresse gefüllt sein. Es ist Egal, ob er das erste Adressfeld leer lässt und erst im zweiten Adressfeld eine Adresse eingibt:
Hier meine Lösungsidee die funktioniert. Meine Frage lautet: mache ich es mir selbst zu kompliziert?

// Array für evtl. auftretende Fehler anlegen  
	$errors = array();  
	// Prüfen, ob überhaupt Adressen eingegeben wurden und -falls ja- ob die Angaben vollständig sind und ob unerlaubte Zeichen enthalten sind  
	$vollstaendige_adressangaben_bei=array();  
	// Wurde in eines der Adressfelder etwas eingegeben  
	foreach($_POST['strasse'] as $key => $value){  
		if(!empty($_POST['strasse'][$key]) or  
		!empty($_POST['hausnummer'][$key]) or  
		!empty($_POST['plz'][$key]) or  
		!empty($_POST['stadt'][$key]) or  
		!empty($_POST['land'][$key])){  
			  
			// Überprüfung, ob auch die zugehörigen anderen Adressfelder gefüllt sind  
			if(empty($_POST['strasse'][$key]) or  
			empty($_POST['hausnummer'][$key]) or  
			empty($_POST['hausnummer'][$key]) or  
			empty($_POST['stadt'][$key]) or  
			empty($_POST['land'][$key])){  
				echo "kontrollausgabe: Leere Felder gefunden";  
				$errors[] = "Ihre ".$key.". eingegebene Adresse ist unvollständig. Eine Adresse muss immer aus Strasse, Hausnummer, PLZ, Stadt und Land bestehen";  
				continue;  
			}  
			else $vollstaendige_adressangaben_bei[$key]=1;  
		}  
		// Adressangaben vollständig  
		// Nun Überprüfung, ob die Adressfelder unerlaubte Zeichen enthalten  
		else{  
			//Hier werde ich mit preg_match die Zeichen kontrollieren. Habe ich noch nicht, da ich mit den Regular Expressions noch so meine Probleme habe.  
		}  
	}
  1. Hi,

    	// Wurde in eines der Adressfelder etwas eingegeben  
    	foreach($_POST['strasse'] as $key => $value){  
    		if(!empty($_POST['strasse'][$key]) or  
    		!empty($_POST['hausnummer'][$key]) or  
    		!empty($_POST['plz'][$key]) or  
    		!empty($_POST['stadt'][$key]) or  
    		!empty($_POST['land'][$key])){  
    			  
    			// Überprüfung, ob auch die zugehörigen anderen Adressfelder gefüllt sind  
    			if(empty($_POST['strasse'][$key]) or  
    			empty($_POST['hausnummer'][$key]) or  
    			empty($_POST['hausnummer'][$key]) or  
    			empty($_POST['stadt'][$key]) or  
    			empty($_POST['land'][$key])){  
    				echo "kontrollausgabe: Leere Felder gefunden";
    
      
    
    > Meine Frage lautet: mache ich es mir selbst zu kompliziert?  
      
    M.E. ja. (Außerdem sehe ich da noch gar nicht, wie du die mögliche Eingabe mehrerer Addressdatensätze behandelst …?)  
      
    Ich würde gleich die Formularfelder so benennen, dass die Daten zu einem „Datensatz“ auch als (Unter-)Array ankommen.  
      
    ~~~html
    <input name="addresse[0][strasse]" …>  
    <input name="addresse[0][hausnummer]" …>  
    …  
      
    <input name="addresse[1][strasse]" …>  
    <input name="addresse[1][hausnummer]" …>  
    …
    

    (print_r/var_dump auf $_POST klärt auf, wenn du nicht gleich erkennen kannst, was für eine Struktur das ergibt.)

    Über all diese Datensätze kann man dann bequem in einer Schleife laufen, und dabei gleich für einen kompletten Datensatz checken, ob „alles leer“ oder „alles gefüllt“, bzw. auch gleich noch die weiteren Validitätsprüfungen (erlaubte Zeichen, etc.) vornehmen.

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. M.E. ja. (Außerdem sehe ich da noch gar nicht, wie du die mögliche Eingabe mehrerer Addressdatensätze behandelst …?)

      Doch, spiel's mal durch: Ich hätte anstelle von  foreach auch ein simple for-schleife von 1 bis 4 laufen lassen können:
      Er geht der reihe nach für jede Adresse alle Eingabefelder durch. Sobald er ein gefülltes Eingabefeld findet, testet er für diese Adresse, ob auch alle anderen zugehörigen Eingabefelder gefüllt sind.
      Das funktioniert prima, nur mag ich es auch, wenn der code "schön" & "schlank" ist :-)
      Daher meine Fragestellung hier im Forum.

      Das mit den zweidimensionalen Arrays ist eine gute Idee. Das Probier ich mal in einer v2 des Dokuments.

      Grüße
      Yin

      1. Hello,

        Das mit den zweidimensionalen Arrays ist eine gute Idee. Das Probier ich mal in einer v2 des Dokuments.

        Zur ordentlichen Prüfung gehört dann, festzustellen, ob genau die Name-Value-Pärchen angekommen sind, die Du erwartet hast, nicht mehr und auch nicht weniger!

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
    2. Hi,
      habe mal testweise die Felder des Formulars in

        
      name="adresse[0][strasse]  
      name="adresse[0][hausnummer]  
      
      

      usw. umbenannt.

      Jetzt hadere ich gerade damit, dass meine Kontrolle, ob ein array leer ist, nicht funktioniert:

        
      foreach($_POST['adresse'] as $adresse){  
      if(!empty($adresse)) {  
      echo "nicht leeren adress-block gefunden<br>";  
      echo $adresse[strasse]."<br>";  
      }  
      }  
      
      

      Habe vier Adressblöcke in dem Formular.
      ich gebe nur in das Feld strasse des ersten adressblocks "test" ein.
      Auf den Bildschirm schreibt er:
      nicht leeren adress-block gefunden
      test
      nicht leeren adress-block gefunden

      nicht leeren adress-block gefunden

      nicht leeren adress-block gefunden"

      Wie kann das sein???

      1. Hello,

        habe mal testweise die Felder des Formulars in

        name="adresse[0][strasse]"
        name="adresse[0][hausnummer]"

        
        > usw. umbenannt.  
          
        [code lang=php]  
        if (isset($\_POST['adresse'][0]))  
        {  
           $\_chk[0] = address\_check($\_POST['adresse'][0]);  
        }  
          
        #---------------------  
        function address\_check($\_address, $errortxt='')  
        {  
            if (!is\_array($\_address))  
            {  
                $errortxt = 'Adresse ist kein Array');  
                return false;  
            }  
          
            if (count($\_address) != 4)  
            {  
                $errortxt = 'zuviele Datenfelder');  
                return false;  
            }  
          
            if (empty($\_address['name']))  
            {  
                $errortxt = 'Name fehlt');  
                return false;  
            }  
          
            if (empty($\_address['name']))  
            {  
                $errortxt = 'Name fehlt');  
                return false;  
            }  
          
            if (empty($\_address['strasse']))  
            {  
                $errortxt = 'Strasse fehlt');  
                return false;  
            }  
          
          
        ### usw.  
          
          
          
            return true;  
        }  
          
          
          
          
          
          
          
          
          
        Liebe Grüße aus dem schönen Oberharz  
          
          
        Tom vom Berg  
        ![](http://selfhtml.bitworks.de/Virencheck.gif)  
          
        
        -- 
         ☻\_  
        /▌  
        / \ Nur selber lernen macht schlau  
        <http://bergpost.annerschbarrich.de>
        
        1. Danke für den Vorschlag,

          hier laufe ich aber wieder in die Situation, dass meine empty(..) Überprüfung immer false ausgibt.
          ChrisB hat das Problem auf den Punkt gebracht:
          ein Array ist auch dann nicht empty, wenn es nur einen leeren String enthält und aus dem Formular erhalte ich so für jede adresse ein array mit ggf. leeren Strings als Inhalt.
          Muss also direkt prüfen, ob ein leerer String in dem Array-Feld steht. Emptygeht leider nicht.

          Gruß
          Yin

          1. Hello,

            hier laufe ich aber wieder in die Situation, dass meine empty(..) Überprüfung immer false ausgibt.
            ChrisB hat das Problem auf den Punkt gebracht:
            ein Array ist auch dann nicht empty, wenn es nur einen leeren String enthält und aus dem Formular erhalte ich so für jede adresse ein array mit ggf. leeren Strings als Inhalt.
            Muss also direkt prüfen, ob ein leerer String in dem Array-Feld steht. Emptygeht leider nicht.

            Also geht es Dir nicht um den strukturellen Aufbau, sondern um die Möglichkeiten, die PHP für die Plausibilitätsprüfungen bietet?

            Da gibt es die Filterfunktionen

            http://de3.php.net/manual/en/book.filter.php

            speziell:
            http://de3.php.net/manual/en/function.filter-input-array.php
            http://de3.php.net/manual/en/function.filter-var.php

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
             ☻_
            /▌
            / \ Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
            1. Hi,

              ein Array ist auch dann nicht empty, wenn es nur einen leeren String enthält und aus dem Formular erhalte ich so für jede adresse ein array mit ggf. leeren Strings als Inhalt.
              Muss also direkt prüfen, ob ein leerer String in dem Array-Feld steht. Emptygeht leider nicht.

              Doch, wenn du die einzelnen Array-Elemente vorher zu einem Wert implode-st ;-)

              (Dabei aber auch beachten, was empty alles als „leer“ ansieht.)

              MfG ChrisB

              --
              RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
      2. Hi,

        Jetzt hadere ich gerade damit, dass meine Kontrolle, ob ein array leer ist, nicht funktioniert:

        foreach($_POST['adresse'] as $adresse){
        if(!empty($adresse)) {

          
        Ein Array, das Einträge enthält, ist nicht empty. Ob der Wert dieser Einträge dabei ggf. nur ein Leerstring ist, ist uninteressant.  
          
        MfG ChrisB  
          
        
        -- 
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
        
  2. Hello,

    folgendes Szenario:
    Eine Adresse besteht immer aus Strasse, Hausnummer, PLZ, Stadt und Land.
    Ein User kann bis zu 4 Adressen in ein Formular eingeben.

    Schon schlecht geregelt.

    Sobald er ein Feld füllt, müssen zwingend auch die übrigen Felder zu der Adresse gefüllt sein. Es ist Egal, ob er das erste Adressfeld leer lässt und erst im zweiten Adressfeld eine Adresse eingibt:
    Hier meine Lösungsidee die funktioniert. Meine Frage lautet: mache ich es mir selbst zu kompliziert?

    Ja. Zu einfach gedacht und daher zu kompliziert zu programmieren. :-)

    Bau Dir einen Vorgang, der viermal dasselbe Formular und dieselbe Validierungsfunktion aufruft. Das ist viel weniger Aufwand.

    Dass Du in der zugehörigen Sessiondatei trotzdem die vier Datensätze zwischenspeichern kannst, bevor sie dann persistent gemacht werden, steht auf einem ganz anderen Blatt.

    Du brauchst also nur ein leicht modifiziertes "Affenformular" zu bauen, mit dessen Hilfe man vor- und zurückblättern kann.

    Und auch von mir die Frage an Dich: wie gedenkst Du die Daten anschließend dauerhaft abzuspeichern. Wie sieht das zugehörige Datenmodell dafür aus?

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
  3. @@Yin:

    nuqneH

    Eine Adresse besteht immer aus Strasse, Hausnummer, PLZ, Stadt und Land.

    Getrennte Eingabefelder für Straße und Hausnummer halte ich für ungünstig. Ein Leerzeichen ist leichter getippt als man von einem Eingabefeld zum anderen springt. Einige Nuzter werden trotzdem die Hausnummer hinter die Straße schreiben und das Hausnummern-Feld leer lassen.

    In den allermeisten Fällen braucht man auch Straße und Hausnummer nicht als getrennte Daten. Dann sollte man sie auch nicht getrennt abfragen.

    Sobald er ein Feld füllt, müssen zwingend auch die übrigen Felder zu der Adresse gefüllt sein.

    Auch das ist problematisch. Was, wenn ein Nutzer vom Lande in einer Straße wohnt, wo es gar keine Hausnummern gibt? Oder das Dorf so klein ist, dass es nicht einmal Straßennamen gibt? Oder der Nutzer in einem Land lebt, wo es keine PLZ gibt?

    Nutzer zu Fake-Eigaben zu zwingen, ist nicht nutzerfreundlich. Und mit gefaketen Werten bist du nicht besser dran als mit gar keinen Werten, eher schlechter.

    Du könntest bei leeren Eingabefeldern eine Warnung (keinen Fehler) anzeigen und wenn der Benutzer bestätigt, dass seine Eingabe korrekt ist, dann ist es eben so. Die Felder sind dann halt leer.

    Qapla'

    --
    Wer möchte nicht lieber durch Glück dümmer als durch Schaden klüger werden? (Salvador Dalí)
    1. Hello,

      Getrennte Eingabefelder für Straße und Hausnummer halte ich für ungünstig.

      Ist aber für das amtomistische Modell richtig, auch wenn es nachher nicht richtig bedient wird.

      Datensätze, die dann in Hausmummer keinen Eintrag haben, müssen eben händisch nachgeprüft werden.

      Auch das ist problematisch. Was, wenn ein Nutzer vom Lande in einer Straße wohnt, wo es gar keine Hausnummern gibt? Oder das Dorf so klein ist, dass es nicht einmal Straßennamen gibt? Oder der Nutzer in einem Land lebt, wo es keine PLZ gibt?

      Es sollte ein Statusfeld geben, in dem man sich merken kann, ob der DS neu, zu sichten, gesichtet, in Prüfung, für richtig gefunden, als falsch markiert ist.

      Du könntest bei leeren Eingabefeldern eine Warnung (keinen Fehler) anzeigen und wenn der Benutzer bestätigt, dass seine Eingabe korrekt ist, dann ist es eben so. Die Felder sind dann halt leer.

      Und der Status wird schon mal auf "zu sichten" gesetzt.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. @@Tom:

        nuqneH

        Ist aber für das amtomistische Modell richtig, auch wenn es nachher nicht richtig bedient wird.

        Richtig ist, was dem Nutzer dient.

        Qapla'

        --
        Wer möchte nicht lieber durch Glück dümmer als durch Schaden klüger werden? (Salvador Dalí)
        1. Hi,

          ich muss mich mal hier einklinken:
          Ich komme leider nicht drum rum, vier mögliche Adresseingaben anzubieten. Und da das Ganze als Vorlauf für einen Navigationsdemonstrator dient, muss jede Adresse aus Land, Stadt, PLZ, Strasse und Hausnummer bestehen.
          Ich will in dem Formular möglichst alle Fehleingaben usw. Abfangen, weil das Fehlerhandling hinten raus viel mehr Probleme bereiten wird.

          Gruß
          Yin

  4. @@Yin:

    nuqneH

    Eine Adresse besteht immer aus Strasse, Hausnummer, PLZ, Stadt und Land.

    An Eingabefelder für Adresszusätze wie „bei Müller“ oder „z.H. Frau Schulze“ oder „2. HH, Stfl. rechts“ hast du gedacht?

    Qapla'

    --
    Wer möchte nicht lieber durch Glück dümmer als durch Schaden klüger werden? (Salvador Dalí)
  5. Hi,

    für die Überprüfung der Daten würde ich die Felder als Array speichern und diese als Schleife überprüfen.

    Alternativ wäre es auch sinnvoll teile in funktionen auszulagern.
    Der rest wurde glaub ich schon gesagt.