Ankündigung

Einklappen
Keine Ankündigung bisher.

Filter per Formular kombinieren

Einklappen

Neue Werbung 2019

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

  • Filter per Formular kombinieren

    Ich habe ein Formular mit 6 Feldern. Anhand dieser Felder sollen die anzuzeigenden Datensätze gefiltert werden.
    Also einfach so, wie man es aus excel kennt: man hat eine Tabelle und setzt darauf (auf jede Spalte) einen (Auto-)Filter.
    Filtert man nach a, erhält man Daten, die a entsprechen. Filtert man nach a und b, erhält man Datensätze, die a UND b entsprechen, usw.

    Ich kann also nicht mit einem einzigen SELECT arbeiten, weil sich das WHERE jeweils ändert.

    Daher mein Ansatz mit if(isset()) zu arbeiten. Nur: bei 6 Feldern gibt es 6! (also 720) Kombinationen. Auch wenn nicht jede Kombinationen
    sinnvolle Ergebnisse liefert, muss ich ja damit rechnen, dass der User das nicht sofort bedenkt und auch solche Kombinationen nutzt. Diese
    müsste ich daher mit abdecken.

    Gibt es da nicht eine elegantere Lösung?

    Aber selbst wenn der Ansatz prinzipiell richtig wäre, funktioniert er bei mir schon im Ansatz nicht. Ich habe ..
    PHP-Code:
    if(isset($_POST['kunde'])){
        
    $sql .= " WHERE k.name = '" $_POST[kunde] . "'";
    }

    elseif(isset(
    $_POST['kunde']) && isset($_POST['pub'])){
        
    $sql .= " WHERE k.name = '" $_POST['kunde'] . "'"
            
    " AND p.name = '" $_POST[pub] . "'";

    Mit 'if' (2.Anweisung) funktioniert es nicht. Mit 'elseif' wird scheinbar die 2. Anweisung ignoriert und auf die erste zurückgegriffen.
    Der ersten Anweisung ein !isset($_POST['pub']) hinzuzufügen, ändert auch nichts. Die Anweisungen alleine (also die eine ohne die jeweils
    andere) funktionieren beide.

    Danke!

  • #2
    wenn das alles nur AND mit "ist gleich" ist, pack die Bedingungen je Flag in ein Array und mach dann implode() drauf

    PHP-Code:
    <?php

    $sql 
    'select foo from bar ';

    $validations = [
        
    'kunde' => 'k.name',
        
    'pub' => 'p.name',    
    ];

    foreach(
    $validations as $key => $field){
        if(isset(
    $_POST[$key])){
            
    $conditions[] = $validations[$key].' = ?';
            
    $values[] = $_POST[$key];
        }
    }

    $where 'WHERE '.implode(' AND '$conditions);

    $stmt $pdo->prepare($sql.$where);
    $stmt->execute($values);
    [I]You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.[/I]

    Kommentar


    • #3
      isset ist schon mal sowieso falsch. denn alle Texteingabefelder werden übergeben, auch wenn sie leer sind. Ansonsten würde ich die Felder genauso wie die DB-Spaltennamen benennen, dann kannst du das per foreach mit $_POST lösen.
      Die Deutsche Rechtschreibung ist Freeware! Du darfst sie kostenlos nutzen, allerdings ist sie nicht Open Source, d.h. Du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

      Kommentar


      • #4
        hm .. noch versteh' ich's nicht ganz, aber ich werd' mich auf jeden Fall damit befassen. Also schon mal besten Dank dafür! Das sieht ja schon mal deutlich eleganter aus! Idealerweise sollte auch ein paar OR Verknüpfungen dabei sein, aber da es mir hier primär um Verständnis geht, ist damit schon mal viel gewonnen!

        Kommentar


        • #5
          Und wie so oft wurde schon wieder auf den Kontextwechsel vergessen. Werte, die in SQL-Code eingefügt werden, müssen escapet werden.

          Kommentar


          • #6
            Zitat von uha Beitrag anzeigen
            isset ist schon mal sowieso falsch. denn alle Texteingabefelder werden übergeben, auch wenn sie leer sind. Ansonsten würde ich die Felder genauso wie die DB-Spaltennamen benennen, dann kannst du das per foreach mit $_POST lösen.
            genau. Aus diesem Grund könnte man die Abfrage wie folgt machen:

            PHP-Code:
            if((isset($_POST['kunde']) && !empty($_POST['kunde'])) && (isset($_POST['pub']) && !empty($_POST['pub'])))
            {

            mit !empty überprüfst du ob die Variable einen Wert enthält.

            Kommentar


            • #7
              Zitat von tufanum Beitrag anzeigen
              mit !empty überprüfst du ob die Variable einen Wert enthält.
              Das ist so nicht ganz richtig, aus der Doku:
              Code:
              Prüft, ob eine Variable leer ist. Eine Variable ist leer, wenn sie nicht existiert oder wenn ihr Wert gleich FALSE ist.
              Die Deutsche Rechtschreibung ist Freeware! Du darfst sie kostenlos nutzen, allerdings ist sie nicht Open Source, d.h. Du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

              Kommentar


              • #8
                also noch mal besten Dank an alle! Ich denke ich hab' jetzt Einiges, mit dem ich weitermachen kann.

                Kommentar


                • #9
                  Zitat von hellbringer Beitrag anzeigen
                  Und wie so oft wurde schon wieder auf den Kontextwechsel vergessen. Werte, die in SQL-Code eingefügt werden, müssen escapet werden.
                  Aber nur im Startbeitrag. Im Beispiel #2 zeigt chorn wie das mit Prepared Statements gemacht werden kann.

                  Kommentar

                  Lädt...
                  X