Willi: Frage wegen header:location + GET-Parametern

Hallo,
Ich habe derzeit folgenden Code um allen Seiten in ?style=1 hintendranzuhängen, damit man schnell wechseln kann, wenn ein zweiter CSS-Stil existiert. (Den gibt es zwar schon, aber bisher nur in der Entwicklungsversion...), also hier ist der Code:

  
$path = $_SERVER['PHP_SELF']; $file = basename($path);  
if(!isset($_GET['style']) || $_GET['style'] == "" || !is_numeric($_GET['style']) || $_GET['style'] < 1 || $_GET['style'] > 2) {  
    $_GET['style'] = 1;  
    $header = header("Location: $file?style=1");  
}  

Okay, das ist nicht besonders schön, weil, was ist, wenn schon weitere GET-Parameter existieren? Sie werden einfach gelöscht und es gibt nur noch den GET-Ausdruck ?style=1.
Genau das ist jetzt auch mein Problem. Ich habe auf einem Teil meiner Seite Steckbriefe, welche ich mit einsteckbrief.php?id=1 usw. aufrufe, leider kann ich sie nicht mehr aufrufen, weil die Variabel $_GET['id'] durch den vorherigen Code ja gelöscht wird.
Ich habe es zwar schon versucht, bein aber zu keinem zufrieden stellendem Ergebnis gekommen (ich landete in in einer Endlosschleife...), ich glaube nicht, dass jemanden den Code interessiert, wenn doch, einfach schnell posten und er wird nachgereicht.
Meine Frage ist deswegen: kann mir jemand bei meinem Problem helfen?

Schöne Weihnachtszeit,
Willi

