Formulare - wie kann man nicht alle Felder ausfüllen müssen?

  • Hallo an alle!
    Wir haben eine kleine Frage:
    Wir haben mehrere Felder in einem Formular, die man ausfüllen kann. Jedoch wollen wir es so einstellen, dass man nicht ALLE Felder ausfüllen MUSS. D.h. wenn man lediglich Vorname und Geburtsdatum eingeben würde, oder eine andere Kombination oder ein einzelnes Feld.
    Wie kriegen wir das hin?
    Unser Skript:

    Danke im Voraus!

    Einmal editiert, zuletzt von Arne Drews (22. November 2016 um 16:41) aus folgendem Grund: MOD: Bitte PHP-Tags verwenden, danke

    • Offizieller Beitrag

    Hallo,

    Ihr solltet unabhängig davon das Formular per POST senden lassen

    Dann müsst ihr einfach nur die empfangenen Daten "filtern", ob diese leer sind, als Beispiel:

    ungetestet, sollte aber in etwa hinhauen...

  • Hallo,

    erst mal vielen Dank für die schnelle und ausführliche Antwort.
    Wir haben das alles jetzt so verbessert, allerdings kommen jetzt wieder ziemlich viele Fehlermeldungen:

    [FONT=&quot]Undefined variable: POST in den jeweiligen Zeilen, die wir bei $aFields verwenden, obwohl sie oben im form angegeben ist

    [/FONT][FONT=&quot]Warning[/FONT][FONT=&quot]: array_filter() expects parameter 1 to be array

    [/FONT][FONT=&quot]Warning[/FONT][FONT=&quot]: Invalid argument supplied for foreach()[/FONT][FONT=&quot]

    [/FONT][FONT=&quot]Warning[/FONT][FONT=&quot]: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result

    Wir sind jetzt ein bisschen überfordert. Das ist ein Projekt in für die Uni und wir müssen zum ersten Mal wirklich eine Datenbank in eine Website miteinbauen, weshalb wir noch ziemliche Anfänger sind [/FONT]:help:

  • Ah, ups :kopfpatsch:


    Aber die unteren drei Fehlermeldungen bleiben trotzdem

    • Offizieller Beitrag

    Ah ja, mein Fehler, die Parameter sind vertauscht.
    Bitte die Zeile mal so abändern:

    Code
    [COLOR=#333333]$aFields_Filtered = array_filter([/COLOR][COLOR=#333333]$aFields, [/COLOR][COLOR=#333333]'empty');[/COLOR]


    Die anderen beiden sollten dann aber wieder Folgefehler und damit auch behoben sein.

  • [FONT=&quot]Warning[/FONT][FONT=&quot]: array_filter() expects parameter 2 to be a valid callback, function 'empty' not found or invalid function name

    [/FONT][FONT=&quot]Warning[/FONT][FONT=&quot]: Invalid argument supplied for foreach()

    [/FONT][FONT=&quot]Warning[/FONT][FONT=&quot]: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result

    kommen wieder. Müssen wir da vielleicht noch etwas für den Filter definieren?[/FONT]

    • Offizieller Beitrag

    Das würde bedeuten, dass er die PHP Funktion empty nicht kennt, was ich mir nicht vorstellen kann. Kannst Du bitte nochmal den aktuellen Stand posten? Braucht auch nur der erste PHP-Block bis $sql sein.

    Achso, welche PHP-Version habt ihr?
    findet ihr raus, indem ihr folgendes im PHP-Block einsetzt:

    PHP
    echo phpversion();
  • Wir haben Version 5.6.14 (Danke für Info, wie man das herausfindet)

  • Dann liegt es zumindest nicht nur an uns :D

    Es sind zwei Fehlermeldungen weniger geworden, aber es kommt noch immer:
    [FONT=&quot]Warning[/FONT][FONT=&quot]: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result[/FONT]

    • Offizieller Beitrag

    Das deutet darauf hin, dass die Abfrage zuvor kein Ergebnis liefert.
    So wie es für mich ausssieht, habt ihr das Leerzeichen hinter dem WHERE vergessen, da muss eins hin, weil ansonsten die Query fehl schlägt:

    PHP
    $sql = "SELECT * FROM person WHERE " . $sWhere; // <-- hier ist das Leerzeichen wichtig!


    Sollte der Fehler damit nicht behoben sein, bitte mal nach der Zeile $sql ausgeben lassen und die Ausgabe posten.

  • Leerzeichen hat gefehlt, aber auch mit Leerzeichen kommt die gleiche Fehlermeldung.

    Wenn wir

    Code
    echo $sql;

    machen, kommt raus
    [FONT=&quot]SELECT * FROM person WHERE geschlecht='w'vorname='gesuchter vorname'nachname='gesuchter nachname'
    also wahrscheinlich wieder AND-Verknüpft, weshalb keine Person ausgegeben wird. [/FONT]

    • Offizieller Beitrag

    Ups... Ja klar, da habe ich vergessen das AND dazwischen zu mogeln.

    Ersetze mal das hier:

    PHP
    // where bedingungen zusammenfügen
        $sWhere = '';
    
    
        foreach ( $aFields_Filtered as $key=>$value )
            $sWhere .= $key . "='" . $value . "'";


    gegen das hier:

    PHP
    $aWhere = [];
    
    
    foreach ( $aFields_Filtered as $key=>$value )
        $aWhere[] = $key . "='" . $value . "'";
    
    
    $sWhere = implode( ' AND ', $aWhere );
  • Jetzt steht das AND in der Ausgabe dazwischen, aber die Fehlermeldung
    [FONT=&quot]Warning[/FONT][FONT=&quot]: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result
    kommt immer noch und es wird auch immer noch keine Person ausgegeben. Müsste so etwas nicht irgendwie mit einer OR-Verknüpfung gehen? Oder ist das Ergebnis dann nicht unbedingt eindeutig, weil auch Ergebnisse angezeigt werden, die nur teilweise übereinstimmen?[/FONT]

  • [FONT=&quot]SELECT * FROM person WHERE geschlecht='w'ANDvorname='eingegebener vorname'ANDnachname='eingegebener nachname'

    es ist nur die AND-Verknüpfung dazu gekommen. Schade, eine OR-Verknüpfung wäre so schön einfach gewesen.[/FONT]

    • Offizieller Beitrag

    Dann habt ihr jetzt aber wieder die Leerzeichen vor und nach dem AND weggelassen, die sind bei mir in #14 drin.
    Ohne Leerzeichen versagt die Query und liefert kein gültiges Resultat. Genau das meckert er an.

    Bitte diese Zeile exakt übernehmen:

    PHP
    $sWhere = implode( ' AND ', $aWhere ); // <-- auf die Leerzeichen vor und nach dem AND achten!

    Wenn dann immer noch was schief geht, wäre noch zu klären, ob die Spaltenbezeichnungen geschlecht, vorname, nachname und gebdatum überhaupt korrekt sind?

    Zitat

    Schade, eine OR-Verknüpfung wäre so schön einfach gewesen.

    AND ist genauso einfach, wenn man es richtig macht und liefert zudem sogar noch die richtigen Ergebnisse... ;)

  • Es hat funktioniert! :D
    Vielen Dank! Das hat uns wirklich sehr geholfen.
    Ich glaube, auf die Leerzeichen werden wir in Zukunft verschärft achten müssen...
    Danke für deine Geduld :)

    Ja, jetzt, wo der Code stimmt schon ;)