Nico: Variable Übergeben !

Hey,

irgenwie funktioniert was selsbst verständliches nicht !

das hier steht in der adress leiste

.....admin/links_quest.php?id=5

und wenn ich dann die Variable id ausgebe kommt nix raus !!

warum ??

eigentlich müsste das doch so gehen oder ?

mfg Nico

  1. Vielleicht per $_GET["id"] ?

  2. Hello Nico,

    das hier steht in der adress leiste

    .....admin/links_quest.php?id=5

    und wenn ich dann die Variable id ausgebe kommt nix raus !!

    warum ??

    vielleicht beantwortet Das Deine Fragen etwas?

    http://de3.php.net/manual/en/language.variables.predefined.php

    Harzliche Grüße vom Berg
    http://bergpost.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

  3. Hi Nico,

    Hintergrund ist wohl die Tatsache, dass Du auf eingeschaltete register_globals baust – eine Sache, die Du Dir schnellstens abgewöhnen solltest. Eingeschaltete register_globals sind eine große Sicherheitslücke. In PHP 6 wird diese Möglichkeit dann übrigens endgültig abgeschaltet.

    Weitere Informationen findest Du im offiziellen Manual. Ich habe Dir den Link mal herausgesucht: http://de3.php.net/register_globals

    Um auf dein Problem auch noch kurz konkret einzugehen: Du kannst die GET-Übergabe mit der entsprechenden Superglobal nutzen, also $_GET['id'].

    Viel Erfolg beim Programmieren,
    zettelbox

    1. echo $begrüßung;

      Eingeschaltete register_globals sind eine große Sicherheitslücke.

      Das ist nicht richtig. register_globals ist nur dann gefährlich, wenn man schlampig programmiert. Wenn man alle verwendeten Variablen vor dem ersten lesenden Gebrauch eindeutig initialisiert, können einem durch register_globals angelegte Variableninhalte nicht gefährlich werden.

      Stellt man beim PHP-Programmieren das error_reporting auf E_ALL (und display_errors auf on) werden Zugriffe auf nicht initialisierte Variablen mit einer Hinweis-Meldung angezeigt.

      Nichtsdestotrotz ist eine Verwendung der Arrays $_GET und $_POST statt der per register_globals angelegten Variablen empfehlenswert, weil damit eindeutig sichtbar ist, woher man einen bestimmten Wert erwartet. Damit einhergehend sollte man prinzipiell Werte in $_*-Arrays als potenziell gefährlich ansehen.

      Um auf dein Problem auch noch kurz konkret einzugehen: Du kannst die GET-Übergabe mit der entsprechenden Superglobal nutzen, also $_GET['id'].

      Aber bitte _nicht_

      $id = $_GET['id'];

      als Übergabe oder Abholung ansehen! Diese Umkopiererei ist überflüssig. Ein Array-Element ist völlig gleichwertig zu "einfachen" Variablen. Durch die Umkopiererei geht vor allem der optische Bezug zu GET und POST verloren. Gewinnen kann man damit nicht viel. Das bisschen weniger Tipparbeit erkauft man sich mit weniger Übersichtlichkeit. Taucht im weiteren Scriptverlauf irgendwo ein $id auf, sieht das recht harmlos aus, $_GET['id'] ist immer eine potenziell unsichere Benutzeringabe zu erkennen.

      echo "$verabschiedung $name";

      1. Hello,

        Stellt man beim PHP-Programmieren das error_reporting auf E_ALL (und display_errors auf on) werden Zugriffe auf nicht initialisierte Variablen mit einer Hinweis-Meldung angezeigt.

        ... aber nur im Moment des Zugriffes.

        Verstecken sich solche Zugriffe aber in einer Bedingung, die beim Testen nicht zutrifft, bekommt man keine Notice. Die nicht initialisierte Variable bleibt unentdeckt.

        Harzliche Grüße vom Berg
        http://bergpost.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

        1. echo $begrüßung;

          Stellt man beim PHP-Programmieren das error_reporting auf E_ALL (und display_errors auf on) werden Zugriffe auf nicht initialisierte Variablen mit einer Hinweis-Meldung angezeigt.

          ... aber nur im Moment des Zugriffes.

          Verstecken sich solche Zugriffe aber in einer Bedingung, die beim Testen nicht zutrifft, bekommt man keine Notice. Die nicht initialisierte Variable bleibt unentdeckt.

          Das ist richtig. Wer seine Scripte aber nicht für alle möglichen und unmöglichen Fälle testet, hat sicher noch mehr Leichen im Keller liegen. Beispielsweise nicht beachtete Fehlerauftrittsmöglichkeiten bei Datenbankabfragen.

          register_globals auszuschalten und sich dann sicher zu wähnen ist jedenfalls ein Trugschluss. Richtig programmiert ist, wenn trotz eingeschaltetem register_globals einem dieses Feature nichts anhaben kann.

          echo "$verabschiedung $name";

          1. Hello,

            register_globals auszuschalten und sich dann sicher zu wähnen ist jedenfalls ein Trugschluss. Richtig programmiert ist, wenn trotz eingeschaltetem register_globals einem dieses Feature nichts anhaben kann.

            Ist 'was dran.

            Wie sieht das denn mit der "Eigensicherheit" von Funktionen und Prozeduren aus?
            Sollte man die immer herstellen, oder sollte man sich darauf verlassen, dass die passenden Argumente immer übergeben werden?

            Mein klassisches Beispiel ist dabei foreach()

            Wenn kein Array übergeben wird, gibt es einen Fehler.
            Hätte man da nicht auch einfach "nichts" machen können?

            Nichts anders passiert doch, wenn man es selber "nachbessert"

            if (is_array($_liste))
            {
              foreach($_liste as $lfd_nr => $zeile)
              {
                ## tu 'was
              }
            }

            Harzliche Grüße vom Berg
            http://bergpost.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
            Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

            1. echo $begrüßung;

              Wie sieht das denn mit der "Eigensicherheit" von Funktionen und Prozeduren aus?
              Sollte man die immer herstellen, oder sollte man sich darauf verlassen, dass die passenden Argumente immer übergeben werden?

              Ich seh das aus praktischer Sicht: Kommt darauf an. Wenn die Auswirkungen im Fehlerfall trivial sind, ist es vielleicht zu viel des Guten, da eine umfangreiche Überprüfung stattfinden zu lassen. Wenn keine Sicherheitslücke in der Funktion ist, und der Anwender sie trotz der Hinweise in der Dokumentation mit falschen Argumenten füttert ist das sein Problem.

              Mein klassisches Beispiel ist dabei foreach()

              Wenn kein Array übergeben wird, gibt es einen Fehler.
              Hätte man da nicht auch einfach "nichts" machen können?

              Nichts anders passiert doch, wenn man es selber "nachbessert"

              if (is_array($_liste))
              {
                foreach($_liste as $lfd_nr => $zeile)
                {
                  ## tu 'was
                }
              }

              PHP bietet seit Version 5 Type Hinting an. Vorwiegend für OOP erfunden, da es ursprünglich nur Klassen annahm, kam mit Version 5.1 auch noch array hinzu

              function foo(array $bar) {
                foreach ($bar as ...)
                  ...
              }

              Dein Selber-Nachbessern wird wohl in vielen Fällen auch mit einem else-Zweig ausgestattet sein. Ein stillschweigendes Ignorieren eines fehlerhaften Arguments bei foreach hielte ich für keine gute Idee.

              Weitere Möglichkeiten, die man aber je nach Anwendungsfall bewerten muss:

              /**
               * Beispiel 1
               *
               * @param array/string $argument  Array mit Werten oder Werte als komma-separierter String
               */
              function foo($argument) {
                if (is_scalar($argument))
                  $argument = explode(',', $argument)

              foreach ($argument as ...)
                  ...
              }

              /**
               * Beispiel 2
               *
               * @param mixed $argument  mehrere Werte als Array oder ein Einzelwert
               */
              function foo($argument) {
                $argument = (array)$argument;

              foreach ($argument as ...)
                  ...
              }

              Beispiel 2 zeigt einen expliziten Typecast. Kommt ein Array, bleibt es ein Array. Kommt ein skalarer Wert, wird daraus ein Array mit ihm als einziger Wert. (Kommt ein Objekt ... den Fall lass ich mal unbeachtet).

              echo "$verabschiedung $name";