Burkhard: header() mit anker

Hallo Forum,

erstmal Frohe Weihnachten euch allen.

Also ich habe ein phpscript mit drei Formularen, das letzte Formular
ist recht weit unten so dass ich scrollen muss um es sehen zu können.

Nachdem abschicken der Formulardaten wir eine Funktion aufgerufen
welche diese verarbeitet und am ende per header die Ursprungsseite aufruft, nun soll sie aber genau dahin wieder zurückspringen wo der Besucher vorher war sprich zum anker. Leider bekomme ich es nicht hin da ab dem # zeichen alles verschwindet.

header("Location:http://.../start.php?id=4&$sid#unten");

Ich habe es schon versucht das # zu entschärfen mit #, leider brachte das genauso wenig wie urlencode().

Ich würde mich freuen wenn mir jemand helfen könnte, danke schonmal im vorraus

Burkhard

  1. Burkhard von derburkard.de (oder so?) ?

    mfg

    Tron

  2. Hello,

    probier es mal so aus:

    header("Location: http://.../start.php?id=4&$sid#unten");

    Liebe Grüße aus http://www.braunschweig.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    1. Hallo,

      nein funzt auch net.
      Adresszeile : .../start.php?id=96&
      und das wars außerdem klappt das mit der Session dann auch nicht mehr.

      Burkhard

      1. Hello,

        <?php  #### anker_call.php ####
          header("Location: anker.php?var1=2345&var2=hallo#kap02");
        ?>

        ich habe mal dies geschrieben und ausprobiert. In der Seite ist ein Anker <a name="kap02"> drin und der wird auch vom Browser angesteuert. Ist einfache nur das Beispiel aus Self rauskopiert und ein paar Zeilen dazugeschrieben nebst Parameter-Ausgabe.

        Funktioniert allerdings nicht in Framesets, auch wenn man den Anker durchreicht. Ist es denn eine Transitional-Seite? Ich vermute, dass das nur dort funktioniert. Hatte ich neulich hier erst eine Diskussion drüber.

        Liebe Grüße aus http://www.braunschweig.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        1. Hallo Tom,

          header("Location: anker.php?var1=2345&var2=hallo#kap02");

          Auch wenn der Header illegal ist (wegen dem #) sollte man ihn dennoch so nahe wie möglich an der Legalität spezifizieren => absolute URI.

          Funktioniert allerdings nicht in Framesets, auch wenn man den Anker durchreicht.

          Definiere "funktionieren in Framesets"...

          Ist es denn eine Transitional-Seite? Ich vermute, dass das nur dort funktioniert. Hatte ich neulich hier erst eine Diskussion drüber.

          Der DOCTYPE (ob angegeben oder nicht) spielt mit Sicherheit keine Rolle.

          Viele Grüße,
          Christian

          1. Hello,

            Auch wenn der Header illegal ist (wegen dem #) sollte man ihn dennoch so nahe wie möglich an der Legalität spezifizieren => absolute URI.

            Klar, das war auch nur eben schnell zusammengestrickt. Ich hätte die IP einsetzen müssen und mein public_html angeben müssen.

            Funktioniert allerdings nicht in Framesets, auch wenn man den Anker durchreicht.

            Definiere "funktionieren in Framesets"...

            Wenn Du eine geankerte URL in einem Frameset aufrufst, funktioniert das leider nicht. Innerhalb von Frames mögen die Browser das nicht. Haben wir neulich erst mit vereinten Kräften mit mehreren Browsern (IE 5.0 5.5. 6.x / Gecko / Mozilla / Opera) ausprobiert. keiner hat mitgespielt.

            Ist es denn eine Transitional-Seite? Ich vermute, dass das nur dort funktioniert. Hatte ich neulich hier erst eine Diskussion drüber.

            Der DOCTYPE (ob angegeben oder nicht) spielt mit Sicherheit keine Rolle.

            Hast Du es schon ausprobiert? Ich wäre da nicht so sicher!

            Liebe Grüße aus http://www.braunschweig.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            1. Hallo Tom,

              Wenn Du eine geankerte URL in einem Frameset aufrufst, funktioniert das leider nicht. Innerhalb von Frames mögen die Browser das nicht. Haben wir neulich erst mit vereinten Kräften mit mehreren Browsern (IE 5.0 5.5. 6.x / Gecko / Mozilla / Opera) ausprobiert. keiner hat mitgespielt.

              Wie meinst Du das? Bei mir funktioniert das: http://www.christian-seiler.de/temp/test-location-frameset.html

              Der DOCTYPE (ob angegeben oder nicht) spielt mit Sicherheit keine Rolle.

              Hast Du es schon ausprobiert? Ich wäre da nicht so sicher!

              Ich hab das sowohl mit Transitional, Strict und Seiten ohne DOCTYPE probiert. Warum sollte der eine Rolle spielen? Wie kommst Du darauf?

              Viele Grüße,
              Christian

              1. Hello Christian,

                das Problem ergibt sich, wenn man ein Frameset hat, das seine Frames mit (bzw. eins davon) mit Anker aufruft.

                <html>
                <head>
                  <title>Titel</title>
                </head>
                  <frameset cols="Spalten" rows="Reihen">
                    <frame src="URI#anker" name="Name">
                    <noframes>
                      Wird angezeigt, wenn der Browser keine Frames anzeigen kann
                    </noframes>
                  </frameset>
                </html>

                Dann klappt es nicht. Aber das ist gerade der gewünschte Fall.

                Liebe Grüße aus http://www.braunschweig.de

                Tom

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                1. Hallo Tom,

                  in dem Fall würde ich mir das gar nicht so schwer machen!
                  Warum unbedingt etwas über die Beine brechen wenn es doch viel einfacher geht?!

                  <body onload="this.src=#anker">

                  Fertig.

                  Und wenn man möchte, dass es nur beim Aufruf von der Index Seite geschieht, dann baut man eben noch eine Abfrage rein, von wo der Besucher kam.

                  Denke das ist das einfachste und funktionieren tut es auch ;o)

                  Aber mal zu Burkhard´s Post:
                  Also das senden eines Ankers über die header ist soweit nicht erlaubt. Das haben ja nun schon alle gesagt. Frage, die ich mir hierbei stelle ist: Was ist erlaubt und was nicht, wenn es doch bei ALLEN Browsern funktioniert? Also ich weiß aus Erfahrung, dass es sogar im professionellen Bereich eingesetzt wird und von daher darfst Du das auch :o)

                  Jetzt stellt sich nur die Frage, warum es bei dir nicht klappt. Die Schreibung deiner Werte sah eigentlich vernünftig aus, ich schreib nur nochmal ein Beispiel hier her:

                  Location Script:

                  <?php header("Location: path/to/file.htm?var1=$var1&sid=$sid#ankerpunkt"); ?>

                  Gelinkte HTML Datei:

                  <html>
                  <body>
                    Hier steht viel Text...<br />
                    Hier steht viel Text...<br />
                    Hier steht viel Text...<br />
                    Hier steht viel Text...<br />
                    Hier steht viel Text...<br />
                    Hier steht viel Text...<br />
                    Hier steht viel Text...<br />
                    Hier steht viel Text...<br />
                    Hier steht viel Text...<br />
                    Hier steht viel Text...<br />
                    Hier steht viel Text...<br />
                    Hier steht viel Text...<br />
                    Hier steht viel Text...<br />
                    Hier steht viel Text...<br />
                    <a name="ankerpunkt"></a>Hier linkt der Link hin...
                  </body>
                  </html>

                  Wichtig ist, dass Du denn Ankerpunkt genau benennst. Oft kommt es vor, dass beim Name auch eine # auftaucht, da gehört diese aber nicht hin.

                  Falls es immer noch nicht klappen sollte, wäre es schön, wenn Du uns den Code mal genauer zeigen könntest.

                  Gruss Stefan

                  1. Hello Stefan,

                    <body onload="this.src=#anker">

                    Vielen Dank für den Tipp. Das werde ich auch mal ausprobieren und in meine Sammlung aufnehmen. Das Anker-Problem bei Framesets schleppe ich jetzt schon über ein Jahr durch meine Entwicklung und es hat noch niemand lösen können. Bei Bentutzung von <a href=....> funktioniert es und bei <frame scr="..." > funktioniert es eben nicht. Darum bin ich nun auch skeptisch, wenn du mir eine Scripting-Lösung mit src= anbietetst. Aber vielleicht ist ja "src" bei JS gleichbedeutend mit "<a .." bei reinem HTML?

                    *grummel, grummel*

                    Liebe Grüße aus http://www.braunschweig.de

                    Tom

                    --
                    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                    1. Hallo,

                      ok das ist die ganze funktion ...

                      <?php
                      function db_ChangeUserAvatar($Server, $Name, $BildName, $probe, $MAX_FILE_SIZE) {
                      $PicName = $BildName + 50;
                      $FileNewName = "./002/member/$PicName.gif";
                      if (isset($_FILES['probe']) and ! $_FILES['probe']['error']) {
                       $Filename = "./002/member/$BildName.gif";
                       rename($Filename, $FileNewName);
                         if($_FILES['probe']['type'] == "image/gif") {
                         $Filename = "./002/member/$PicName.gif";
                         move_uploaded_file($_FILES['probe']['tmp_name'], $Filename);
                         $avFehler = "Bild gespeichert";
                         }
                        else if($_FILES['probe']['type'] == "image/gif") {
                          $avFehler = "datei ist kein gif!";
                        }
                       $SQLString = "UPDATE User SET UserAvatar = '$PicName' WHERE UserName = '$Name'";
                       $db_userAvatarUp = mysql_db_query("db79801924", $SQLString, $Server);
                       if (!$db_userAvatarUp) { echo mysql_errno() . ": " . mysql_error() . "\n"; }
                       }
                       $ImageSize = GetImageSize ($Filename);
                       if ($ImageSize[0] > 100 || $ImageSize[1] > 100) { $avFehler = "Bild ist größer als 100 x 100 px!"; }
                       $sid = SID;
                       header("Location: http://192.168.2.101/reuterlingeandmore/start.php?id=96&avFehler=$avFehler&$sid#avatar");
                      }
                      ?>
                      diese Funktion wird per require_once in die start.php eingebunden
                      und bei absenden der Formulardaten per if(isset)) aufgerufen.

                      $id gibt die angezeigt Seite an also wird der Anker ebenfalls erst per require eingebunden. natürlich weiter unten.Ich habe ihn auch schon direkt in die start.php gesetzt.

                      Nochmal Danke euch allen

                      Gruss Burkhard

                      P.S.: meine Schreibweisen sind vielleicht nicht ganz korrekt
                      hab mir php selbst beigebracht zumindest ansätze davon :-)

                      1. Hallo!

                        ok das ist die ganze funktion ...

                        Dies nutzt uns alles wenig. Denn: wir wissen immer noch nicht, was denn tatsächlich an Deinem Browser ankommt...

                        Für den Mozilla gibt es eine Erweiterung, mit der Du die HTTP-Header mitschneiden kannst: http://livehttpheaders.mozdev.org/

                        Oder Du kannst Dir unabhängig vom verwedneten Browser den kompletten Netzwerkverkehr mitschneiden lassen: http://www.ethereal.com/distribution/win32/

                        Mal eine andere Frage: gibt es den Anker überhaupt auf der Zielseite? Also gibt es überhaupt ein <a name="avatar">?

                        Viele Grüße,
                        Christian

                2. Hallo Tom,

                  das Problem ergibt sich, wenn man ein Frameset hat, das seine Frames mit (bzw. eins davon) mit Anker aufruft.

                  <html>
                  <head>
                    <title>Titel</title>
                  </head>
                    <frameset cols="Spalten" rows="Reihen">
                      <frame src="URI#anker" name="Name">
                      <noframes>
                        Wird angezeigt, wenn der Browser keine Frames anzeigen kann
                      </noframes>
                    </frameset>
                  </html>

                  Dann klappt es nicht.

                  Nicht? Also bei mir klappt das:

                  http://www.christian-seiler.de/temp/test-frameset-1.html

                  (Netscape 4.77, Konqueror 3.1.2, Opera 7.20 Beta 9 (nicht immer, aber meistens), Mozilla 1.4)

                  Aber das ist gerade der gewünschte Fall.

                  Ähm, wir sprachen hier von einer Location-Weiterleitung auf eine Seite mit Anker, du sagst dann, in einem Frameset funktioniert es nicht, und aus diesem Zusammenhang ist überhaupt nicht ersichtlich, dass Du es so gemeint haben könntest, wie du es gemeint hast. (und selbst das, was Du gemeint hast, kann ich nicht nachvollziehen, siehe oben)

                  Viele Grüße,
                  Christian

  3. Hallo Burkhard

    Leider bekomme ich es nicht hin da ab dem # zeichen alles verschwindet.

    Folgendes: Was Du machen willst, ist nicht standardkonform. Es funktioniert dennoch in allen mir bekannten Browsern [1] und ich wende es auch an.

    Ich hatte mal eine Testseite eingerichtet, um die Browserunterstützung zu testen: http://www.christian-seiler.de/temp/location.php

    Hier kannst Du sehen, dass da ein Location-Header mit # gesendet wird: http://forum.de.selfhtml.org/cgi-bin/http_trace.pl?url=http%3A%2F%2Fwww.christian-seiler.de%2Ftemp%2Flocation.php&method=HEAD&version=HTTP%2F1.1

    Und alle Browser, in denen ich das bisher getestet hatte, machen das.

    Wenn also etwas nicht klappt, dann kannst Du unter http://forum.de.selfhtml.org/cgi-bin/http_trace.pl überprüfen, ob der Header überhaupt so an Deinen Browser gelangt. Und wenn der so ankommt, solltest Du vielleicht auch noch überprüfen, ob der Anker auf der fraglichen Seite überhaupt existiert.

    Viele Grüße,
    Christian

    [1] Ich glaube mich zu erinnern, dass einige alte Versionen von Lynx nicht zum Anker springen, die Zielseite jedoch normal anzeigen, was IMHO auch akzeptabel ist.

    1. Hallo,

      Folgendes: Was Du machen willst, ist nicht standardkonform. Es funktioniert dennoch in allen mir bekannten Browsern [1] und ich wende es auch an.

      Ich verwende MSIE 6 und das mit den ankern funktioniert normalerweise auch.

      Danke für deinen Link, leider habe ich die Seite im moment noch Lokal am laufen werde das aber mal testen.

      Gruss Burkhard