• PHP Frage, irgendwie check ichs grad ned… in_array($string, $array)

    Habe folgenden Aufbau

    Show Plain Text
    1. $filter = $_POST['filter'];
    2.  
    3. (WP_Query hier funktioniert schon mit dem $filter der verschiedene Checkboxes in einem Array zusammenfasst und danach die Datenbank abfragt)
    4.  
    5. function setcheckbox($string){
    6.   if($filter == NULL){
    7.     echo ' checked';
    8.   }
    9.   elseif(in_array($string, $filter)){
    10.     echo ' checked';
    11.   };
    12. };
    13.  
    14. echo '<input type="checkbox" value="filtervalue" name="filter[]"';
    15. setcheckbox('filtervalue');
    16. echo '>';


    Wenn ich die Funktion setcheckbox(); mit dem String "filtervalue" durchlaufen lasse, gibt es mit immer wieder echo ' checked' aus. Obwohl vor dem Absenden des Formulars diese Checkbox deaktiviert wurde und nachweislich der Wert "filtervalue" nicht mehr im Array war.

    Ich blicks grad echt nicht!
      • Das ist die Ursache. [e]

        Prinzipiell braucht man das ganze Lametta aber auch gar nicht, weil's auf ein if hinaus läuft:

        Show Plain Text
        1. echo '<input type="checkbox" value="filtervalue" name="filter[]"';
        2. if (in_array('filtervalue', $_POST['filter'])) {
        3.   echo ' checked';
        4. }
        5. echo '>';


        Ist schwer zu sagen, wenn man das drumherum nicht kennt. Wenn ich mit der $filter Struktur so wie sie ist leben müsste, würde ich es so machen:

        Show Plain Text
        1. function isFilterCheckboxSet($value) {
        2.   return isset($_POST['filter']) && in_array($value, $_POST['filter']);
        3. }
        4.  
        5. function checkboxFilter($value) {
        6.   $out = '<input type="checkbox" value="' . $value . '" name="filter[]"';
        7.   if (isFilterCheckBoxSet($value)) {
        8.     $out .= ' checked';
        9.   }
        10.   $out .= '>';
        11.   return $out;
        12. }
        13.  
        14. echo checkboxFilter('filtervalue');


        Gruß
        Schlaefer
          • Wenn man so drüber nachdenkt, dann

            sollte man POST einmal abfragen und nicht zwischendurch auf globalen Variablen rumschmirgeln. Das müssen wir jetzt doch nochmal anders.

            Show Plain Text
            1. function checkboxFilter($value, $filter) {
            2.   $out = '<input type="checkbox" value="' . $value . '" name="filter[]"';
            3.   if (in_array($value, $filter)) {
            4.     $out .= ' checked';
            5.   }
            6.   $out .= '>';
            7.   return $out;
            8. }
            9.  
            10. $filter = [];
            11. if (isset($_POST['filter']) && is_array($_POST['filter'])) {
            12.   $filter = $_POST['filter'];
            13. }
            14.  
            15. echo checkboxFilter('filtervalueA', $filter);
            16. echo checkboxFilter('filtervalueB', $filter);


            So ist besser!

            Gruß
            Schlaefer
            • Hehe. Du gibst dir Mühe!

              Danke auch. Dennoch werd ich den checkboxFilter() umbauen und jeweils direkt bei der Checkbox ablaufen lassen. Da ich noch einige Attribute wie z.B. tabindex und die Validierung direkt beim Feld habe. Deshalb lässt es sich nicht so super vereinfachen.
            • Ja, ich bin kleinkariert.

              Lösungen zu posten, die nicht als sicher gelten, halte ich für falsch.

              Der nächste kommt an, übernimmt das Snippet für ein anderes Formularfeld, eine andere Situation, und schon entstehen die Probleme.

              Nur weil PHP die Freiheit der Typisierung und Deklaration von Variablen unterstützt, muss man es ja nicht bei wichtigen Sachen nutzen und Laien auch noch zeigen.
              • +1 Deshalb wollte ich es dann auch nicht so für die Nachwelt stehen lassen.

                Wordpress Code ist wie die Ex. Allein der Anblick drückt die richtigen Knöpfe, und bringt die schlimmen, alten Verhaltensweisen wieder hervor: Validierung? Kapselung? - Fuck it! We'll do it live!

                I'm sorry!

                Aber ohne Drumherum schwer zu sagen, wenn's bereits durch den DB-Layer gejagt wurde, ist das Kind ja potentiell bereits im Brunnen.

                Gruß
                Schlaefer
                • +1 Für die WordPress-Kritik.

                  Ich habe nur ganz am Rand mit CMS-Systemen zu tuen. Alles Unternehmen, die mit Joomla, Drupal, Wordpress an Grenzen kommen und dann geht das Gebastel los, eben wie bei shizzle.
                  • Danke auch!

                    Hört sich gar nicht überheblich an. Aber ich weiss ja wo ich bin hier. Wundert mich nichts mehr.
                    • Das hat nichts mit Überheblichkeit zu tuen.

                      Jedes CMS, was ich kenne bietet Methoden zum Übernehmen von Daten aus unterschiedlichen Quellen.

                      Egal wer man ist, wie gut man programmieren kann, man kann bei der Übernahme von Daten nie so blöd denken, was alles möglich ist.

                      Deshalb die eiserne Regel: Daten, die von aussen kommen, sofort überprüfen und in eine andere Variable überführen.

                      Man kann das im jeweiligen CMS machen, ich persönlich halte mehr davon, wenn man das direkt mit PHP macht.


                      Wenn man das so schludrig macht wie du, passieren ganz schnell gravierende Fehler und dann fangen die Probleme an. Du musst aufpassen, was du für Werte in dein System reinholst und wie du Sachen vergleichst. == ist was anderes als ===
                • Was ist da verwerflich an Wordpress?

                  Nach der Diskussion hier habe ich mich nochmals mit dem Thema Sanitation und WP auseinander gesetzt. Ist doch schön wenn einem das CMS die Arbeit abnimmt und allenfalls bei PHP Änderungen auch die Funktionen wieder anpasst. Ich erstelle und bearbeite Posts auf diese Art und Weise übers Frontend, lasse diese filtern etc. Funktioniert wunderbar und Meine Tests haben ergeben da werden Code und SQL Argumente fein säuberlich gestrippt.
                  • Das hat nichts mit Überheblichkeit zu tun, eher mit Kompetenz.

                    Jeder kann sich Zement und Backsteine im Baumarkt kaufen und sein eigenes Haus errichten, und es sieht beim Einzug großartig aus. Der Fachmann sieht potentiell jedoch bereits in der Bauphase kommende Risse in den Wänden und den Schimmel im Keller.

                    Das ist nicht abwertend gemeint. Vielleicht treffen einen diese Probleme niemals, vielleicht jedoch schon nächste Woche. Deshalb sollte man diese Probleme wenn möglich bereits im Ansatz verhindern.

                    Konkret: jeder Input, der von Außen kommt, kann auf keinem Fall getraut werden und enthält potentiell schadhaften Code, der beim Durchreichen an die Datenbank diese auf boshafte Weise verändert oder ungewollt Daten preisgibt. Dies soll verhindern, was man grob unter "Sanitation" zusammen fasst.

                    State of the Art sollte sein, dass der Datenbank-Code dies für den Programmierer übernimmt, was (afaik) Wordpress umsetzt.

                    Das Problem hier ist, dass $_POST immer noch rohe Input-Daten enthält. Moderene PHP-Lösungen bieten bereits eine Abstraktionsschicht, die einem nur Zugriff auf gefilterte Eingaben erlaubt, und nicht auf $_POST direkt.

                    Wordpress hat eine lange Geschichte, was würdig und recht ist, bietet jedoch nicht solche als "State of the Art" angesehen und für den Laien nicht offensichtlichen Konzepte. $_POST is roh, man kann dir damit praktisches alles unterjubeln!

                    Ein Entwickler, der Mangels anderer Methoden direkt auf $_POST zugreift, was hier passiert, sollte selbst dafür sorgen, das der Input den Erwartungen entspricht. Was ist, wenn ich dir kein Array in $_POST['filter'] sende, sondern einen String? Das liegt dann in deiner Verantwortung zu testen, ansonsten tritt (unter günstigsten Umständen nur) eine Fehlermeldung auf.

                    Dazu kommen andere als allgemein akzeptierte Regeln: greife niemals auf globale Variablen zu. Sorge dafür, dass es eine Eingangstür gibt, über die Input-Daten eintreffen. Test Input Daten an dieser Eingangstür, weil sie dir schaden könnten, erst danach vertraue ihnen.

                    Gruß
                    Schlaefer


                    PS: Disclaimer: Kein Wordpress Fachmann.