Tegn forsvinner

kongen

kongemedlem
På side1.com har jeg denne koden:

PHP:
$a = 'e+e';
$b = 'test='.$a;
$c = file_get_contents('side2.com/abc.php?d='.base64_encode($b));

På side2.com/abc.php har jeg denne koden:

PHP:
$e = base64_decode($_GET['d']);
parse_str($e);
echo $test;

Resultatet blir "e e" og ikke "e+e". Pluss-tegnet forsvinner. Har også prøvd urlencoding uten suksess. Hvordan kan jeg få resultatet "e+e"?
 

adeneo

Medlem
base64 encoding er ikke "safe" for en URL, du bør URL encode.

Du trenger forøvrig ikke å decode, $_GET gjør det helt automagisk, problemet er at parse_str også decoder automatisk.

Dersom du printer $_GET['d'] så vil du se at du faktisk har test=e+e, men ettersom du kjører det gjennom parse_str så vil pluss tegnet decodes, og et plus tegn i en URL er det samme som et mellomrom.

Med andre ord, første gangen det decodes automatisk i $_GET så får du det riktige resultatet, andre gangen det decodes automatisk, som skjer når du bruker parse_str, så gjøres plus tegnet om til et mellomrom.

Jeg gidder ikke forsøke å finne ut hvordan du kan løse problemet, ettersom hele problemstillingen er håpløs, du har en URL som ser ut som

Kode:
side2.com/abc.php?d=test=e+e

som er en særdeles dårlig måte å sende data i en GET forespørsel.

Finn en annen måte å sende dataene på, for eksempel med serialiserte data som encodes

PHP:
$data = array(
            "test"  => "e+e",
            "annet" => "stæsj"
        );

echo file_get_contents('side2.com/abc.php?d=' . urlencode(serialize($data)));

Så kan du enkelt hente dataene på side2 med

PHP:
unserialize($_GET['d'])['test']

og du kan selvfølgelig da også gjøre

PHP:
$array = unserialize($_GET['d']);
$test  = $array['test'];
$annet = $array['annet'];
 
Topp