von hinten durch die Brust ins Auge
Yin
- php
2 ChrisB0 Tom3 Gunnar Bittersmann0 Tom
0 Gunnar Bittersmann0 niklaskamenisch
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.
}
}
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
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
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
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???
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>
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
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
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
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?
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
@@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'
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
@@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'
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
@@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'
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.