On Fri, 02 Dec 2005 13:29:34 +0100, Jakob Munck wrote:
> Tak for dit svar. Så vidt jeg kan se er sessions og querystrings det samme,
> forstået sådan at en variabel sat i en querystring ændringer indholder i en
> variabel med samme betegnelse, som er sat med en session. Hvad formålet er
> med at det virker på denne måde, ved jeg ikke. Umiddelbart virker det helt
> tosset! Men den eneste måde man kan undgå det, er ved at kalde sine
> sessions- og querystrings-variable forskellige navne. Så påvirker de nemlig
> ikke hinanden.
Sessions og query-strings har intet med hinanden at gøre. Dit problem
skyldes, at php-installationen på serveren har register_globals=on, dvs.
at form-input, session-variable og query-strings automagisk bliver lavet
til variable i dit script.
Altså en query-string ala den følgende:
http://server/script.php?hilsen=hej&tyksak=Gokke
giver dig variablene
$hilsen = 'hej';
$tyksak = 'Gokke';
i scriptet.
Hvis du så har en variabel $hilsen i din session sat til 'goddag', så
bliver den i stedet sat til 'hej'.
Det du skal gøre for at undgå problemet er:
1) at slå register_globals fra (hvis du har adgang til det - det sættes
i php.ini).
2) bruge de super-globale arrays: $_POST, $_GET, $_SESSION, m.fl.
Vælger du at bruge de super-globale arrays, så kan du i praksis være
mere eller mindre ligeglad med om register_globals er slået til eller ej.
Hvis register_globals=on, og du har dit link
<a href='profile_show.php?id=$data[id]'>$data[name]</a>
og session indeholder en variabel $id også, så vil værdien af $id være
den, som er angivet i query-stringen.
Du kan (og bør) omgå problemet ved altid at angive præcis, hvilken
variabel du henviser til. Dvs. hvis du f.eks. vil udskrive $id fra din
session
print "i session har id værdien $id";
så får du udskrevet noget forkert, hvis query-string indeholder samme
variabel. Hvis du i stedet præciserer
print "i session har id værdien {$_SESSION['id']}";
så får du den rigtige værdi.
Du er desuden ude over det problem, at din kode går i stykker, hvis det
bliver flyttet over på en server, hvor register_globals er slået fra.
Det blev til en længere stil, håber det hjalp.
--
Mvh.
/Thomas