WernerK: isset Problem wegen get_magic_quotes_gpc() ??

Hallo,

ich habe folgenden Code (von php.net) in eine PHP Seite eingefügt die zentral includiert wird. Also für alle weiteren Vorgänge aktiv ist.

  
if (get_magic_quotes_gpc()) {  
 function stripslashes_deep($value)  
    {  
        $value = is_array($value) ?  
        array_map('stripslashes_deep', $value) :  
        stripslashes($value);  
        return $value;  
    }  
    $_POST = array_map('stripslashes_deep', $_POST);  
    $_GET = array_map('stripslashes_deep', $_GET);  
    $_COOKIE = array_map('stripslashes_deep', $_COOKIE);  
    $_REQUEST = array_map('stripslashes_deep', $_REQUEST);  
}  

Folgender Unterschied ist mir nun aufgefallen:
Beim laden eines Formulars bzw. Php seite wird unter anderem ein Textfeld (txt_Anzahl)angezeigt.

Ich prüfe nun mit isset ob das Feld befüllt wurde oder nicht.
if( isset($_POST['txt_Anzahl']) ){
....

echo "gesetzt";
}

Mit obigem "get_magic_quotes_gpc" Code kommt immer die Meldung "gesetzt". Wenn ich das weglasse kommt sie nicht und erst dann wenn das Feld befüllt ist und auf Sumbit geklickt wird.

Wieso ist das so?
bzw. Wie kann man das so machen das es trotz dem "get_magic_quotes_gpc" Code funktioniert?

