[PHP] $_SESSION wil niet werken

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • orange.x
  • Registratie: Maart 2002
  • Laatst online: 18-07 10:57
Misschien vage titel maar ik zal het proberen uit te leggen. Ik wil dat mensen op een pagina in moeten loggen en dan kunnen ze handelingen maken op de site. Ik heb even een voorbeeld gemaakt waarin ik het test.

De bezoeker komt op test1.php en moet daar inloggen:
PHP:
1
2
3
4
5
6
7
8
9
<html>
<body>
Welkom<br>
<form action="test2.php" method="POST">
Username: <input type="text" name="user"><br>
Password: <input type="password" name="pass"><br><br>
<input type="submit" value="Login">
</body>
</html>


Daar vult ie een wachtwoord in en gebruikersnaam en wordt dan naar test2.php gestuurd. de code van test2.php:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?session_start();?>
<html>
<body>
<?
$user1 = "mark";
$pass1 = "woei";
foreach ($_POST as $field => $value)
{
    $user = $_POST[user]; 
    $pass = $_POST[pass];
}
if ( $user1 == $user and $pass1 == $pass )
{
    $_SESSION[ingelogd]="yep";
    echo"Je bent ingelogd<br><br>
    <a href='test3.php'>Klik hier om naar de volgende pagina te gaan.</a>";
}
else
{   
    echo"Wachtwoord is fout, probeer het opnieuw<br><br>
    <form action='test2.php' method='POST'>
    Username: <input type='text' name='user'><br>
    Password: <input type='password' name='pass'><br><br>
    <input type='submit' value='Login'>";
}
?>
</body>
</html>


We zien daar dus als hij inlogt met mark en wachtwoord woei, dan wordt hij gestuurd naar een pagina met een link naar test3.php. hier zit dus het probleem. Ik wil namelijk niet dat alles van test3.php zichtbaar wordt als mensen er direct heenlinken, dus moet er gecontroleerd worden of de sessie nog aan het lopen is.

test3.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?session_start();?>
<html>
<body>
<?
if ( $_SESSION[ingelogd] = yep )
{
    echo"HOER A!";
}
else
{
    echo"Dacht het niet he";
}
?>
</body>
</html>


Nu zit het zo dat als ik direct naar test3.php link ik gewoon de text "HOER A" krijg, ( als ik dus mijn browser gesloten heb en direct erheen link ) en dat is niet echt de bedoeling, hij zou dus moeten detecteren dat de session niet loopt, en moet dus weergeven "Dacht het niet he".

Als ik eerst inlog en dan naar test3.php link dan krijg ik ook "HOER A" te zien.

Doe ik nou iets verkeerd?

PS: Hetgene wat ik geprobeerd heb:
PHP:
1
2
$_SESSION[ingelogd] == "yep" // in test2.php en 
$_SESSION[ingelogd] == yep // in test3.php

En verder nog een aantal van dat gepruts met ='en. Maar komt er elke keer op neer dat het niet werkt zoals ik het wil.

Te bezoeken op: test1.php, test2.php en test3.php

[ Voor 32% gewijzigd door orange.x op 19-01-2005 12:13 ]


Acties:
  • 0 Henk 'm!

  • azertyke
  • Registratie: Januari 2005
  • Laatst online: 20-11-2024
de 3e file moet dit zijn:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?session_start();?>
<html>
<body>
<?
if ( $_SESSION[ingelogd] == "yep" )
{
    echo"HOER A!";
}
else
{
    echo"Dacht het niet he";
}
?>
</body>
</html>

Acties:
  • 0 Henk 'm!

Verwijderd

Als goed is ingelogd plaats je een sessie variabele:

PHP:
1
$_SESSION['ingelogd'] = true;


Op een volgende pagina controleer je gewoon:

PHP:
1
2
3
if ($_SESSION['ingelogd'] == false) {
  header("Location: inloggen.php");
}


Nb: zorg wel dat je geen output hebt gestuurd voordat je de header methode gebruikt :)
Nb2: Misschien zou je Challenge/Response beter kunnen gebruiken; het is veel veiliger, maar aan je manier van coden te zien, is dat misschien nog even een stapje te ver. In de FAQ hier in P&W staat Challenge/Response goed uitgelegd. Succes :)

Acties:
  • 0 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Laatst online: 21-09 00:18
1: zet eens error_reporting(E_ALL); boven je script
2: Gebruik Enkele quotes bij je arrays: $_SESSION['ingelogd'] ipv $_SESSION[ingelogd]

:)

|>


Acties:
  • 0 Henk 'm!

  • steffex
  • Registratie: Augustus 2003
  • Laatst online: 12-08 00:24
