Avatar billede webweaver Praktikant
09. oktober 2005 - 17:26 Der er 14 kommentarer og
1 løsning

Problemer med Sessions

Hej folkens :)

Jeg er igang med at lave noget login sytem/CMS system med sessions og MySQL. Jeg er lige begyndt på systemet, og jeg laver bare nogle små tests til at starte med. Men jeg er allerede løbet ind i problemer :( Men mon ikke I løser det? ;P

Jo men altså problemet er, at det ikke virker som om den "gemmer" mine sessions. Jeg kan ikke selv se hvor jeg har lavet fejl i koden, så nu kan I få lov til at kigge på det.

Sådan ser scriptet i min login fil ud: (Det skal siges at denne fil er included ind på siderne, - Det kan måske have noget at sige? Og udover det, så ligger denne fil heller ikke i samme mappe, som de filer som skal være beskyttede). :

<?

session_start();
                   
$username = "test";
$password = "test";
               
$brugernavn = $_POST['brugernavn'];
$kodeord = $_POST['kodeord'];
               
if ($username == $brugernavn AND $password == $kodeord){
session_register("username");
session_register("logged_in");
$_SESSION["username"] = $username;
$_SESSION["logged_in"] = "TRUE";
echo "include files here...";
} else {
               
?>
               
<form method="post"  action="<? echo $_SERVER['PHP_SELF']; ?>">
Username : <input type="text" name="brugernavn"><br />
Password : <input type="password" name="kodeord"><br />
<input type="submit" value="Login">
</form>
               
<?
               
}
               
?>

Og her er den kode som bør sende en, et bestemt sted hen, hvis man ikke er logget ind:

<?
       
session_start();
       
function tjek_login() {
                       
if ($_SESSION["username"] == "" || $_SESSION["logged_in"] != TRUE) {
header("location:http://no_access.php");
return false;
       
} else {
       
return true;
       
}
}
       
tjek_login();
           
?>

Det har jeg så stående som næsten det øverste i filen..

Der er egentlig 2 problemer, fordi jeg kan heller ikke få min function til at virke? Kan ikke lige se hvorfor, man ikke bliver viderestillet.. Og så som sagt, det virker ikke som om at mine sessions bliver gemt korrekt. Selvom jeg logger ind, og går ind på en side, som burde være beskyttet, så siger den jeg ikke er logget ind. Altså hvis jeg nu fx har et script der skal sige det, i stedet for den der function.

Nogle der kan sige mig hvorfor? ;)

På forhånd tak :)

Mvh. Lasse Jensen
Avatar billede udvikler Nybegynder
09. oktober 2005 - 17:32 #1
Det er fordi du skal placere session_start() ALLER ØVERST i dokumentet ! :)

der må ikke engang være et mellemrum før <?

altså skal det se sådan her ud:

<?
session_start();
                   
$username = "test";
$password = "test";
               
$brugernavn = $_POST['brugernavn'];
$kodeord = $_POST['kodeord'];
               
if ($username == $brugernavn AND $password == $kodeord){
session_register("username");
session_register("logged_in");
$_SESSION["username"] = $username;
$_SESSION["logged_in"] = "TRUE";
echo "include files here...";
} else {
               
?>
               
<form method="post"  action="<? echo $_SERVER['PHP_SELF']; ?>">
Username : <input type="text" name="brugernavn"><br />
Password : <input type="password" name="kodeord"><br />
<input type="submit" value="Login">
</form>
               
<?
               
}
               
?>

Og her er den kode som bør sende en, et bestemt sted hen, hvis man ikke er logget ind:

<?
session_start();
       
function tjek_login() {
                       
if ($_SESSION["username"] == "" || $_SESSION["logged_in"] != TRUE) {
header("location:http://no_access.php");
return false;
       
} else {
       
return true;
       
}
}
       
tjek_login();
           
?>
Avatar billede jakobdo Ekspert
09. oktober 2005 - 17:33 #2
Du skal ikke bruge:
session_register("username");
session_register("logged_in");

Ret:
$_SESSION["logged_in"] = "TRUE";
til:
$_SESSION["logged_in"] = TRUE;

Og så skulle det muligvis være det!
Avatar billede jakobdo Ekspert
09. oktober 2005 - 17:35 #3
Og jeg tror så jeg ville lave din tjek-login funktion sådan her:

<?
session_start();

function tjek_login()
{
    if (isset($_SESSION['username']) && $_SESSION['logged_in'] == TRUE)
    {
        return true;
    }
    else
    {
        header("location:http://no_access.php");
        return false;
    }
}