--
Mein SelfCode: ie:{ fl:| br:> va:) ls:? fo:| rl:? n4:? ss:| de:> js:| ch:? sh:( mo:? zu:}
  1. Hallo Willi.

    $path = $_SERVER['PHP_SELF']; $file = basename($path);
    if(!isset($_GET['style']) || $_GET['style'] == "" || !is_numeric($_GET['style']) || $_GET['style'] < 1 || $_GET['style'] > 2) {
        $_GET['style'] = 1;
        $header = header("Location: $file?style=1");
    }

    
    > Okay, das ist nicht besonders schön, weil, was ist, wenn schon weitere GET-Parameter existieren? Sie werden einfach gelöscht und es gibt nur noch den GET-Ausdruck ?style=1.  
      
    Du solltest dir einmal $\_SERVER['QUERY\_STRING'] ausgeben lassen. Diesen kannst du an den bestehenden (oder umgekehrt) anknüpfen.  
      
      
    Einen schönen Freitag noch.  
      
    Gruß, Mathias  
    
    -- 
    ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)  
      
    debian/rules
    
    1. Hallo,

      Du solltest dir einmal $_SERVER['QUERY_STRING'] ausgeben lassen. Diesen kannst du an den bestehenden (oder umgekehrt) anknüpfen.

      Danke für deine schnelle Antwort, aber es klappt immer noch nicht so, wie ich es mir wünsche, er leitet immer auf einsteckbrief.php?style=1 um, wenn ich ?id=7 aufrufen möchte...
      Mein derzeitiger Code ist folgender:

        $path = $_SERVER['PHP_SELF'];  
        $file = basename($path);  
        $get = $_SERVER['QUERY_STRING'];  
        if($get == "" && $file != "einsteckbrief.php") {  
          $header = header("Location: $file?style=1");  
        }  
        if($file = "einsteckbrief.php") {  
          if(!isset($_GET['style'])){  
            $header = header("Location: einsteckbrief.php?style=1&".$get);  
          }  
        }  
      
      

      Kannst du mir (oder vllt. noch jemand anderes) mir weiterhelfen?

      Grüße,
      Willi

      --
      Mein SelfCode: ie:{ fl:| br:> va:) ls:? fo:| rl:? n4:? ss:| de:> js:| ch:? sh:( mo:? zu:}
      1. echo $begrüßung;

        Danke für deine schnelle Antwort, aber es klappt immer noch nicht so, wie ich es mir wünsche, er leitet immer auf einsteckbrief.php?style=1 um, wenn ich ?id=7 aufrufen möchte...

        Stimmen die Inhalte der Variablen mit den von dir gewünschten Werten überein? Ist das Ergebnis der Ausdrücke, die du als Bedingung verwendest, das von dir erwartete?

        $path = $_SERVER['PHP_SELF'];
          $file = basename($path);

        Was ist denn der Grund, basename() nicht gleich mit $_SERVER['PHP_SELF'] zu füttern?

        $header = header(...);

        header() gibt kein Ergebnis zurück. Es lohnt sich nicht, für dieses Nichts eine Variable anzulegen.

        if($file = "einsteckbrief.php") {

        Hier wolltest du vermutlich einen Vergleichsoperator verwenden.

        echo "$verabschiedung $name";

        1. Hallo,

          Danke für deine schnelle Antwort, aber es klappt immer noch nicht so, wie ich es mir wünsche, er leitet immer auf einsteckbrief.php?style=1 um, wenn ich ?id=7 aufrufen möchte...
          Stimmen die Inhalte der Variablen mit den von dir gewünschten Werten überein? Ist das Ergebnis der Ausdrücke, die du als Bedingung verwendest, das von dir erwartete?

          Ähm ja... bei if(!isset($_GET['style'])... habe ich eigentlich auch noch weitere Operatoren, der einfachheit halber habe ich diese rausgelassen (ich überprüfe noch ob der Wert numerisch ist, in welchem Zahlenraum er sich befindet etc.)

          $path = $_SERVER['PHP_SELF'];
            $file = basename($path);
          Was ist denn der Grund, basename() nicht gleich mit $_SERVER['PHP_SELF'] zu füttern?

          Ja, gut.... mhm... das ist so.... ach, ich mag es, jede Menge Variablen anzulegen :D, danke für den Hinweis.

          $header = header(...);
          header() gibt kein Ergebnis zurück. Es lohnt sich nicht, für dieses Nichts eine Variable anzulegen.

          Ja, stimmt. Hab ich jetzt auch mal geändert. Ist aber ja eigentlich egal wie man das macht...

          if($file = "einsteckbrief.php") {
          Hier wolltest du vermutlich einen Vergleichsoperator verwenden.

          Ja... den Fehler mach ich dauernd...
          Danke für deine Antwort, das ändert aber alles nichts an meinem Problem :(

          Grüße,
          Willi

          --
          Mein SelfCode: ie:{ fl:| br:> va:) ls:? fo:| rl:? n4:? ss:| de:> js:| ch:? sh:( mo:? zu:}
          1. Hi!

            Wie wäre es denn, wenn du das $_GET-Array mit foreach ausliest, dann hättest du sämtliche Bezeichner und Werte des Arrays und baust dir damit die neue URL mit dem zusätzlichen &style=1, falls es andere _GET-Variablen gibt und andernfalls mit ?style=1.

            Grüße
            crille

          2. Tach.

            if($file = "einsteckbrief.php") {

            Hier wolltest du vermutlich einen Vergleichsoperator verwenden.

            Ja... den Fehler mach ich dauernd...

            Einige Programmierer tauschen deshalb prophylaktisch die Reihenfolge der Operanden beim Vergleich einer Variablen mit einem Literal – bei zwei Variablen bringt das natürlich keinen Vorteil. Das sieht folgendermaßen aus:

              
              if ("einsteckbrief.php" == $file)  
            
            

            Vergißt du nun ein Gleichheitszeichen, meckert PHP sofort, weil die Zuweisung ...

              
              "einsteckbrief.php" = $file  
            
            

            ... nicht zulässig ist.

            --
            Once is a mistake, twice is jazz.
      2. Hallo Willi.

        Kannst du mir (oder vllt. noch jemand anderes) mir weiterhelfen?

        Hier einmal meine funktionstüchtige Fassung:

        if (!isset($_GET['foo'])) {  
          
          header('Location: http://'. $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] .  
            (empty($_SERVER['QUERY_STRING']) ? '?' : '&') . 'foo=BAR');  
        }
        

        Dies führt zu folgendem Verhalten:

        http://example.org/script.php → http://example.org/script.php?foo=BAR

        http://example.org/script.php?baz=QUX → http://example.org/script.php?baz=QUX&foo=BAR

        Einen schönen Freitag noch.

        Gruß, Mathias

        --
        ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
        debian/rules
  2. Hi,

    $path = $_SERVER['PHP_SELF']; $file = basename($path);
    if(!isset($_GET['style']) || $_GET['style'] == "" || !is_numeric($_GET['style']) || $_GET['style'] < 1 || $_GET['style'] > 2) {
        $_GET['style'] = 1;
        $header = header("Location: $file?style=1");
    }

      
    Hm. Warum willst Du überhaupt einen Redirect machen?  
    Falls kein oder ein falscher Stil angegeben ist, reicht es doch, wenn Du das intern in Deinem Script auf style 1 umbiegst.  
    Deswegen extra nochmal über den Browser zu gehen, halte ich für schlecht.  
      
    cu,  
    Andreas
    
    -- 
    [Warum nennt sich Andreas hier MudGuard?](http://MudGuard.de/)  
    [Schreinerei Waechter](http://www.schreinerei-waechter.de/)  
    [O o ostern ...](http://ostereier.andreas-waechter.de/)  
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.  
    
    
    1. Hallo,

      Hi,

      Hm. Warum willst Du überhaupt einen Redirect machen?
      Falls kein oder ein falscher Stil angegeben ist, reicht es doch, wenn Du das intern in Deinem Script auf style 1 umbiegst.
      Deswegen extra nochmal über den Browser zu gehen, halte ich für schlecht.

      Also soll ich es lieber mit POST-Daten bewerkstelligen?
      Grüße,
      Willi

      --
      Mein SelfCode: ie:{ fl:| br:> va:) ls:? fo:| rl:? n4:? ss:| de:> js:| ch:? sh:( mo:? zu:}
      1. Hallihallo!

        Also soll ich es lieber mit POST-Daten bewerkstelligen?

        Nein, im Prinzip schon so, wie Du es mit GET- Daten angedacht hattest. Nur mit dem Unterschied, daß die header()- function nicht gebraucht wird.
        Du schreibst einfach das <link rel="stylesheet"...> dynamisch in Deinen HTML- Code, und im Falle eines falschen GET['style']- Parameters wird einfach das Standardstylesheet eingebunden.

        Ein Redirect ist hier eigentlich nicht nötig, denn er führt sehr leicht zu einer Endlosschleife, und damit (hoffentlich) zu einer Fehlermeldung im Browser.

        Die einzige Anwendung für einen Redirect wäre meiner Meinung nach das "Bereinigen" eines Fehlerhaften style- Parameters im Querystring durch Entfernen Desselben:

          
        if ( (isset($_GET['style']) && ( (intval($_GET['style'])<1) || (intval($_GET['style']>2) ) ) {  
           $file = $_SERVER['PHP_SELF'];  
           $newquery = '?';  
           foreach ($_GET as $index => $value) {  
              if ($index != 'style') {  
                 $newquery .= $index.'='.$value.'&';  
              }  
           }  
           $newquery = substr($newquery,0,-1);     // das letzte "&" wieder weg, oder das"?", falls style der einzige Parameter war  
           header('Location: '.$file.$newquery);  
        }  
        
        

        Dieser Code greift nur dann, wenn ein style- Parameter vorhanden, aber mit falschen Werten belegt ist. In dem Fall wird dann der Style- Parameter einfach entfernt und ein neuer Seitenaufruf mit dem bereinigten Query- String erzwungen.
        Das lässt sich bestimmt mit ein Wenig Nachdenken verfeinern und verkürzen, (evtl. das "style" mit regulären Ausdrücken entfernen o.Ä.), aber es geht hier ja nur ums Prinzip... :)

        Normalerweise ist so Etwas aber unnötig, denn man kann ja, wie schon angedeutet, einfach das Vorhandensein und die Korrektheit eines style- Parameters (wie alle anderen natürlich auch) einfach nur da auswerten, wo er gebraucht wird, also beim Einbinden des Stylesheets:

          
        if ((isset($_GET['style'])) {  
           switch ($_GET['style']) {  
             case '1' : echo '<link rel=..... /* Stylesheet Nr. 1*/';  
                        break;  
             case '2' : /* Stylesheet Nr. 2 */  
                        break;  
             default  : /* Standardstylesheet */  
           }  
        } else {  
          /* Standardstylesheet */  
        }  
        
        

        Das ist eigentlich die gebräuchlichere Methode. Fehlerhafte Parameter bleiben in der Adresszeile des Browsers sichtbar, werden aber serverseitig ignoriert.

        In der Hoffnung, etwas Hilfreiches beigetragen zu haben,

        Viele liebe Grüße,
        Der Dicki