Avatar billede amtoft Novice
10. marts 2004 - 18:55 Der er 14 kommentarer og
1 løsning

SESSION virker med "a href" men ikke med header(location: xxx)

Titel siger vel nærmest det meste.

Hvis jeg skifter fra side til side med et "ordinært" link i koden med <a href="xx.php">xx</a> virker mine sessions, men hvis jeg i stedet bruger header(location: xx.php) kommer de ikke med.

Kører på Windows server, med IIS 5.0.
Har sat session.save_path til noget andet end standard, og register_globals til on.

Nogen der har en idé, der kan hjælpe mig videre?
Avatar billede Slettet bruger
10. marts 2004 - 19:24 #1
Måske vil det hjælpe at skrive exit(); efter header-kaldet.
Avatar billede amtoft Novice
10. marts 2004 - 19:28 #2
Desværre - det gør det ikke.
Siden loades godt nok, - altså bliver sendt til den rigtige side.
Det "eneste" der ikke virker, er at sessions ikke bliver "sendt med".

Har session_start på xx.php, og siden xx.php virker jo godt nok, hvis der skiftes til denne side via et almindeligt <a href> link.
Avatar billede Slettet bruger
10. marts 2004 - 19:36 #3
Du laver ikke noget, der skifter til en anden virtuel server, vel?

Jeg har selv et login-script, der "roder" lidt med sessions for derefter at sende tilbage til forsiden. Det virker fint.

<?php
ob_start("ob_gzhandler");
session_start();

$goback=FALSE;
if (!isset($_SESSION['loggedIn'])){$goback=TRUE;}
if ($_SESSION['loggedIn']){$goback=TRUE;}
if ((!isset($_POST['username'])) || (empty($_POST['username'])) ){$goback=TRUE;}
if ((!isset($_POST['password'])) || (empty($_POST['password'])) ){$goback=TRUE;}

if ($goback) {header("Location: index.php");}

require ('funktioner.php');
require ('config.php');

$password=md5($_POST['password']);
$username=addslashes($_POST['username']);

$result=mysql_query("SELECT * FROM users WHERE username='{$username}' AND password='$password' AND mailconfirm='yes'");
// Test for valid login
if (mysql_num_rows($result)==1) {
    $row=mysql_fetch_assoc($result);
    mysql_free_result($result);

    $result=mysql_query("SELECT userid FROM candidates WHERE userid='{$row['userid']}'");
    $_SESSION['isCandidate']=(mysql_num_rows($result)==1);

    $_SESSION['loggedIn']=TRUE;
    $_SESSION['admin']=($row['permissions']=='admin');
    $_SESSION['monitor']=($_SESSION['admin'] || $row['permissions']=='monitor');
    $_SESSION['userid']=$row['userid'];
    $_SESSION['username']=htmlentities(stripslashes($username));
    header("Location: index.php");
} else {$_SESSION['warning']="<p>Something went wrong: either you mistyped your username or password, or you forgot to confirm your email address.</p>";}
header("Location: index.php");

?>
Avatar billede amtoft Novice
10. marts 2004 - 19:52 #4
Nej - det hele kører på én server.
Side 1 (login) ligger i en folder, hvorimod side 2 ligger i roden.
Så det bliver header('location: ../xx.php')

Kører dit script også på Win-server mv.?
Avatar billede Slettet bruger
11. marts 2004 - 02:09 #5
Nej, både min server og min desktop kører Debian, så jeg har ikke testet min kode på en Win-server. Hvis din kode gør nogenlunde det samme som min, kan jeg dog ikke se, hvorfor det ikke skulle virke.

Må jeg se koden til side 1 og 2?
Avatar billede amtoft Novice
11. marts 2004 - 08:18 #6
-- "side 1" --
require('../system/list.php');
session_start();

