blumentopf: PHP und window.location.search

Ich habe auf einer Seite, die mit einer Wertübergabe mittels window.location.search und mit Ankern arbeitet, ein kleines php eingebaut (~~~php

<?php include("txt/kontakt.txt"); ?>

Alle genannten Elemente funktionieren für sich problemlos. Wenn ich aber die php-Variante mit dem search verbinde, und also auf eine derartige URL komme:  
/datei.php/?Wert#Anker funktioniert gar nichts mehr, und die Seite wird in völligem Chaos dargestellt. Das alleinige Löschen des Search aus dem Adressfeld repariert die Darstellung (der Anker scheint aber nicht zu stören), Unterschiede im ausgegebenen Quelltext kann ich auf die Schnelle keine feststellen.  
  
Deshalb meine Frage:  
Ist das generell so, dass php URL's keinen SearchWert enthalten dürfen, oder gibt es da etwas Spezielles zu beachten?  
Dank und Gruß
  1. Hi,

    Ist das generell so, dass php URL's keinen SearchWert enthalten dürfen,

    Natürlich dürfen sie.

    Im übrigen heißt es nicht „SearchWert“, sondern Query-String.

    oder gibt es da etwas Spezielles zu beachten?

    Zu beachten: Problembeschreibungen sollten nachvollziehbar sein.

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. Zu beachten: Problembeschreibungen sollten nachvollziehbar sein.

      naja, wenn die Antwort auf die erste Frage Nein gewesen wäre, wäre die Problembeschreibung ja ausreichend gewesen, ebenso, wenn QueryStringsbei php-Dateien anders formuliert werden würden, und somit hier etwas Spezielles zu beachten wäre.
      Da das offensichtlich nicht so zu sein scheint, liegt das Problem wohl tiefer, und ich muss zunächst einmal selbst überlegen, welchen Teil der Seite ich hier sinnvollerweise in die Frage mit einbeziehe, um mein Problem nachvollziehbarer zu beschreiben.
      Trotzdem Dank für die klare Ansage und Grüße

      1. ich habe nun bei ein paar eigenen und fremden php-Seiten ausprobiert, hinten einen Query String dranzuhängen, also datei.php/?Wert
        Alle PHP Seiten haben darauf gleichermaßen reagiert und konnten den Inhalt nicht mehr darstellen, während es bei html Seiten damit keine Probleme gibt. Wenn es also 'natürlich' möglich ist, einen solchen Wert dranzuhängen, wie muss man dies dann machen, damit die Seite trotzdem dargestellt werden kann?
        Dank und Gruß

        1. Moin!

          ich habe nun bei ein paar eigenen und fremden php-Seiten ausprobiert, hinten einen Query String dranzuhängen, also datei.php/?Wert

          Warum der Slash? Der ist falsch. Denn wenn die Originalurl auf "datei.php" endet, dann veränderst du den Pfadnamen, wenn du den Slash anhängst.

          Korrekt wäre datei.php?Wert

          Alle PHP Seiten haben darauf gleichermaßen reagiert und konnten den Inhalt nicht mehr darstellen, während es bei html Seiten damit keine Probleme gibt. Wenn es also 'natürlich' möglich ist, einen solchen Wert dranzuhängen, wie muss man dies dann machen, damit die Seite trotzdem dargestellt werden kann?

          Alle anderen Skripte (nicht nur PHP) und statischen Dateiabrufe dürften identisch darauf reagieren:

          Original: http://forum.de.selfhtml.org/hilfe/sonstiges.htm
          Fälschung: http://forum.de.selfhtml.org/hilfe/sonstiges.htm/?wert
          Funzt: http://forum.de.selfhtml.org/hilfe/sonstiges.htm?wert

          - Sven Rautenberg

          1. Mein Dank an Felix, Take und Sven,
            ich habe mir das falsch abgeschaut, und da es bei html-Endungen auch mit Slash funktioniert (zumindest im Browser meiner Wahl), dachte ich, es hätte mit php zu tun.
            Mein weiteres Nachfragen kam übrigens vor dem ersten Hinweis auf den Schreibfehler von Felix, nur die Postreihenfolge lässt es so aussehen, als wollte ich ihm einfach nicht glauben... ;)

            1. Moin!

              Mein Dank an Felix, Take und Sven,
              ich habe mir das falsch abgeschaut, und da es bei html-Endungen auch mit Slash funktioniert (zumindest im Browser meiner Wahl), dachte ich, es hätte mit php zu tun.

              Das bedeutet, alle meine Links haben bei dir funktioniert? Kann ich mir kaum vorstellen.

              Was ich mir aber vorstellen kann: Wenn du die HTML-Dateien aus deinem lokalen Dateisystem lädst, und nicht über HTTP, dann könnte dein Browser da unsichtbar Korrekturen durchführen. Und weil du PHP nicht durch Direktzugriff auf die lokale Datei aufrufen kannst, sondern immer irgendwas wie einen Server benötigst, hast du im Endeffekt Äpfel und Birnen verglichen.

              Mein weiteres Nachfragen kam übrigens vor dem ersten Hinweis auf den Schreibfehler von Felix, nur die Postreihenfolge lässt es so aussehen, als wollte ich ihm einfach nicht glauben... ;)

              Wir alle hier kennen die Baumstruktur des Forums und können auch die Uhrzeiten interpretieren, die an jedem Posting dranstehen. :)

              - Sven Rautenberg

        2. Moin,

          Wenn es also 'natürlich' möglich ist, einen solchen Wert dranzuhängen, wie muss man dies dann machen, damit die Seite trotzdem dargestellt werden kann?

          Indem man es richtig macht: Wie Felix schon sagte, gehört (bei Dateien) vor den Query-String kein Slash. Also:

          http://example.com/index.php?bla=blubb

          nicht

          http://example.com/index.php/?bla=blubb

          das würde bedeuten: ein Ordner, der index.php heißt und darin die index-Datei wird aufgerufen und bekommt den Query-String übergeben.

          Gruß,
          Take

      2. Hallo,

        Zu beachten: Problembeschreibungen sollten nachvollziehbar sein.
        [...] ich muss zunächst einmal selbst überlegen, welchen Teil der Seite ich hier sinnvollerweise in die Frage mit einbeziehe, um mein Problem nachvollziehbarer zu beschreiben.

        du solltest dir zunächst mal darüber klar werden, welcher Teil deines Problems clientseitig ist und welcher serverseitig.

        Insbesondere sollte ein Fragment Identifier (#anchor) nie beim Server ankommen, denn der wird ausschließlich lokal vom Browser verarbeitet. Einen Fragment Identifier bei einem serverinternen Request, zumal einem Filesystem-Zugriff zu notieren, kann daher nicht gutgehen.

        Und dann beachte, dass auch ein Query-String (?parameter=wert) nur Sinn ergibt, wenn er mit einem HTTP-Zugriff verwendet wird. Bei einem Zugriff auf Dateisystemebene (z.B. einem include) ist er sinnlos und normalerweise falsch.

        So long,
         Martin

        --
        Computer funktionieren grundsätzlich nicht richtig.
        Wenn doch, hast du etwas falsch gemacht.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Und dann beachte, dass auch ein Query-String (?parameter=wert) nur Sinn ergibt, wenn er mit einem HTTP-Zugriff verwendet wird. Bei einem Zugriff auf Dateisystemebene (z.B. einem include) ist er sinnlos und normalerweise falsch.

          Der Query String wird am Ende der Seite in einem Javascript verendet, das nichts mit den php Elementen zu tun hat.
          Aus der ursprünglichen html habe ich nur deshalb eine php-Datei gemacht, um wiederkehrenden Elemente zentral speichern und bearbeiten zu können.
          Wie bereits beschrieben lässt sich der Query String in von html gewohnter Weise aber auch an anderen php Seiten nicht anhängen, ohne Schaden zu verursachen. Wie müsst also ein solcher String aussehen bei einer php-Seite?
          Dank und Gruß

  2. Lieber blumentopf,

    /datei.php/?Wert#Anker

    was soll der Slash vor dem Fragezeichen?

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. /datei.php/?Wert#Anker

      was soll der Slash vor dem Fragezeichen?

      Stört dich der Slash?

      1. Lieber suit,

        /datei.php/?Wert#Anker

        was soll der Slash vor dem Fragezeichen?

        Stört dich der Slash?

        mich nicht, aber vielleicht ist "/datei.php?Wert#Anker" etwas anderes als "/datei.php/?Wert#Anker" - oder warum sollte es synonymisch sein?

        Liebe Grüße,

        Felix Riesterer.

        --
        ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
        1. Hallo Felix,

          Stört dich der Slash?
          mich nicht, aber vielleicht ist "/datei.php?Wert#Anker" etwas anderes als "/datei.php/?Wert#Anker" - oder warum sollte es synonymisch sein?

          so genau kenne ich mich mit den Eingeweiden des Apachen auch nicht aus, aber ...
          Sei http://example.org/script.php ein PHP-Script. Durch einen Request auf http://example.org/script.php wird es aufgerufen und ausgeführt. Das ist allgemein bekannt. Es wird aber auch ausgeführt, wenn man http://example.org/script.php/ oder http://example.org/script.php/forty-two abruft. Dabei wird alles, was nach dem Scriptnamen folgt, dem Script als $_SERVER['PATH_INFO'] zur Verfügung gestellt. Im ursprünglichen Fall also ein String, der nur den Slash enthält. Das ist überhaupt kein Problem.

          Problematisch wird es, wenn anderswo im Projekt relative Pfadangaben verwendet werden, die der Client (Browser) vervollständigen muss. Wird beispielsweise eine CSS-Ressource "style.css" referenziert, dann ergeben sich da schon Unterschiede:

          a) Wird das Script als http://example.org/script.php aufgerufen, vervollständigt der Browser zu http://example.org/style.css - passt.
          b) Wird das Script als http://example.org/script.php/ aufgerufen, vervollständigt der Browser zu http://example.org/script.php/style.css - passt nicht!

          Ergo: Alle relativ referenzierten Ressourcen werden nicht mehr gefunden, wenn ein deplazierter Slash angehängt wird.

          So long,
           Martin

          --
          Wer keiner Fliege etwas zuleide tut, darf sich nicht über die Maden im Fleisch wundern.
          Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
          1. Lieber Der Martin,

            Es wird aber auch ausgeführt, wenn man http://example.org/script.php/ oder http://example.org/script.php/forty-two abruft. Dabei wird alles, was nach dem Scriptnamen folgt, dem Script als $_SERVER['PATH_INFO'] zur Verfügung gestellt.

            das ist richtig. Mir gefällt das aber ganz und garnicht, da ich noch immer in Dateien und Verzeichnissen denke. Anstatt das PHP-Script aufzurufen hätte ich hier einen 404er erwartet, da http://example.org/script.php/forty-two im Grunde ein Verzeichnis namens "script.php" referenziert, das nicht existiert. Mir ist aber auch klar, dass unter *nix-basierten Systemen alles eine Datei ist, und dass ein Verzeichnis intern auch als eine solche verstanden werden kann. Deshalb wird das Script ja auch ausgeführt.

            Mir sind interne Umleitungen in solchen Dingen viel lieber. Aber man sieht z.B. auch bei Mediawiki, wie "elegant" man hier einfach einen Pseudo-Querystring an den Aufruf des zentralen PHP-Scripts anhängen kann. Praktisch ist das schon, da es beim Webserver kein mod_rewrite benötigt. Mir schmeckt es aber nicht. Für meine Projekte nutze ich lieber interne Umleitungen.

            Liebe Grüße,

            Felix Riesterer.

            --
            ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
            1. Hallo Felix,

              Mir gefällt das aber ganz und garnicht, da ich noch immer in Dateien und Verzeichnissen denke. Anstatt das PHP-Script aufzurufen hätte ich hier einen 404er erwartet, da http://example.org/script.php/forty-two im Grunde ein Verzeichnis namens "script.php" referenziert, das nicht existiert. Mir ist aber auch klar, dass unter *nix-basierten Systemen alles eine Datei ist, ...

              letzteres ist zwar richtig, aber du vermengst hier zwei Dinge, die so direkt nichts miteinander zu tun haben. Denn im Dateisystem eines Unixoiden geht das tatsächlich nicht. Wenn /home/Martin/xyz.txt eine Datei ist, führt ein Zugriff auf /home/Martin/xyz.txt/foo tatsächlich zu einem Fehler.
              Die Eigenheit, jedes Segment eines Pfades als mögliche Zieldatei zu interpretieren und ggf. den restlichen Pfad gesondert zu behandeln, ist eine Apache-Angelegenheit. Sogar wenn er unter Windows läuft.

              Mir sind interne Umleitungen in solchen Dingen viel lieber.

              Mir nicht, aber man muss sich solcher Mechanismen bewusst sein, sonst fällt man leicht auf die Nase.

              Mir schmeckt es aber nicht. Für meine Projekte nutze ich lieber interne Umleitungen.

              Jedem Tierchen ... ;-)

              Ciao,
               Martin

              --
              Früher habe ich mich vor der Arbeit gedrückt. Heute könnte ich stundenlang zusehen.
              Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
              1. Lieber Der Martin,

                Die Eigenheit, jedes Segment eines Pfades als mögliche Zieldatei zu interpretieren und ggf. den restlichen Pfad gesondert zu behandeln, ist eine Apache-Angelegenheit. Sogar wenn er unter Windows läuft.

                das habe ich jetzt neu dazugelernt. Vielen Dank dafür!

                Liebe Grüße,

                Felix Riesterer.

                --
                ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
            2. Mir sind interne Umleitungen in solchen Dingen viel lieber. Aber man sieht z.B. auch bei Mediawiki, wie "elegant" man hier einfach einen Pseudo-Querystring an den Aufruf des zentralen PHP-Scripts anhängen kann.

              Betreibe mal MediaWiki ohne mod_rewrite: anstatt /wiki/Artikelname steht dann /index.php/wiki/Artikename da :)