Ankündigung

Einklappen
Keine Ankündigung bisher.

Verwendung von filter_input

Einklappen

Neue Werbung 2019

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

  • Verwendung von filter_input

    Hallo Leute,

    in Sachen PHP bin ich Wiedereinsteiger nach einigen Jahren Pause. Ich strebe natürlich nach Perfektion und versuche die aktuellen Standards zu beachten, aber von Natur bin ich stinke faul und versuche mir das Arbeiten möglich einfach zu machen.
    Meine IDE hat mich freundliche weise auf filter_input() hingewiesen, als ich versucht habe die $_POST zu belästigen. Der Script ist nun fertig und arbeitet korrekt, aber sieht nicht wirklich schön aus. Was mache ich falsch? Wie kann man das eleganter lösen?
    Danke vorab für Eure Hilfe!

    PHP-Code:
    //Array für 'WHERE'-Klausel
    $where = array();
    //falls Werte aus den Formular mit der Post geliefert worden, werden Variablen gesetzt und der $where-Array erweitert, sonst nichts 
      
    filter_input(INPUT_POST'tx_email_input'FILTER_SANITIZE_EMAIL) ? $where[] = '"EMAIL" LIKE \''.$email_input filter_input(INPUT_POST,'tx_email_input').'\'' '';
            
    //alle weitere Werte aus den Formular werden wie oben behandelt und $where erweitert, danach abgefragt
        
       
    if (isset($email_input) || isset($a) || isset($b) || isset($c) || isset($xyz)){ 
        
    //falls Werte aus den Folmular vorhanden, array $where zur String $where mittels ' AND ' als glue verbinden -> string implode ( string $glue , array $pieces )
           
    $where implode(' AND '$where); 
        
           
    //noch ' WHERE ' vorn dran kleben und die 'WHERE'-Klausel ist fertig
           
    $where ' WHERE '.$where;
        
           
    //sonst leeren und zum (leeren) Sting konvertieren
        
    } else {$where implode(array());} 

    P.s.: Nicht wundern, ich arbeite mit pgSQL, die vielen "" und '' müssen leider sein.


  • #2
    1. Die filter_input()-Zeile ist zu lang und komplex, das solltest du übersichtlichter gestalten.
    2. Die if-Abfrage ist ungeschickt. Offensichtlich willst du ja nur eine der 5 Input-Arten verwenden. Was machst du wenn 2 angegeben sind? Was machst du überhaupt mit den Werten von $*_input?
    3. Wenn du "zum (leeren) String konvertieren" willst, warum dann mit $where = implode(array()); und nicht einfach $where = ''?
    4. Wenn du in den else-Zweig kommst, überschreibst du das was du mit filter_input() in $where reingeschrieben hast. Wenn filter_input() tatsächlich auch von der Abfrage abhängig ist, dann sollte es auch in das if hinein.

    Kommentar


    • #3
      Danke Tropi,

      Ad.1 Genau das ist mir bewusst, leider komme ich nicht auf bessere Lösung...
      Ad.2 Die if-Abfrage soll einen oder mehrere Werte zulassen, das tut sie auch. Die $*_input Werte werden - falls vorhanden - vorher nach einander in das $where-Array geschrieben und in der if zum einen $where-String mittels ' AND ' "verklebt".
      Ad.3 em... Du hast recht...
      Ad.4 Das ist richtig und das soll auch so sein, denn wen keine $*_input Werte da sind, kann ich keine 'WHERE'-Klausel erstellen. $where-String wird an das SQL-Statement angehängt.

      Kommentar


      • #4
        1. Schwer zu sagen wie man das besser lösen könnte. Vermutlich mit einem "Konfigurations-Array" und einer Schleife. Also z.B. so:
        PHP-Code:
        $filters = array(
            
        'tx_email' => array(
                
        'db_field' => 'email',
                
        'type' => FILTER_SANITIZE_EMAIL
            
        ),
            
        'anzahl' => array(
                
        'db_field' => 'amount',
                
        'type' => FILTER_SANITIZE_NUMBER_INT
            
        ),
            
        'optional' => array(
                
        'db_field' => 'comment'
                
        // type ist optional, für Felder die keinen Input Check brauchen.
            
        )
        );

        foreach (
        $filters as $field => $filter) {
            
        // ...

        Dazu müsste man aber die anderen Regeln sehen, denn eventuell gibt es ja auch andere Validationsregeln als die, die von filter_input() unterstützt werden.

        4. Wie gesagt, dann muss das aber auch rein ins if.

        Kommentar


        • #5
          PHP Filter wurden übrigens a la cart durch die Aura Filters aufgebohrt, was mit sicherheit alles unterstützt das du möchtest. Vielleicht ist das ja mal ein Blick für dich wert: https://github.com/auraphp/Aura.Filter
          [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

          Kommentar


          • #6
            Danke tr0y,

            das sieht vielversprechend aus

            Ich dachte schon, dass ich ohne spezielle Klassen nicht auskomme. Ich drücke mich sonst wie ich kann von OOP, aber mein Projekt hat hohe Sicherheitsanforderungen und meine Scripte wachsen ins unendliche... Pech gehabt, oder eben Glück. lernen ist doch was gutes

            Auf jeden Fall ist die Aura Filters leserlicher und - höchstwahrscheinlich - ausgereifter, als das, was ich jetzt tue.

            Kommentar


            • #7
              @Tropi

              Schwer zu sagen wie man das besser lösen könnte. Vermutlich mit einem "Konfigurations-Array" und einer Schleife.
              Na ja, sicherlich besser als mein Halloween-reifer ternärer Operator, aber auch nicht ganz ohne . Dummerweise mein Projekt besteht eigentlich nur aus DB-Ein- und Ausgabe Die ultimative Lösung könnte in OOP liegen, hoffe jedenfalls

              LG

              Kommentar

              Lädt...
              X