Ankündigung

Einklappen
Keine Ankündigung bisher.

Eine winzige Frage zu empty()

Einklappen

Neue Werbung 2019

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

  • Eine winzige Frage zu empty()

    Hey Ihr,
    ich habe mich gerade registriert, da ich einfach keine Antwort darauf finden kann, ob der Satz "If it works, it ain't stupid" auf folgendes zutrifft.

    PHP-Code:
    if (!empty($_POST['action']) == 'list') {
        
    $action $_POST['action'];

        
    // Do something

    Wäre nett, wenn mir wer dazu eine Antwort geben könnte.
    Oder mir erklären könnte, warum es nicht so schlau ist.

    Danke im Voraus!


  • #2
    Hi, dreh mal dein error reoprting hoch dann bekommst du eine Notice wenn das Script nicht über einen submit aufgerufen wird weil du was prüfst was nicht immer vorhanden ist.

    Und empty() gibt laut Doku ein bool d.h. ein Stringvergleich nach keinen sinn.

    Schau dir zb mal filter_input() an

    Kommentar


    • #3
      Demnach checkt PHP ob die Variable etwas enthält, gibt true zurück im Fall, dass sie was enthält und überspringt den String-Vergleich?

      Demnach, wenn ich mich nicht mit den Filtern von filter_input() rumschlagen möchte und die Funktion nur ausgeführt werden soll, wenn 'action' == 'list' ist, wäre:

      PHP-Code:
      if (!empty($_POST['action']) && $_POST['action'] == 'list') {
          
      // Do something

      doch vollkommen okay, oder?
      Oder begehe ich da einen Denkfehler?

      Kommentar


      • #4
        Nö, der String-Vergleich wird anschließend durchgeführt. Und da du den typ-schwachen Vergleich durchführst, wäre das Ergebnis von "true == 'list'"... true. Genauso wie "true == 'abcde'".

        PHP-Code:
        if (isset($_POST['action']) && $_POST['action'] === 'list') {
            
        $action $_POST['action'];

            
        // Do something

        Sowas möchtest du haben. isset ist auch grammatikalisch einfacher einzuordnen als die Verneinung von empty.

        Kommentar


        • #5
          Schau auch mal ins Handbuch.

          Kommentar


          • #6
            Zitat von VPh Beitrag anzeigen
            Nö, der String-Vergleich wird anschließend durchgeführt. Und da du den typ-schwachen Vergleich durchführst, wäre das Ergebnis von "true == 'list'"... true. Genauso wie "true == 'abcde'".

            PHP-Code:
            if (isset($_POST['action']) && $_POST['action'] === 'list') {
            $action $_POST['action'];

            // Do something

            Sowas möchtest du haben. isset ist auch grammatikalisch einfacher einzuordnen als die Verneinung von empty.
            Japp, dicker Denkfehler von mir. Ich war davon ausgegangen, dass nachdem gecheckt wird, ob die variable etwas enthält, der Inhalt verglichen wird. So schnell öffnet man Tür und Tor für Attacken.
            Ich danke dir.

            Aber warum ergibt
            Code:
            true == 'list'
            true? Meine Auffassung von
            Code:
            ==
            ist, dass die Inhalte unabhängig vom Typ verglichen werden. Und "true" ist nicht mal ansatzweise ähnlich wie 'list'. Verschiedener Inhalt und verschiedene Typen.

            Zitat von protestix Beitrag anzeigen
            Schau auch mal ins Handbuch.
            Ja, die Seite ist mir wohl bekannt. Und auch, dass dort zwar die Funktionen- aber nur selten die Hintergründe erklärt werden. Es geht mir hier um das Verständnis, nicht um die Funktionsbeschreibung.

            Kommentar


            • #7
              Dann sieh dir noch die Tabelle auf dieser Seite an: http://php.net/manual/de/types.comparisons.php

              Wenn du "abc" mit true über den typschwachen Operator vergleichst wird "abc" intern zu einem boolschen Wert gecastet. (Siehe protestix' Link)
              Und da passt dann true besser als false. In welchen Fällen beim Casten von String zu Bool ein false rauskommt steht auch in der Tabelle.

              Und diese Seite ist für solche Spielereien immer ganz nützlich: https://3v4l.org

              Kommentar


              • #8
                Danke für die Erklärung und die Links.

                Besonders der erste hat geholfen, welchen ich auch hätte erreichen können, hätte ich protestix's Antwort nicht als ignorant-generische Antwort abgetan. *shame on me*

                Nach einem Blick auf die Tabelle, die mir, trotz meiner recht häufigen Besuche auf der Operanten-Seite, nie ins Gesicht springen wollte (genauso wenig habe ich je weit genug nach unten gescrollt), obwohl es der erste Link ist, ergibt die ganze Geschichte um einiges mehr Sinn.
                Wenn ein boolscher Wert mit einem nicht-boolschen Wert typenschwach verglichen wird, ist alles true, solange dieser nicht
                Code:
                0; "0"; ""; null
                ist. Yey

                Wenn ich das jetzt noch im Kopf behalte, wenn ich den nächsten Vergleich anstelle...

                Danke Euch allen für diese erhellende Erkenntnis!

                Kommentar


                • #9
                  Am Besten immer auf Identität überprüfen (=== bzw. !==). Dort wird neben Inhalt auch der Typ der Variable berücksichtigt.

                  Kommentar


                  • #10
                    Zitat von JaMa Beitrag anzeigen
                    Am Besten immer auf Identität überprüfen (=== bzw. !==). Dort wird neben Inhalt auch der Typ der Variable berücksichtigt.
                    Lustiger Weise tue ich das im Normalfall. Jedoch kam mir einfach nicht in den Sinn, dass ich es mit einer Typen-Änderung zu tun haben könnte. Ich denke, dass ist die Krux mit PHP's Flexibilität. In Java z.B. muss man ja den Typ, z.B. des Inhalts einer Variable, erst deklarieren.

                    Viel zu lernen ich noch habe.

                    Kommentar


                    • #11
                      Zitat von VPh Beitrag anzeigen
                      PHP-Code:
                      if (isset($_POST['action']) && $_POST['action'] === 'list') {
                      $action $_POST['action'];

                      // Do something

                      Sowas möchtest du haben.
                      oder du nutzt sowas

                      Zitat von hausl
                      Schau dir zb mal filter_input() an
                      PHP-Code:
                      $action filter_input(INPUT_POST'list');
                      if (
                      $action == 'list') {
                          
                      // ...

                      Hat den "Vorteil" wenn man es gerade so braucht, das die Variable auch angelegt wird, wenn nicht vorhanden dann mit NULL. Für einmalige Prüfungen würd ich das nicht verwenden, aber wenn man die Variable dann öfters noch braucht, kann das ganz praktisch sein. Und man kann auch Min - Max Werte definieren (zB für INT) und auch andere Standardwerte zuweisen lassen.

                      PHP-Code:
                      $action filter_input(INPUT_POST'list');

                      var_dump($action);
                      // NULL

                      $action filter_input(INPUT_POST'list'FILTER_DEFAULT, ['options' => ['default'=> 'foo']]);

                      var_dump($action);
                      // string(3) "foo" 

                      Kommentar


                      • #12
                        Wenn man nur einen Default Value angeben möchte, falls der Wert nicht existiert, funktioniert es auch so: (Ab PHP 7)

                        PHP-Code:
                          $action $_POST['action'] ?? 'list'

                        Kommentar


                        • #13
                          Stimmt, der Null-Coalesce-Operator ist im dem Fall wohl die parktischte Variante. Vor PHP 7 musste man um das entsprechend zu erreichen isset() mit dem ternären Operator verwenden.
                          PHP-Code:
                          $action = isset($_POST['action']) ? $_POST['action'] : 'list'
                          Ich habe das eben nur der Vollständigkeit halber, erwähnt damit die Begriffe dazu noch genannt wurden. Nach sowas googlen ist ja immer etwas schwer wenn man den Namen nicht kennt (wie zB auch bei Method-Chaining etc..)

                          Kommentar

                          Lädt...
                          X