$sql = mysql_query("
SELECT *
FROM login
WHERE username='".addslashes($_POST['user'])."' && password='".addslashes($_POST['pass'])."'
") or die(mysql_error());

if (mysql_num_rows($sql)) {
while ($foo = mysql_fetch_assoc($sql)) {   
$_SESSION["brugernavn"] = $foo['username'];
$_SESSION["logon"] = 1;
$_SESSION["admin"] = $foo['admin'];
$_SESSION["userid"] = $foo['id'];
header('Location: ../index.php');                       
exit();
}
} else {
header('Location: login.php?error=1');
}

-- "side 2" (index.php) --
require('system/list.php');
$data = array();
$sql = mysql_query("SELECT *
FROM topkategori    
ORDER BY beskrivelse ")
or die(mysql_error());

session_start();
if ($_SESSION["logon"]){
echo 'Du er logget ind som '.$_SESSION["brugernavn"];
}

<html> ...

---
Side 1 kaldes fra den form hvor bruger har indtastet brugernavn + passw.
Den del fungerer fint nok.
Avatar billede Slettet bruger
11. marts 2004 - 13:09 #7
Selve din kode ser ganske fornuftig ud, så jeg gætter mest nu.

Prøv at lave denne linie om til at bruge en adresse, som er relativ til webroden.

header('Location: ../index.php');

Hvis jeg forstår dig korrekt, så skal den se således ud:

header('Location: /index.php');

Noget andet er, at nogle systemer vistnok har problemer med at oprette en cookie samtidig med at de redirecter - eller også er det nogle browsere, der ikke kan håndtere begge dele på en gang, og PHP forsøger vistnok ikke at oprette session-cookien før der reelt bliver gemt noget i brugerens session. Hvis dette er problemet, kan det måske løses ved at have noget i denne stil lige efter session_start(); i index.php

if ( (!isset($_SESSION['logon'])){$_SESSION['logon']=FALSE;}

Så skulle sessionen blive oprettet og gemt allerede når brugeren kommer ind på siden.

Pas forresten på, da du tilsyneladende udskriver 'Du er logget ind som '-strengen før selve din HTML-blok, og browsere bør derfor slet ikke vise den tekst.
Avatar billede Slettet bruger
11. marts 2004 - 13:10 #8
Hov, der var en ( for meget. Linien skulle se således ud:

if (!isset($_SESSION['logon'])){$_SESSION['logon']=FALSE;}
Avatar billede amtoft Novice
11. marts 2004 - 15:13 #9
Har prøvet at flytte det hele til samme folder, så jeg undgår ../index.php.
Det hjalp ikke noget.

Har også prøvet at sætte linien med if(!isset( ..) ind, desværre også uden held.
Avatar billede amtoft Novice
11. marts 2004 - 15:15 #10
I dokumentationen på php.net står der:

-->
SESSION LOST ON HEADER REDIRECT (CGI on IIS 5.0)

I realize there are numerous scattered posts on this issue, but I would like to add my 2¢ since it took me a whole day and a download of the LiveHTTPHeaders Mozilla plugin to figure it out.

On the **CGI** version of PHP on IIS 5.0/Windows 2000, the following code will not work as expected:

/***** sess1.php *****/
session_start();
$_SESSION["key1"] = "testvalue";
header("Location: sess2.php");

/***** sess2.php *****/
session_start();
echo "key1 = '".$_SESSION["key1"]."'";

PROBLEM:
All session data is lost after a header redirect from the first page on which the session is initialized. The problem is, the PHPSESSID cookie is not being sent to the browser (ANY browser, IE or Mozilla) on the initial session page with the header("Location: ...") redirect. This is unrelated to client cookie settings - the set-cookie: header just isn't sent.

SOLUTION:
I was able to remedy the problem by switching to the ISAPI DLL version. This seems to be an MS/IIS bug, NOT a PHP bug - go figure. I hope this saves you some headaches especially with your user authentication scripts!!
-->

Men menes der med at skifte til ISAPI DLL version?
Det har jeg ikke kendskab til hvad er / hvordan.
Avatar billede Slettet bruger
11. marts 2004 - 15:21 #11
Det var netop denne type problem, som  if(!isset( ..)-linien på startsiden var designet til at skulle løse. Den skulle gøre, at der ikke bliver sat en cookie og redirectet på samme tid.

Kører du PHP som CGI? Eller har du fortalt IIS, at den skal bruge en DLL?
Avatar billede amtoft Novice
11. marts 2004 - 15:25 #12
Når jeg kører phpinfo står der CGI flere steder.
Hvad skal jeg specifikt se efter?
Avatar billede Slettet bruger
11. marts 2004 - 15:28 #13
Der står lidt på http://dk.php.net/manual/en/install.iis.php#install.iis.iis4 (Nederst, men lige over brugerkommentarerne)
Avatar billede amtoft Novice
11. marts 2004 - 16:17 #14
Hmmm...
Dét får jeg ikke til at virke, sådan lige umiddelbart. Altså at skifte til isapi versionen.
Kan tænke mig at det er fordi jeg i sin tid har installeret via den automatiske procedure der findes, og i dokumentationen til den står at den kun understøtter CGI.
Så det må blive noget med en helt ny installation af php. Og det "orker" jeg ikke lige nu.
Det jeg er ved at lave er også primært til "internt" brug, og så kan de to personer der skal bruge det blive nødt til at finde sig i at skulle klikke på et link i stedet for at blive ledt direkte tilbage.

Men foreløbig mange tak for indsatsen sandbox.
Jeg vender nok / måske tilbage, hvis jeg på et tidspunkt får opdateret php på serveren.
Smid et svar hvis du vil have point.
Avatar billede Slettet bruger
12. marts 2004 - 00:18 #15
Kommer her.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester