Get Parameter mit eingebauten get-Parametern
Heiko Teiken
- php
Hi,
ich habe eine PHP Datei, an welche per GET eine URL übergeben werden soll. Diese URL ist allerdings die Adresse einer anderen PHP Datei und enthält ebenfall GET Parameter. Wie muss ich den Parameter Codieren, damit meine PHP Datei auch die richtige URL bekommt und diese abrufen kann?
Kann mir jemand helfen?
Mit freundlichen Grüßen,
Heiko Teiken
Hallo
Hi,
ich habe eine PHP Datei, an welche per GET eine URL übergeben werden soll. Diese URL ist allerdings die Adresse einer anderen PHP Datei und enthält ebenfall GET Parameter. Wie muss ich den Parameter Codieren, damit meine PHP Datei auch die richtige URL bekommt und diese abrufen kann?Kann mir jemand helfen?
Ich finde dieses Vorgehen zwar suboptimal, aber diese Funktionen sollten dir helfen: urlencode bzw. http://de2.php.net/manual/de/function.rawurlencode.php.
Tschö, Auge
Hello,
Ich finde dieses Vorgehen zwar suboptimal, aber diese Funktionen sollten dir helfen: urlencode bzw. http://de2.php.net/manual/de/function.rawurlencode.php.
Der Vollständigkeit halber will ich einwerfen, dass jeder Parameter und jeder Name eines Parameters einzeln mit rawurlencode() behandelt werden müssen (also keinesfalls die URi in Gesamtheit!) und anschließend noch die Kontext-Codierung für das HTML-Dokument mit htmlspecialchars() über die gesamte entstandene URi hergestellt werden muss.
Ein harzliches Glückauf
Tom vom Berg
http://bergpost.annerschbarrich.de
.
echo $begrüßung;
[...] diese Funktionen sollten dir helfen: urlencode bzw. http://de2.php.net/manual/de/function.rawurlencode.php.
Beide Funktionen sind _nicht_ beliebig gegeneinander austauschbar. Wie auf der Handbuchseite zu urlencode() zu lesen ist, ist diese Funktion für Werte im Query-Teil zu verwenden. Bei rawurlencode() steht zwar der Anwendungsfall nicht explizit dabei, es lässt sich aber aus den Beispielen erkennen, dass diese Funktion für Werte im Pfad-Teil zu verwenden ist.
echo "$verabschiedung $name";
Hello,
[...] diese Funktionen sollten dir helfen: urlencode bzw. http://de2.php.net/manual/de/function.rawurlencode.php.
Beide Funktionen sind _nicht_ beliebig gegeneinander austauschbar. Wie auf der Handbuchseite zu urlencode() zu lesen ist, ist diese Funktion für Werte im Query-Teil zu verwenden. Bei rawurlencode() steht zwar der Anwendungsfall nicht explizit dabei, es lässt sich aber aus den Beispielen erkennen, dass diese Funktion für Werte im Pfad-Teil zu verwenden ist.
*hoppla*
Nun wird dieser Thread doch noch mächtig interessant.
Die Klärung des Unterschiedes habe ich schon lange auf meinem Zettel.
Vielleicht könnten wir das mal zuende diskutieren.
Könnte ungefähr genauso aufschlussreich werden, wie der Unterschied zwischen htmlspecialchars() und htmlentities()...
Ein harzliches Glückauf
Tom vom Berg
http://bergpost.annerschbarrich.de
.
Hallo
[...] diese Funktionen sollten dir helfen: urlencode bzw. [http://de2.php.net/manual/de/function.rawurlencode.php@title=rawurlencode].
Komm ich doch noch dazu, den Link zu rawurlencode zu korrigieren. :-)
Beide Funktionen sind _nicht_ beliebig gegeneinander austauschbar. Wie auf der Handbuchseite zu urlencode() zu lesen ist, ist diese Funktion für Werte im Query-Teil zu verwenden. Bei rawurlencode() steht zwar der Anwendungsfall nicht explizit dabei, es lässt sich aber aus den Beispielen erkennen, dass diese Funktion für Werte im Pfad-Teil zu verwenden ist.
Nun wird dieser Thread doch noch mächtig interessant.
Tsstsstss, der ist bei dieser, deiner Aussage nicht mal drei Stunden alt. :-)
Könnte ungefähr genauso aufschlussreich werden, wie der Unterschied zwischen htmlspecialchars() und htmlentities()...
Das sollte ja mittlererweile _hier_ doch schon durch sein. ;-)
Tschö, Auge
Hello,
Könnte ungefähr genauso aufschlussreich werden, wie der Unterschied zwischen htmlspecialchars() und htmlentities()...
Das sollte ja mittlererweile _hier_ doch schon durch sein. ;-)
Klar, ahbe ich ja auch mit Sven R. durchexerziert. Und wenn selbst ich einsichtig geworden bin, muss er das wohl richtig gut erklärt haben *g*
Ich dachte nun, dass DU für den Unterschied zwischen urlencode() und rawurlencode() als Dialogpartner herhalten würdest ;-)
Alleine kreige ich diese Zusammenhänge doch auch immer nicht auf die Reihe. Das geht aber augenscheinlich sehr Vielen so...
Ein harzliches Glückauf
Tom vom Berg
http://bergpost.annerschbarrich.de
.
Hallo
Ich dachte nun, dass DU für den Unterschied zwischen urlencode() und rawurlencode() als Dialogpartner herhalten würdest ;-)
Alleine kreige ich diese Zusammenhänge doch auch immer nicht auf die Reihe. Das geht aber augenscheinlich sehr Vielen so...
Das ist wohl wahr, ... also letzteres. Da ich in meinen Skripten, wenn überhaupt, eigentlich nur Zahlen als GET-Parameter übergebe, bin ich mit diesen Funktionen seit Jahren nicht mehr in Berührung gekommen. Aber nach dedlfix' Aussagen habe ich mir die Beschreibungen doch noch mal genauer angeschaut.
In den Beispielen zu urlencode[1] sehe ich dedlfix' Angabe bestätigt, dass damit die Werte von GET-Parametern maskiert werden.
<?php
$query_string = 'foo=' . urlencode($foo) . '&bar=' . urlencode($bar);
echo '<a href="mycgi?' . htmlentities($query_string) . '">';
?>
Nicht die URI, nicht die Parameternamen, nein, nur deren Werte werden mit urlencode
behandelt. Das Beispiel zeigt auch gleich noch (wo wir grade dabei waren), dass htmlentities
nicht einfach der "unnötig aufgeblasene große Bruder" von htmlspecialchars
ist[1], sondern da, wo _jedes_ Sonderzeichen maskiert werden muss, seinen Einsatz findet.
Mit rawurlencode werden, wenn ich es richtig verstanden habe, Teile einer URL maskiert. Das Beispiel 2 im Manualeintrag zu rawurlencode
zeigt die Kodierung eines Ressourcennamens, der Leerzeichen enthält.
Falls diese, meine Beschreibung nicht vollständig ist, möge man mich bitte aufklären, um meinen Horizont zu erweitern. :-)
[1] Im hiesigen Forum geht es ja oft darum, die Ausgabe von Strings, die skriptseitig in eine Seite eingefügt werden, dem Kontext entsprechend zu behandeln, wodurch oft nur darüber gesprochen wird, dass htmlentities
dabei "über's Ziel hinausschießt". Hier haben wir mal ein konkretes Beispiel für einen Einsatz von htmlentities
.
Tschö, Auge
echo $begrüßung;
Nicht die URI, nicht die Parameternamen, nein, nur deren Werte werden mit urlencode behandelt.
Die Parameternamen bedürfen in dem Beispiel keiner Behandlung, weil sie keine kritischen Zeichen enthalten. Täten sie das (beispielsweise ein #), müssten sie ebenfalls URL-gerecht behandelt werden (%23, sonst zählt es ja als Anker-Anfang). PHP verhält sich hier gemäß der urlencode()-Arbeitsweise, denn es behandelt + und %20 gleich (wandelt es zu einem Unterstrich, weil ein Leerzeichen nicht in einem Variablennamen vorkommen kann, und damit register_globals nicht mehr funktionieren tät).
Das Beispiel zeigt auch gleich noch (wo wir grade dabei waren), dass htmlentities nicht einfach der "unnötig aufgeblasene große Bruder" von htmlspecialchars ist[1], sondern da, wo _jedes_ Sonderzeichen maskiert werden muss, seinen Einsatz findet.
Und auch da (wie an einigen anderen Handbuchstellen) ist es sinnlos eingesetzt, htmlspecialchars() völlig ausreichend. Ja, es bleibt nach Anwendung von urlencode() noch nicht mal Arbeit für htmlentities() übrig, die nicht von htmlspecialchars() erledigt werden kann. Es geht dann ja nur noch um das &, denn alles andere ist bereits URL-kodiert. Und selbst das & kann man sich unter PHP sparen und gegen ein keine Maskierung benötigendes ; als Parametertrenner austauschen, und damit einer Empfehlung des W3C folgen: Ampersands in URI attribute values. Voraussetzung ist, dass man PHP _vor_ dem Scriptstart konfigurieren kann (ini_set() ist zu spät). Das geht in einer eingenen php.ini bei CGI oder bei erlaubtem php_value in den üblichen Apache-Konfigurationsdateien bei Verwendung von mod_php. Stellt man arg_separator.input auf ";&", so kann man selbst das ; verwenden (url?foo=bar;qux=baz), und der Browser sein & beim Formularversand. Beide zeichen werden dann gleichberechtigt als Trenner anerkannt.
echo "$verabschiedung $name";
echo $begrüßung;
[urlencode() vs. rawurlencode()]
Die Klärung des Unterschiedes habe ich schon lange auf meinem Zettel.
Die Beispiele im Handbuch geben für urlencode() den Querystring als Einsatzort an und den Pfadteil für rawurlencode(). Der Unterschied ist, dass das Leerzeichen bei urlencode() zum + wird und bei rawurlencode() zu %20. urlencode() ist für den Pfad nicht verwendbar, weil das + von PHP (von anderen Auswertenden sicher auch) dort als + interpretiert wird, nicht als Leerzeichen. Andererseits wird ein %20 im Querystring auch als Leerzeichen erkannt. Ich muss mich also etwas korrigieren. Im Querystring kann sowohl urlencode() als auch rawurlencode() gleichermaßen verwendet werden. Für den Pfad-Teil ist jedoch nur rawurlencode() zu verwenden.
Versuchsaufbau:
Apache mit aktiviertem AcceptPathInfo
test.php:
<pre>
<?php
var_dump($_GET['test']);
var_dump($_SERVER['PATH_INFO']);
Aufrufen über:
http://.../test.php/foo+bar?test=foo+bar
http://.../test.php/foo%20bar?test=foo%20bar
Die erste URL simuliert das Verhalten von urlencode().
string(7) "foo bar"
string(8) "/foo+bar"
Die zweite entspricht rawurlencode().
string(7) "foo bar"
string(8) "/foo bar"
Könnte ungefähr genauso aufschlussreich werden, wie der Unterschied zwischen htmlspecialchars() und htmlentities()...
Wozu brauchst du das was htmlentities() extra zu htmlspecialchars() macht, wenn du doch mit einer passenden charset-Angabe im Content-Type-Header die Zeichen direkt kodiert notieren kannst. Um htmlentities() nutzen zu können brauchst du auf alle Fälle das Wissen, in welcher Kodierung die ursprüngliche Zeichenfolge vorliegt. Dieses Wissen kannst du auch in die charset-Angabe schreiben.
Als ein mögliches Anwendungsbeispiel für htmlentities() kann meiner Meinung nach allenfalls eine historische Anwendung herhalten, bei der große Teile (des Templates) bereits in einer bestimmten Kodierung vorliegen, die aber für die darin einzuarbeitenden Daten aus aktuellen Gründen nicht mehr reicht (z.B. Zeichen jenseits von ISO-8859-1 sollen verwendet werden).
Man wird damit aber möglicherweise nicht glücklich. Besonders dann, wenn die Anwender Daten eingeben sollen, und dabei von diesen "exotischen" Zeichen Gebrauch machen, kann sie der Browser nicht gemäß der Kodierung der Seite an den Server liefern. Was er daraus zu machen hat, ist nicht definiert. Einige nehmen NCRs. Doch dann hast du ein Problem, das Browser-Ersatz-NCR von einer durch den Benutzer eingegebenen Zeichenfolge, die den Regeln einer NCR entspricht, zu unterscheiden.
echo "$verabschiedung $name";
Hello,
Könnte ungefähr genauso aufschlussreich werden, wie der Unterschied zwischen htmlspecialchars() und htmlentities()...
Wozu brauchst du [...]
Das Thema war doch auch durch.
Sven R. hat es ausführlichnund verständlich auf den Punkt gebrafht in einem Thread mit mir.
Mit gine es eben darum, einen Vergleich zu finden mit ähnlich indiffereten Funktionen, wenn man nicht näher hingeschaut hat.
Auf htmlentities() kann man wohl (meistens) verzichten und genauso kommt mit das vor mit urlencode().
Ein harzliches Glückauf
Tom vom Berg
http://bergpost.annerschbarrich.de
.
Hallo
Auf htmlentities() kann man wohl (meistens) verzichten ...
Das von mir besprochene Beispiel zeigt einen Einsatz von htmlentities fernab von Teilen des Seiteninhalts, sondern im Parameterteil einer URL und dann auch noch ausgerechnet auf der Manualseite zu urlencode. :-)
und genauso kommt mit das vor mit urlencode().
Mir kommt es eher so vor, dass wir, die wir verinnerlicht haben, in einer URL keine Leer- und sonstigen Sonderzeichen (Umlaute, etc. pp.) zu verwenden, gut auf rawurlencode verzichten können. In einem Parameterwert können aber solche Zeichen vorkommen, weshalb urlencode nicht zweckfrei ist. Und das, obwohl wir festgestellt haben, dass dort auch rawurlencode verwendbar ist.
Wieder was gelernt, und das am Sonntag. :-)
Tschö, Auge
Nabend,
ich habe eine PHP Datei, an welche per GET eine URL übergeben werden soll. Diese URL ist allerdings die Adresse einer anderen PHP Datei und enthält ebenfall GET Parameter. Wie muss ich den Parameter Codieren, damit meine PHP Datei auch die richtige URL bekommt und diese abrufen kann?
Kann mir jemand helfen?
du möchtest einen String als GET Parameter übergeben, dazu hat er mit urlencode() behandelt zu werden. Welcher Art der String ist, spielt dabei keine Rolle...
Gruß,
Andreas