Danke im vorraus
Gruss
Werner

  1. echo $begrüßung;

    Ich prüfe nun mit isset ob das Feld befüllt wurde oder nicht.

    isset() prüft auf das Vorhandensein, nicht auf den Inhalt. In $_POST oder $_GET ist immer ein Eintrag von einem erfolgreich versendeten Formularfeld vorhanden, selbst dann, wenn deren Inhalt nur ein Leerstring ist.

    Mit obigem "get_magic_quotes_gpc" Code kommt immer die Meldung "gesetzt". Wenn ich das weglasse kommt sie nicht und erst dann wenn das Feld befüllt ist und auf Sumbit geklickt wird.

    Den zweiten Teil glaube ich dir vorläufig nicht ohne Kontrollausgaben von $_POST von vor und nach dem "obigen Code" und von der weggelassenen Variante gesehen zu haben.

    Wieso ist das so?

    Vielleicht finde ich eine Erklärung mit den Kontrollausgaben. Fertige sie mit var_dump($_POST) an. Vorher bitte ein <pre> ausgeben oder die Quelltext im Browser betrachten.

    bzw. Wie kann man das so machen das es trotz dem "get_magic_quotes_gpc" Code funktioniert?

    empty() fände ich angebrachter, wenn Strings mit dem Inhalt "0" keine der erwarteten Eingaben darstellen.

    echo "$verabschiedung $name";

    1. Hallo,
      danke für deine Hilfe.
      Ich bin nämlich ziemlich verwirrt wieso sich das so verhält.
      Ich habe nun ein var_dump vor und nach dem "magic_quotes" Code eingefügt.

        
      echo "<pre>";  
      var_dump($_POST);  
      echo "</pre>";  
      if (get_magic_quotes_gpc()) {  
       function stripslashes_deep($value){  
              $value = is_array($value) ?  
              array_map('stripslashes_deep', $value) :  
              stripslashes($value);  
              return $value;  
          }  
        $_POST = array_map('stripslashes_deep', $_POST);  
          $_GET = array_map('stripslashes_deep', $_GET);  
          $_COOKIE = array_map('stripslashes_deep', $_COOKIE);  
          $_REQUEST = array_map('stripslashes_deep', $_REQUEST);  
      }  
      echo "<pre>";  
      var_dump($_POST);  
      echo "</pre>";  
      
      

      Die Ausgabe ist wie folgt.(habe sie etwas gekürzt)

      <pre>array(28) {
        ["txt_password"]=>
        NULL
        ["sel_bodycolor"]=>
        NULL
        ["chk_tumble"]=>
        NULL
        ["txt_Anzahl"]=>
        NULL
        ["txt_deadline"]=>
        NULL
      }
      </pre><pre>array(28) {
        ["txt_password"]=>
        string(0) ""
        ["sel_bodycolor"]=>
        string(0) ""
        ["chk_tumble"]=>
        string(0) ""
        ["txt_Anzahl"]=>
        string(0) ""
        ["txt_deadline"]=>
        string(0) ""
      }
      </pre>

      Wenn ich es richtig verstehe hat man hinterher dann einen leeren String?
      Aber warum wirkt sich das soooooo aus?
      Es wird doch nicht explizit das Textfeld "txt_Anzahl" initialisiert oder angesprochen?

      Das Problem ist das ich an vielen Stellen im Code solch eine Prüfung mit "isset" mache und ich eigentlich ja auch das mit dem "get_magic_quotes_gpc()" drin lassen möchte.

      Gruss
      WernerK

      1. echo $begrüßung;

        Ich bin nämlich ziemlich verwirrt wieso sich das so verhält.

        Die Erklärung ist nun einfach.

        Ich habe nun ein var_dump vor und nach dem "magic_quotes" Code eingefügt.
        array(28) {
          ["txt_password"]=>
          NULL
        }
        array(28) {
          ["txt_password"]=>
          string(0) ""
        }

        isset() erkennt (leider) auch NULL-Werte als nicht vorhanden an. Für isset() existiert das Array-Element damit nicht, obwohl es da ist. Das stripslashes() liefert immer einen String. Aus NULL macht es einen Leerstring. Den erkennt isset() dann als existent an.

        Aber warum wirkt sich das soooooo aus?

        Die Frage ist eher, warum hast du NULL-Werte im $_POST-Array stehen? Machst du was mit $_POST-Array? Wenn nein, welche PHP-Version verwendest du? (Zusatzfrage: Welche Konfigurationswerte sind gesetzt? phpinfo(INFO_CONFIGURATION);) Dieses Verhalten ist mir bisher noch nicht über den Weg gelaufen. POST-Werte sind (waren bisher) immer Strings, und wenn es Leerstrings sind.

        Das Problem ist das ich an vielen Stellen im Code solch eine Prüfung mit "isset" mache und ich eigentlich ja auch das mit dem "get_magic_quotes_gpc()" drin lassen möchte.

        isset() ist, wie gesagt, nicht die richtige Vorgehensweise und funktioniert in deinem Fall nur, weil da aus bisher ungeklärter Ursache NULL-Werte im $_POST-Array stehen.

        echo "$verabschiedung $name";

        1. Hallo,

          Die Frage ist eher, warum hast du NULL-Werte im $_POST-Array stehen? Machst du was mit $_POST-Array? Wenn nein, welche PHP-Version verwendest du?

          So langsam wird es mir ein wenig klarer.
          Es ist so das es eine "initialisierungsdatei gibt" die macht bei nahezug allen Sessions und Post Feldern sowas:
          if(!isset($_POST['txt_Anzahl'])){
           $_POST['txt_Anzahl'] = NULL;
          }

          Ich glaube das ist gemacht worden, damit es keine Meldung gibt wir
          "undedined index" oder "undefined Variable"

          Ich bin jetzt etwas umschlüssig was die beste Lösung ist bzw. wie man weiter vorgehen sollte?

          Gruss
          Werner

          1. echo $begrüßung;

            Es ist so das es eine "initialisierungsdatei gibt" die macht bei nahezug allen Sessions und Post Feldern sowas:
            if(!isset($_POST['txt_Anzahl'])){
            $_POST['txt_Anzahl'] = NULL;
            }

            Ich glaube das ist gemacht worden, damit es keine Meldung gibt wir
            "undedined index" oder "undefined Variable"

            Ich bin jetzt etwas umschlüssig was die beste Lösung ist bzw. wie man weiter vorgehen sollte?

            Schreib den Ent-M.Q.-Code vor diese Behandlung, das ist die einfachste Lösung für das aktuelle Problem. Der Ent-MQ-Code behandelt nur die wirklich gesendeten Formularwerte und dein Initialisierungscode fügt den Rest als NULL-Wert hinzu.

            Ich tät auf solche generelle und (mehr oder weniger) versteckte Null-Wert-Setzungen verzichten und stattdessen beim E-Teil der EVA die Werte den notwendigen Prüfungen unterziehen, unter anderem auch auf Vorhanden- oder Leersein mit isset() oder empty().

            Ohne das Ziel zu kennen ist es schwer, passende Ratschläge für den Weg zu geben.

            echo "$verabschiedung $name";

            1. Hallo
              danke nochmals für deine tolle Erklärungen und Hilfe.

              Ich tät auf solche generelle und (mehr oder weniger) versteckte Null-Wert-Setzungen verzichten und stattdessen beim E-Teil der EVA die Werte den notwendigen Prüfungen unterziehen, unter anderem auch auf Vorhanden- oder Leersein mit isset() oder empty().

              Ich bin nicht so versiert daher noch mal kurz nachhaken.
              Du meinst also besser nicht solch eine Latte von "Initialisierungen"

                
              if(!isset($_GET['optionserror'])){  
                $_GET['optionserror'] = NULL;  
              }  
              if(!isset($photo)){  
                $photo = NULL;  
              }  
              if(!isset($_POST['sel_subdirs'])){  
               $_POST['sel_subdirs'] = NULL;  
              }  
              if(!isset($_SESSION['sel_Back_s'])){  
               $_SESSION['sel_Back_s'] = NULL;  
              }  
              
              

              sondern dann eher bei einem IF / Else Abfrage prüfen wie;
              if(empty($_GET['optionserror'])){
              ..
              }else{
              ...
              }

              Im konkreten Fall bzw. Beispiel ging es mir um folgendes.
              Ich möchte den Wert des Textfeldes "txt_Anzahl" in eine Session schreiben aber halt erst wenn auch ein Wert befüllt wurde oder wenn es nicht leer ist.

                
              if( isset($_POST['txt_copies']) ){  
                $_SESSION['name'] = $_POST['name'];  
                $_SESSION['acc'] = $_POST['acc'];  
                $_SESSION['txt_Anzahl'] = $_POST['txt_Anzahl'];  
              }  
              
              

              Also meinst du besser diesen Code für Magic Quotes drin lassen,
              if (get_magic_quotes_gpc()) {
               function stripslashes_deep($value){
              ....

              ich werde den Code dann nochmals durchgehen.

              Gruss
              Werner

              1. echo $begrüßung;

                if(!isset($photo)){
                  $photo = NULL;
                }

                Speziell das sollte unnötig sein. Wieso sollte $photo nicht vorhanden sein? Hat jemand vergessen, es explizit zu initialisieren?

                Du meinst also besser nicht solch eine Latte von "Initialisierungen"
                sondern dann eher bei einem IF / Else Abfrage prüfen wie;
                if(empty($_GET['optionserror'])){
                ..
                }else{
                ...
                }

                Oder auch kürzer mit dem Trinitätsoperator ?: wenn es sich nur um eine Variablenzuweisung handelt.

                $foo = isset($_POST['foo']) ? $_POST['foo'] : 'default value';

                Oder auch gar keine Variable anlegen sondern direkt verarbeiten:

                $string = sprintf('string mit %s als Platzhalter', isset($_POST['foo']) ? $_POST['foo'] : 'default value');

                Es kommt immer darauf an, was man letztlich will. Vielleicht ist es auch gar nicht sinnvoll, das Formular zu verarbeiten, wenn für Formularfelder keine $_POST-Einträge mitkommen. Es könnte sich um einen Missbrauch handeln oder auch nur um einen normalen Nicht-POST-Request der Seite.

                Ich möchte den Wert des Textfeldes "txt_Anzahl" in eine Session schreiben aber halt erst wenn auch ein Wert befüllt wurde oder wenn es nicht leer ist.

                Du könntest mit isset() prüfen, ob der Wert überhaupt mitgesendet wurde. Wenn nicht, ist das Formular offensichtlich nicht abgesendet worden. Ob dann eine Weiterverarbeitung sinnvoll ist, musst du entscheiden. Wenn ja, könntest du einen Default-Wert in die Session schreiben.

                Du kannst aber auch generell mit empty() testen, ob der Wert vorhanden und nicht leer ist und ihn dann weiterverarbeiten oder mit einen Default-Wert weiterarbeiten. Das wäre dann sinnvoll, wenn es nicht interessiert, ob das Formular überhaupt gesendet wurde oder nicht.

                if( isset($_POST['txt_copies']) ){

                $_SESSION['name'] = $_POST['name'];
                  $_SESSION['acc'] = $_POST['acc'];
                  $_SESSION['txt_Anzahl'] = $_POST['txt_Anzahl'];
                }

                  
                Anhand eines Wertes das Vorhandensein der anderen als gegeben hinzunehmen ist etwas kühn (oder zumindest nicht durchdacht). Ich würde das vermutlich (ich kenne ja das große Ziel nicht, deswegen die einschränkende Formulierung) mit dem Trinitätsoperator wie oben gezeigt notieren.  
                  
                
                > Also meinst du besser diesen Code für Magic Quotes drin lassen,  
                  
                Du kannst ihn weglassen, wenn du sicherstellen kannst, dass das Feature M.Q. deaktiviert ist und auch so bleibt. Ansonsten lass ihn drin, aber eben ganz am Anfang.  
                  
                  
                echo "$verabschiedung $name";
                
                1. Hallo,
                  Danke nochmals für deine tolle Erklärungen.

                  Ich versuche nun gerade den ganzen "initialcode" zu bereinigen.
                  ich möchte zur Sicherheit nochmals kurz nachfragen.

                  Eine Php seite "main.php" hat z.b. in Zeile 200 eine include Datei
                  check.inc.php

                  Hier kommt folgendes vor:
                  if( ($USER != "") AND ($user_error != "yes") ){
                  ...
                  ..
                  }
                  In der "main.php" gibt bei Zeile 100 eine User Login Prüfung
                  if( ($User_ID == "") AND ($nouser != "yes") ){
                  $user_error = "yes";
                  ...
                  }
                  Wenn nun aber garnicht in diese Prüfung reingesprungen wird, so ergibt es die Ausgabe
                  Notice: Undefined variable: user_error in .. check.inc.php Line ..

                  Wenn man eine generelle Zuordnung mit NULL macht
                  if(!isset($user_error)){
                   $user_error = NULL;
                  }
                  kommt diese Meldung ja nicht.

                  Die Frage stellt sich mir nun,
                  Was ist sauber programmiert oder wie macht man es richtig?

                  Soll man was machen wie:
                  if(empty($user_error)){
                  $user_error = "";
                  }

                  oder am Anfang:
                  $user_error = "";

                  Bin für jede Anregung dankbar

                  Gruss
                  Werner

                  1. echo $begrüßung;

                    if( ($User_ID == "") AND ($nouser != "yes") ){
                    $user_error = "yes";
                    Wenn nun aber garnicht in diese Prüfung reingesprungen wird, so ergibt es die Ausgabe
                    Notice: Undefined variable: user_error in .. check.inc.php Line ..

                    Deswegen sollte man die Variable in einem unbedingten Schritt mit einem Defaultwert anlegen. Der bedingte Schritt ändert diesen oder eben nicht. Alternativ kann man den Defaultwert auch im else-Zweig setzen.

                    Wenn man eine generelle Zuordnung mit NULL macht
                    if(!isset($user_error)){
                    $user_error = NULL;
                    }
                    kommt diese Meldung ja nicht.

                    Damit machst du im Prinzip auch nichts anderes als der Variablen einen Defaultwert zuzuweisen. Nur etwas aufwendiger.

                    Die Frage stellt sich mir nun, Was ist sauber programmiert oder wie macht man es richtig?

                    Die Defaultwertzuweisung irgendwo zentral zu machen fördert nicht gerade die Übersichtlichkeit. Codeteile, die funktional zusammengehören sollten auch zusammen notiert werden. Du hast ja selbst gesehen, dass du dich schon nicht mehr an die NULL-Setzungsgeschichte erinnern konntest.

                    Möglicherweise gibt es auch eine komplett andere Vorgehensweise, die als sauberer, besser, wieauchimmer angesehen werden kann. Ich sehe ja nur diesen kleinen Teilaspekt und mache mir so meine Vorstellungen, wie es im Großen aussieht. Funktionen beispielsweise können auch zur Gliederung und Kapselung von Vorgängen eingesetzt werden, auch dann wenn sie nur einmal aufgerufen werden. (Funktionen werden ja vorwiegend verwendet, um mehrfach aufgerufene Codeteile nicht mehrfach notieren zu müssen.)

                    echo "$verabschiedung $name";

  2. Hallo

    Folgender Unterschied ist mir nun aufgefallen:
    Beim laden eines Formulars bzw. Php seite wird unter anderem ein Textfeld (txt_Anzahl)angezeigt.

    Ich prüfe nun mit isset ob das Feld befüllt wurde oder nicht.
    if( isset($_POST['txt_Anzahl']) ){
    ....

    echo "gesetzt";
    }

    Mit obigem "get_magic_quotes_gpc" Code kommt immer die Meldung "gesetzt". Wenn ich das weglasse kommt sie nicht und erst dann wenn das Feld befüllt ist und auf Sumbit geklickt wird.

    Ein paar der HTML-Formularelemente werden beim Abschicken nur gesendet, wenn sie Inhalt haben, ein paar andere werden grundsätzlich mitgesendet. Welche das konkret sind, habe ich leider nicht parat, es ließe sich aber durchtesten.

    Für dich dürfte die Lösung sein, mit !empty($_POST['txt_Anzahl']) auf ein explizit befülltes Formularelement zu prüfen anstatt mit auf isset() auf die Existenz des Arrayfeldes.

    Tschö, Auge

    --
    Die deutschen Interessen werden am Liechtenstein verteidigt.
    Veranstaltungsdatenbank Vdb 0.2