Welke versie van php gebruik je? Het is namelijk zo, dat je bij versie 4.06 of lager $HTTP_SESSION_VARS moet gebruiken!

meer info, zie php.net sessions

Acties:
  • 0 Henk 'm!

  • orange.x
  • Registratie: Maart 2002
  • Laatst online: 18-07 10:57
Ik heb overal even die error_reporting erin gedaan, bij test2.php krijg ik nu nog deze error:
Notice: Undefined index: ingelogd in d:\www\www\public\test2.php on line 17
line 17 is:
PHP:
1
$_SESSION['ingelogd'] == "yep";

Verder krijg ik als ik toch verder ga en op de link klik de melding:
Notice: Undefined index: ingelogd in d:\www\www\public\test3.php on line 6
line 6:
PHP:
1
if ( $_SESSION['ingelogd'] == "yep" )

@Quist: Ben idd nog niet zo heel lang en diep gegaan met php, maar al werkende en kijkende kom ik er wel :) ( http://ondergronds.xs4all.nl is @ de moment de site waar het straks in moet )

@stef-0.nl: Ik heb phpdev423 dus lijkt me in orde.

Heb nog even de manier van Quist gebruikt, en nu krijg ik geen foutmelding meer op test2.php, ook als ik inlog en dan op de link klik krijg ik HOER A, als ik dan de browser sluit en laat em verwijzen naar test3.php dan krijg ik wel de code Dacht het niet he, te zien. en de foutmelding die ik net opgaf, dus in principe werkt het al lijkt me, alleen die foutmelding zit er nog in ( kan natuurlijk komen omdat er nergens een $_SESSION waarde opgegeven is )

[ Voor 33% gewijzigd door orange.x op 19-01-2005 12:25 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Dat komt omdat je de Sessie variabele niet wil zetten, maar gewoon een expressie uitvoert. Er staat namelijk een dubbel is-teken. :)
Een dubbel is-teken gebruik je om te valideren of twee waardes gelijk zijn. In jou geval of de waarde van de sessie-variabele "ingelogd" gelijk is aan "yep", in plaats dat je de sessie-variabele wil zetten op "yep". Klein verschil, grote gevolgen ;)

Acties:
  • 0 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Laatst online: 21-09 00:18
1 tip, als je die notices wilt voorkomen: http://www.php.net/isset

|>


Acties:
  • 0 Henk 'm!

  • orange.x
  • Registratie: Maart 2002
  • Laatst online: 18-07 10:57
Verwijderd schreef op woensdag 19 januari 2005 @ 12:24:
Dat komt omdat je de Sessie variabele niet wil zetten, maar gewoon een expressie uitvoert. Er staat namelijk een dubbel is-teken. :)
Een dubbel is-teken gebruik je om te valideren of twee waardes gelijk zijn. In jou geval of de waarde van de sessie-variabele "ingelogd" gelijk is aan "yep", in plaats dat je de sessie-variabele wil zetten op "yep". Klein verschil, grote gevolgen ;)
Ja daar heb je gelijk in, maar ik heb het op mijn Underground site zo gedaan dat ik de waarden die ingevuld worden bij het inloggen omzet naar variabelen, om ze dan vervolgens te gaan vergelijken met de gegevens uit de database. Dat werkt prima :)

Acties:
  • 0 Henk 'm!

  • Da_Spike
  • Registratie: Januari 2003
  • Laatst online: 03-01-2023
Ook hier ben je wat quotejes vergeten:
code:
1
2
3
4
5
foreach ($_POST as $field => $value) 
{ 
    $user = $_POST[user];  
    $pass = $_POST[pass]; 
}



$_POST['user'] en $_POST['pass'] :)

Acties:
  • 0 Henk 'm!

  • orange.x
  • Registratie: Maart 2002
  • Laatst online: 18-07 10:57
Da_Spike schreef op woensdag 19 januari 2005 @ 12:27:
Ook hier ben je wat quotejes vergeten:
code:
1
2
3
4
5
foreach ($_POST as $field => $value) 
{ 
    $user = $_POST[user];  
    $pass = $_POST[pass]; 
}



$_POST['user'] en $_POST['pass'] :)
ja ik had dat al aangepast, maar je had gelijk, Maar het werkt nu, nu even implementeren in de site.

Acties:
  • 0 Henk 'm!

  • orange.x
  • Registratie: Maart 2002
  • Laatst online: 18-07 10:57
Oke, ik heb nog even gekeken want er zat nog iets fout, maar hij doet het dus nog niet.

test2.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?error_reporting(E_ALL); ?>
<?session_start();?>
<html>
<body>
<?
$user1 = "mark";
$pass1 = "woei";
foreach ($_POST as $field => $value)
{
    $user = $_POST['user']; 
    $pass = $_POST['pass'];
}
if ( $user1 == $user and $pass1 == $pass )
{
    $_SESSION['ingelogd'] = true;
    echo"Je bent ingelogd<br><br>
    <a href='test3.php'>Klik hier om naar de volgende pagina te gaan.</a>";
}
else
{   
    echo"Wachtwoord is fout, probeer het opnieuw<br><br>
    <form action='test2.php' method='POST'>
    Username: <input type='text' name='user'><br>
    Password: <input type='password' name='pass'><br><br>
    <input type='submit' value='Login'>";
}
?>

test3.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?session_start();?>
<html>
<body>
<?
if ( $_SESSION['ingelogd'] = false )
{
    echo"NEEEE";
}
else
{
    echo"JAAAA";
}
?>

Als ik inlog bij test1.php dan kom ik op test2.php waar ik op de link kan klikken, vervolgens gaat ie naar test3.php en toont hij JAAA, zou dus moeten werken. Maar zodra ik de browser sluit, en em daarna direct link naar test3.php verkondigd hij ook JAAA. Wat zit er dan nog fout :S

( check http://ondergronds.xs4all.nl/test1.php )

Acties:
  • 0 Henk 'm!

Verwijderd

Drie opmerkingen.

- Waar slaat die foreach op in test2.php?
- Je vergelijkt in test3.php weer met een enkel is-teken ;)
- Lees eens wat over debuggen

offtopic:
Dit zijn wel hele goedkope techposts :)

Acties:
  • 0 Henk 'm!

  • orange.x
  • Registratie: Maart 2002
  • Laatst online: 18-07 10:57
Verwijderd schreef op woensdag 19 januari 2005 @ 13:20:
Drie opmerkingen.

- Waar slaat die foreach op in test2.php?
- Je vergelijkt in test3.php weer met een enkel is-teken ;)
- Lees eens wat over debuggen

offtopic:
Dit zijn wel hele goedkope techposts :)
Fuck ;) hij werkt

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Da_Spike schreef op woensdag 19 januari 2005 @ 12:27:
Ook hier ben je wat quotejes vergeten:
code:
1
2
3
4
5
foreach ($_POST as $field => $value) 
{ 
    $user = $_POST[user];  
    $pass = $_POST[pass]; 
}



$_POST['user'] en $_POST['pass'] :)
Ik mis de logica van die hele foreach-loop even :? :P

Acties:
  • 0 Henk 'm!

  • PhoeniX-
  • Registratie: Juni 2000
  • Laatst online: 01-09 10:26
Bosmonster schreef op woensdag 19 januari 2005 @ 14:09:
Ik mis de logica van die hele foreach-loop even :? :P
Welkom ;)

Voor dit soort dingen gebruik ik altijd:
code:
1
2
$user = (isset ($_POST['user'])) ? $_POST['user'] : '';
$pass = (isset ($_POST['pass'])) ? $_POST['pass'] : '';

Dan past het netjes op 1 regel (-:

Acties:
  • 0 Henk 'm!

  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

orange.x schreef op woensdag 19 januari 2005 @ 13:12:
PHP:
1
2
3
4
5
6
7
8
9
if ( $_SESSION['ingelogd'] = false )
{
    echo"NEEEE";
}
else
{
    echo"JAAAA";
}
?>

Als ik inlog bij test1.php dan kom ik op test2.php waar ik op de link kan klikken, vervolgens gaat ie naar test3.php en toont hij JAAA, zou dus moeten werken. Maar zodra ik de browser sluit, en em daarna direct link naar test3.php verkondigd hij ook JAAA. Wat zit er dan nog fout :S
Verander die = eens in ==

[ Voor 11% gewijzigd door Radiant op 19-01-2005 14:50 ]


Acties:
  • 0 Henk 'm!

  • orange.x
  • Registratie: Maart 2002
  • Laatst online: 18-07 10:57
Bosmonster schreef op woensdag 19 januari 2005 @ 14:09:
[...]
Ik mis de logica van die hele foreach-loop even :? :P
Ja er zit niet zoveel logica in, wel eeuhms, omdat ik dit uit een voorbeeldje heb van een boek, daarin hebben ze dus een invulformulier waarmee waarden eruitkomen. Deze waardes komen dan in een array die gedefinieerd is als $field met de waarde $value. in principe kan het ook weg :) maar ik begrijp iig zelf wel wat ik doe :) dat is het belangrijkste :D
Pagina: 1