Kontaktformular (Fehlermeldung)

  • Hey zusammen,

    unzwar ich habe mir ein kleines Kontaktformular gebaut.

    Und das meiste funktioniert auch, bis auf 2 Fehlermeldungen. Unzwar ich habe zum spam schutz 3 radio-felder wovon nur 1ns richtig ist. Nun habe ich ne Bedingung aufgestellt wenn nichts angekreuzt ist dann soll es dies ausgeben und wenn das falsche angekreuzt wurde wird das ausgegeben. Nun habe ich noch dazu ein hidden feld erstellt um abzufragen ob das Formular schon abgesendet wurde und falls dies zutrifft werden die fehler ausgegeben.

    Nun aber werden gleich beide Fehler ($fehler5 & $fehler 6) ausgegeben. Ich denke weil ich ja da überprüfe ob es leer ist und dann nochmal überprüfe ob das richtige kreuz angekreuzt wurde aber ich weiß nicht wie ichs lösen soll..

    Hier mein php script:

    Kann man denn bei der textarea die value nicht speichern ?

    Gruß, Stef

    • Das Wort "unzwar" findet man in keinem Duden
    • Ein else vor if ($eingabeUser !== "Pferd") sollte das Problem beheben
    • Warum bastelst du mehrere Fehler zusammen, um sie dann in ein Array zu packen? Nimm doch gleich ein Array und spare dir $fehler1 bis $fehler6
    • $fehlerarr = array($fehler1,$fehler2,$fehler3,$fehler4,$fehler5,$fehler6); sollte dir bei aktiviertem Errorreporting einiges um die Ohren hauen, wenn es keine Fehler gibt

    Getestet ist das nicht:

    3 Mal editiert, zuletzt von Theas1965 (25. August 2016 um 13:14)

    • Offizieller Beitrag
    • Offizieller Beitrag

    Mit dem jetzigen Wissenstand mag das sein, aber eigentlich ist er immer aufgeschlossen, neues zu lernen, sonst hätte ich mir die Mühe nicht gemacht... ;)

    Ist allerdings ein Logikfehler drin, musste ich gerade feststellen, es muß über array_map laufen, da array_filter nur auf Basis von true und false auswertet:

  • Hi,

    oh... habe manches vergessen... :roll:

    @Arne Drews : Warum setzt du denn vor dem überprüfen ob index submitted abgesendet wurde die variablen ? Und habe nun mal dein script ausprobiert. Funktioniert auch. Bis auf, das das Wort welches richtig ist auch ausgegeben wird und wenn ich keine foreach schleife beim ausgeben im html teil mache gibt er mie die fehlermeldung : Array to string conversion.

    Theas1965 : Habe deins auch mal ausprobiert. Funktioniert auch gut.

    Habs nun so gemacht:

    Stef

    • Offizieller Beitrag
    Zitat

    Warum setzt du denn vor dem überprüfen ob index submitted abgesendet wurde die variablen ?


    Du kannst die auch leer definieren und dann innerhalb des DIV aus den POST-Daten setzen, wie Theas1965 es gemacht hat. Ist vom Ergebnis dasselbe.

    Zitat

    Bis auf, das das Wort welches richtig ist auch ausgegeben wird und wenn ich keine foreach schleife beim ausgeben im html teil mache gibt er mie die fehlermeldung : Array to string conversion.

    Dann hast Du vermutlich meine Korrektur aus #5 noch nicht gehabt. ;)

  • Hey,

    eure 2 Kommentare waren als ich gepostet habe noch nicht da.

    Ok. Die stehen ja außerhalb, damit man auch im html teil auf diese zugreifen kann ?

    Dein code überfordert mich grad schon etwas, aber man möchte ja was lernen :) .


    Zu implode. Mann muss doch beim if(...) eine { } machen und da kommt dann das implode rein oder ?

    Zu meinem Spam-Schutz:

    Ich habe ja 3 sachen zur auswahl (Haare Pferd Stein) ist es nicht etwas zu leicht für ein spambot oder schafft er nicht das richtige auszuwählen ?


    Jetzt funktioniert auch deins :)

    Arne Drews : Was sind denn für dich die wichtigsten array funktionen ?

    Vielen Dank,

    Gruß,Stef

    3 Mal editiert, zuletzt von Stef (25. August 2016 um 17:55)

    • Offizieller Beitrag

    Hi,

    Also array_map() und array_filter() machen vom Grunde her das gleiche.
    Sie führen für jedes Element des übergebenen Array eine Callback-Funktion aus.
    Der Unterschied liegt ganz einfach darin, dass Du bei array_map() für jedes Element den Rückgabewert über return selbst definieren kannst, während array_filter die Rückgabe auf bool castet und alle Elemente, bei denen ein false aus dem Callback kommen quasi aus dem Array entfernt.

    Daher nutze ich erst array_map(), um die Fehlermeldungen oder null für keinen Fehler in das Array $aErrors zu schreiben und lasse das ganze dann noch einmal durch array_filter() laufen, um die null ( hier äquivalent zu false ) Werte zu entfernen. Übrig bleiben dann nur noch die Fehler.

  • Hey,

    aso ok.

    Und wie kommst du auf data[0], data[1] und data[2] ?

    Hier:

    PHP
    [                    [$name, 'Bitte geben Sie Ihren Namen an!'],                    [$email, 'Bitte geben Sie Ihre E-Mail an!'],                    [$betreff, 'Bitte geben Sie Ihren Betreff an!'],                    [$nachricht, 'Bitte geben Sie Ihre Nachricht an!'],                    [$eingabeuser, 'Fehler bei Angabe des Kreuzes!', 'Pferd']                ]

    du hast ja da nach der funktion diese [] klammern. Warum machst du diese umrum der anderen [] wo die var und die fehlermeldung drinsteht. Ich denke du machst diese um diese in ein array zu packen ?
    Dazu: Tust du indem die die va und die fehlermeldung in einem Array schreibst, sagen das die fehlermeldung nur erscheinen soll wenn z.b. $name fehlt?

    Stef

    • Offizieller Beitrag

    Hallo,

    Ich übergebe der Callback-Funktion ja jedes Array-Element als $data, das ist bspw. im ersten Durchlauf das hier:

    PHP
    [$name, 'Bitte geben Sie Ihren Namen an!']

    ...was ja ebenfalls ein Array ist. In diesem Fall mit zwei Elementen, also $data[0] und $data[1].
    Im Falle Deines Hakens willst Du aber eine "erweiterte" Prüfung auf den Wert haben. Für den Durchlauf bekommt die Callback-Funktion im Gegensatz zu den anderen Durchläufen ein Array mit drei Elementen:

    PHP
    [$eingabeuser, 'Fehler bei Angabe des Kreuzes!', 'Pferd']

    Also prüfe ich einfach, ob $data[2], also ein drittes Array-Elelment existiert und prüfe entsprechend auf leer und Wert oder halt nur auf leer.

    Gruß Arne

  • Hey,

    aso ok. So ist das. Ich glaube ich habs verstanden.

    Ich habe jetzt die funktion an meiner registrierform angewandt,
    die funktioniert auch soweit.

    Aber ne frage hab ich dazu doch noch:


    PHP
    $fehler = !isset($daten[0]) ? (empty($daten[0])) : (!empty($daten[0]));

    Warum gibt es nur was aus wenn ich nach dem : empty und nicht !empty schreib? Ich sage doch: wenn $daten[0] nicht exsestiert , dann $daten[0] ist leer, sonst daten[0] ist nicht leer ?

    Gruß, Stef

    • Offizieller Beitrag

    Hallo,

    Nicht ganz... ;)
    Aber Du machst jetzt ja auch was anderes... Das ist nicht die gleiche Logik, die ich Dir gegeben habe. Soll es denn so sein oder hast Du Dich vertan?

    Bei Dir passiert folgendes:

    Das macht so eigentlich keinen Sinn, denn das erste Element existiert immer bei Deiner Grundlage. Damit würde er eh nie das empty() zwischen dem Fragezeichen und dem Doppelpunkt anwenden.

    Bei mir war die Logik anders:

    Wenn Du die Logik mit dem Vergleich der Eingabe nicht mehr benötigst, ist das auch kürzer und einfacher abbildbar:


    was das gleiche ist, wie:

    PHP
    $fehler = empty( $data[0] )? $data[1]: null;

    Dadurch hast Du in $fehler ein Array, in dem jedes Element entweder eine Fehlermeldung oder null ist.
    array_filter() "schmeisst" nun jedes Element, das auf bool gecastet nicht true ergibt aus dem Array raus. Und da man bei array_filter die Callback-Funktion auch weglassen kann, sieht das ganze in Kurzform so aus:

    PHP
    $fehler = array_filter( $fehler );


    Das einzige, was ich gemacht habe ist, dass ich anstelle von $fehler die komplette array_map()-Verarbeitung als Parameter an array_filter() übergeben habe, was am Ende nur das Ergebnis von array_map() ist, nämlich das Array $fehler mit den Fehlermeldungen oder eben dem Wert null in den Elementen.

  • Hey,

    Wollte es mal testen und habe mich anscheinend vertan.

    Aso ok. So weit habe ich nicht gedacht.

    Meinst du das man erstmal mit array map dies durchläuft und darin die ganzen vars mit fehlermeldung speichert und dann die function returnt mit z.b. folgendem code:


    und dann außerhalb dieser durch den array_filter jagen zu lassen?

    PHP
    $fehler = array_filter($errors);

    Und dann z.b. im html teil so ausgeben:

    PHP
    if(isset($fehler) && count($fehler) > 1) //wenn $fehler exsistieren und $fehleranzhal ist größer als 1 
    {
         implode(' , ', $fehler); //gebe diese aus
    }


    Gruß,

    Stef