Frank: Was macht parse_str() aus meinem + Zeichen :o(

Hallo,

$mystr = "test1=blah&test-1=bleh&test+1=burp";
parse_str($mystr, $myarray);
echo $myarray['test1'];
echo $myarray['test-1'];
echo $myarray['test+1'];

bla bleh ... und $myarray['test+1'] gibts nicht ...

Warum ist das so ? (wegen '+' natürlich, aber wo liegt der Sinn des Ganzen ?)
Welche Zeichen sind davon noch betroffen ?
Wie kann ich die Zeichen maskieren oder schützen ?
Oder was kann ich sonst tun ?

Ich komme um die + leider nicht rum ...
Danke Frank

  1. echo $begrüßung;

    $mystr = "test1=blah&test-1=bleh&test+1=burp";
    parse_str($mystr, $myarray);
    echo $myarray['test1'];
    echo $myarray['test-1'];
    echo $myarray['test+1'];

    Um sich den kompletten Inhalt eines Arrays anzeigen zu lassen, kann man dieses mit print_r() oder var_dump() ausgeben. Vorher ein <pre> erhöht die Übersichtlichkeit.

    Warum ist das so ? (wegen '+' natürlich, aber wo liegt der Sinn des Ganzen ?)

    parse_str() dekodiert den ersten Parameter, als ob es ein Querystring wäre.
    Wann immer Daten in einen bestimmten Kontext gebracht werden sollen, sind diese diesem Kontext entsprechend zu behandeln. Für den Kontext URL macht dies die PHP-Funktion urlencode().
    Du hast deine Daten nicht URL-kodiert, und wunderst dich nun, warum sie falsch dekodiert werden.

    Welche Zeichen sind davon noch betroffen ?
    Wie kann ich die Zeichen maskieren oder schützen ?

    Siehe Handbuch-Kapitel zu urlencode().

    echo "$verabschiedung $name";

  2. Hey,
    laut Handbuch:
    | parse_str: Parses str as if it were the query string passed via a URL

    Im String "test1=blah&test-1=bleh&test+1=burp" hat das Plus also eine besondere Bedeutung, steht nämlich für ein Leerzeichen. http://de.selfhtml.org/servercgi/cgi/formularverarbeitung.htm#datenstrom
    Du musst beim Erzeugen des Strings das Plus URL-kodieren.

    --
    水-金-地-火-木-土-天-海-冥
  3. Danke Ihr 2,

    er hat mir damit leider viel zu viel encoded,
    und das decoden lief auch nicht so toll,
    deswegen geh ich jetzt von hinten durch die Brust ins Auge.

    Aber jetzt weiss ich wenigstens, warum und für welche Zeichen das so ist
    und der print_r()-Tipp war Superklasse :o)

    Beste Grüsse, Frank

    1. echo $begrüßung;

      er hat mir damit leider viel zu viel encoded,
      und das decoden lief auch nicht so toll,

      Du solltest nicht den gesamten Querystring kodieren sondern nur die Nutzdaten.
      Wenn du
        $mystr = urlencode("test1=blah&test-1=bleh&test+1=burp");
      ausführst, werden auch die = und & kodiert, was du nicht möchtest. Also beschränke dich auf die Daten und lass = und & so wie sie sind.

      echo "$verabschiedung $name";