tjek_login();

?>
Avatar billede webweaver Praktikant
09. oktober 2005 - 17:55 #4
Thanks for svarene :) Jeg kigger lige på det.. :D
Avatar billede webweaver Praktikant
09. oktober 2005 - 18:35 #5
Hmm øv.. Umiddelbart ser det ikke ud til at gøre nogen forskel.

Jakobdo: Hvordan kan det være jeg ikke skal benytte session_register();?

Jeg har ændret de andre ting du også viste, da det måske nok er lidt mere "korrekt". Men som sagt ingen forskel.

Aco:

Det måske godt være noget med at session_start(); skal aller øverst i dokumentet. Men for mig at se, er det et lidt stort problem, fordi scriptet det ligger altså i en fil som bliver includede midt i dokumentet. Og det samme med login_tjek();, det ligger heller ikke som det øverste, men kun det andet øverste.. Det lader ikke til det er nok at session_start(); er helt op ad <?...

Hvad gør man så?

På forhånd tak :)
Avatar billede jakobdo Ekspert
09. oktober 2005 - 18:43 #6
At du ikke skal bruge den var måske lidt "hårdt" sagt.
Men den må ikke bruge sammen med: $_SESSION[].
Se siden her: http://dk2.php.net/session_register
If you are using $_SESSION  (or $HTTP_SESSION_VARS), do not use session_register(), session_is_registered(), and session_unregister().
Avatar billede webweaver Praktikant
09. oktober 2005 - 18:44 #7
Hehe okay, det var jeg ikke klar over. Så lærte jeg noget nyt :)
Avatar billede jakobdo Ekspert
09. oktober 2005 - 19:13 #8
Prøv at test disse 2 sider alene:

login.php
<?
session_start();
$username = "test";
$password = "test";

$brugernavn = $_POST['brugernavn'];
$kodeord = $_POST['kodeord'];

if ($username == $brugernavn AND $password == $kodeord)
{
    $_SESSION['username']  = $username;
    $_SESSION['logged_in'] = TRUE;
    echo "include files here...";
}
else
{
?>

<form method="post"  action="<? echo $_SERVER['PHP_SELF']; ?>">
Username : <input type="text" name="brugernavn"><br />
Password : <input type="password" name="kodeord"><br />
<input type="submit" value="Login">
</form>

<?

}

?>

Og test.php:
<?
session_start();

function tjek_login()
{
    if (isset($_SESSION['username']) && $_SESSION['logged_in'] == TRUE)
    {
        return true;
    }
    else
    {
        header("location:http://no_access.php");
        return false;
    }
}

if(tjek_login())
{
    echo "Du er logget korrekt ind";
}

?>
Avatar billede webweaver Praktikant
09. oktober 2005 - 19:38 #9
Det virker fint nok. Det virker hvis jeg smider session_start(); helt op i toppen, før alt HTML og anden kode..
Avatar billede jakobdo Ekspert
09. oktober 2005 - 19:40 #10
Det vil du også se at du skal!
Præcis som aco sagde!
læs evt mere på siden: www.php.net/session_start

Evt kan du bruge ob_start();
og ob_end_flush();
Så kan du godt have session_start() længere nede.
Avatar billede webweaver Praktikant
09. oktober 2005 - 19:42 #11
Okay det bliver jeg nok nødt til så, fordi har nemlig også andre scipts, som skál være aller øverst, og det kunne måske godt gå hen og blive et problem..

Men altså ob_start(); aller øverst? og ob_end_fush(); aller nederst?
Avatar billede webweaver Praktikant
09. oktober 2005 - 19:54 #12
Forresten nu hvor jeg tænker over det, burde det så ikke bare være nok med ob_start(); i toppen.. Den anden er vidst ikke nødvendig?
Avatar billede jakobdo Ekspert
09. oktober 2005 - 19:54 #13
Prøv det ja!
Men session_start() aller øverst ville også gøre det.
Avatar billede webweaver Praktikant
09. oktober 2005 - 19:58 #14
Jeps.. Jeg kan se det virker fint med ob_start(); alene i test filerne.. Prøver lige at teste det på selve sitet som før, hvor alt andet kode også er...
Avatar billede webweaver Praktikant
09. oktober 2005 - 20:09 #15
Jeps, det lader til at virke helt fint nu :D

Tak for hjælpen :) Hvis der er andre problemer, vender jeg tilbage ;)

Mvh. Lasse Jensen
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