Problemen met het maken van een sessie
Ik ben net begonnen met php en probeer een sessie te maken.
Ik heb al op veel sites gekeken maar het werkt gewoon niet.
Dit is mijn script:
Code (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
29
30
31
32
33
34
35
36
37
38
39
40
41
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
29
30
31
32
33
34
35
36
37
38
39
40
41
<html>
<head>
<title>Opdracht 44 inloggen</title>
</head>
<body>
<?php
$gebruikersnaam = $_POST["gebruikersnaam"];
$wachtwoord = $_POST["wachtwoord"];
if (!$gebruikersnaam || !$wachtwoord)
{
?>
<p><b>Welkom! Maak een random gebruikersnaam en wachtwoord. Ze worden niet opgeslagen dus boeiend!</b></p>
<table border="0">
<form name="rekenmachine" method="post" action="Opdracht_44a.php">
<tr><td>Gebruikersnaam:</td>
<td><input type = "text" size="25" name = "gebruikersnaam"></td></tr>
<tr><td>Wachtwoord:</td>
<td><input type = "password" size="25" name = "wachtwoord"></td></tr>
<tr><td><input type = "submit" value = "Inloggen"></td></tr>
</form>
</table>
<?php
}
else
{
session_start();
$_SERVER['gebruikersnaam'];
echo "Klik hier om door te gaan $gebruikersnaam";
?>
<form name="jwz" method="post" action="Opdracht_44b.php">
<input type="submit" value="Naar geheime pagina...">
</form>
<?php
}
?>
</body>
</html>
<head>
<title>Opdracht 44 inloggen</title>
</head>
<body>
<?php
$gebruikersnaam = $_POST["gebruikersnaam"];
$wachtwoord = $_POST["wachtwoord"];
if (!$gebruikersnaam || !$wachtwoord)
{
?>
<p><b>Welkom! Maak een random gebruikersnaam en wachtwoord. Ze worden niet opgeslagen dus boeiend!</b></p>
<table border="0">
<form name="rekenmachine" method="post" action="Opdracht_44a.php">
<tr><td>Gebruikersnaam:</td>
<td><input type = "text" size="25" name = "gebruikersnaam"></td></tr>
<tr><td>Wachtwoord:</td>
<td><input type = "password" size="25" name = "wachtwoord"></td></tr>
<tr><td><input type = "submit" value = "Inloggen"></td></tr>
</form>
</table>
<?php
}
else
{
session_start();
$_SERVER['gebruikersnaam'];
echo "Klik hier om door te gaan $gebruikersnaam";
?>
<form name="jwz" method="post" action="Opdracht_44b.php">
<input type="submit" value="Naar geheime pagina...">
</form>
<?php
}
?>
</body>
</html>
Het 2e script is:
Code (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
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
<html>
<head>
<title>Opdracht 44 geheim</title>
</head>
<body>
<?php
session_set_cookie_params(0, '/', 'stan.graafhuyncollege.nl');
session_start();
if ($_SERVER['gebruikersnaam'])
{
echo"Heey $gebruikersnaam! Welkom op de beveiligde pagina! <br />
Uw gebruikersnaam is $gebruikersnaam. <br />
En uw wachtwoord is $wachtwoord. <br />
U kunt zich hier afmelden: <br />";
}
else
{
echo"u bent niet ingelogd";
}
?>
<form name="jwz" method="post" action="Opdracht_44a.php">
<input type="submit" value="AFMELDEN <?php echo $gebruikersnaam; ?>">
</form>
</body>
</html>
Jammer genoeg werkt dit script niet.
Kan iemand mij misschien helpen?
Mvg,
Stan Peters
Gewijzigd op 21/11/2013 14:59:55 door Stan Peters
Edit:
Zou je a.u.b. je code tussen code-tags kunnen plaatsen door je bericht te bewerken? Dat maakt het overzichtelijker in het topic. Lees hier hoe dat moet.
Alvast bedankt.
Alvast bedankt.
Toevoeging op 21/11/2013 09:28:25:
Verder wat opmerkingen:
- Plaats start_session(); helemaal bovenaan tussen PHP.-tag, VOORDAT de HTML begint.
- Wat wil je bereiken met $_SERVER['gebruikersnaam']
- Variabelen buiten quotes.
- Geen userinput vertrouwen. $_POST en $_GET altijd gebruiken i.c.m htmlentities, htmlspecialchars, mysqli_real_escape_string, of andere functies die voorkomen dat code kan worden uitgevoerd.
Voorbeeldje
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
session_start(); // Altijd bovenaan de pagina
if($_SERVER['REQUEST_METHOD'] == 'POST'){ // Als er wordt gepost
$_SESSION['gebruikersnaam'] = htmlentities($_POST['gebruikersnaam'], ENT_QUOTES, "UTF-8");
echo 'Welkom ' . $_SESSION['gebruikersnaam'] . ' op de beveiligde pagina.';
}
?>
<form method="POST">
<input type="text" name="gebruikersnaam" />
<button>Post</button>
</form>
session_start(); // Altijd bovenaan de pagina
if($_SERVER['REQUEST_METHOD'] == 'POST'){ // Als er wordt gepost
$_SESSION['gebruikersnaam'] = htmlentities($_POST['gebruikersnaam'], ENT_QUOTES, "UTF-8");
echo 'Welkom ' . $_SESSION['gebruikersnaam'] . ' op de beveiligde pagina.';
}
?>
<form method="POST">
<input type="text" name="gebruikersnaam" />
<button>Post</button>
</form>
typefouten voorbehouden.
- Aar - op 21/11/2013 09:26:04:
Verder wat opmerkingen:
- Wat wil je bereiken met $_SERVER['gebruikersnaam']
Verder wat opmerkingen:
- Wat wil je bereiken met $_SERVER['gebruikersnaam']
Ik wil daarmee de variabele opslaan. $gebruikersnaam
Je bedoelt waarschijnlijk $_POST['gebruikersnaam'].
$_SESSION['gebruikersnaam'] = 'pietje puk';
Zo ken je een waarde toe aan een variabele.
Toevoeging op 21/11/2013 15:06:15:
Ozzie PHP op 21/11/2013 14:57:11:
Dat doe je niet in de $_SERVER array, maar in de $_SESSION array. En daarnaast sla je helemaal niks op.
$_SESSION['gebruikersnaam'] = 'pietje puk';
Zo ken je een waarde toe aan een variabele.
$_SESSION['gebruikersnaam'] = 'pietje puk';
Zo ken je een waarde toe aan een variabele.
Met $_SESSION geeft hij bij mijn 2e script nog steeds aan dat je niet bent aangemeld.
Stan Peters op 21/11/2013 15:03:17:
Ik wil alleen dat hij een sessie begint als de gebruikersnaam en wachtwoord zijn ingevuld. Moet je session_start(); dan ook boven <html> zetten?
Laat me antwoorden op een andere manier dan je (waarschijnlijk) verwacht.
Je moet altijd proberen de php-logica te scheiden van de HTML.
Je hebt de neiging om eerst <html> ... <body> te printen, en daarna ga je nog aan data-verwerking doen.
Dat moet je niet doen.
Begin altijd eerst met de php-logica. Zet die bovenaan het .php bestand.
Pas wanneer alle logica is gepasseerd, wanneer alle data is verwerkt, ... begin je <html> te printen.
Dus, eigenlijk zou je geen if's meer mogen zien onder de code waar <html> staat.
-------
Het eenvoudigste is dat je session_start() zet helmemaal bovenaan de code.
Dus ook voor de mensen wiens login nog niet gedaan is.
Het stoort niet dat session_start() al is uitgevoerd.
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');
// hier andere dingen die je voor output wilt hebben, zoals session_start()
?>
error_reporting(E_ALL);
ini_set('display_errors', '1');
// hier andere dingen die je voor output wilt hebben, zoals session_start()
?>
Zo zal PHP hoort de kleinste fout meteen in je gezicht gooien. Uiteindelijk, als je script klaar en goed getest is, zal PHP dus geen fouten meer opmerken en kun je die twee regels weghalen.
Het geaccepteerde antwoord voor http://stackoverflow.com/questions/8028957/headers-already-sent-by-php legt goed uit waarom session_start() boven de <html> moet komen.
Ik weet dat het veel info is en er intimiderend uit kan zien, maar neem de tijd om het rustig door te lezen. Meer weten over hoe het HTTP protocol werkt is erg handig.
Verder stel ik voor dat je op beide pagina's ergens var_dump($_SESSION); plaatst tijdens het debuggen.
Moet je trouwens andere sessies doen wanneer je een subdomein bent?
http://php.net/manual/en/function.session-set-cookie-params.php
Als je met session_set_cookie_params() het domein instelt op '.example.com' zal de cookie verstuurt worden voor elk subdomein van example.com. Als je het instelt op 'miauw.example.com' zal die cookie niet verstuurt naar bijvoorbeeld 'woef.example.com'.
Als je met session_set_cookie_params() het domein instelt op '.example.com' zal de cookie verstuurt worden voor elk subdomein van example.com. Als je het instelt op 'miauw.example.com' zal die cookie niet verstuurt naar bijvoorbeeld 'woef.example.com'.
Is er misschien iemand die een oplossing weet?
En waar kunnen wij dat alles zien om te kijken wat je nou fout doet?
Code (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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php
session_start();
error_reporting(E_ALL);
ini_set('display_errors', '1');
$gebruikersnaam = $_POST["gebruikersnaam"];
$wachtwoord = $_POST["wachtwoord"];
if (!$gebruikersnaam || !$wachtwoord)
{
?>
<html>
<head>
<title>Opdracht 44 inloggen</title>
</head>
<body>
<p><b>Welkom! Maak een random gebruikersnaam en wachtwoord. Ze worden niet opgeslagen dus boeiend!</b></p>
<table border="0">
<form name="rekenmachine" method="post" action="Opdracht_44a.php">
<tr><td>Gebruikersnaam:</td>
<td><input type = "text" size="25" name = "gebruikersnaam"></td></tr>
<tr><td>Wachtwoord:</td>
<td><input type = "password" size="25" name = "wachtwoord"></td></tr>
<tr><td><input type = "submit" value = "Inloggen"></td></tr>
</form>
</table>
<?php
}
else
{
$_SESSION['gebruikersnaam'] = $gebruikersnaam;
echo "Klik hier om door te gaan $gebruikersnaam";
?>
<form name="jwz" method="post" action="Opdracht_44b.php">
<input type="submit" value="Naar geheime pagina...">
</form>
</body>
</html>
<?php
}
?>
session_start();
error_reporting(E_ALL);
ini_set('display_errors', '1');
$gebruikersnaam = $_POST["gebruikersnaam"];
$wachtwoord = $_POST["wachtwoord"];
if (!$gebruikersnaam || !$wachtwoord)
{
?>
<html>
<head>
<title>Opdracht 44 inloggen</title>
</head>
<body>
<p><b>Welkom! Maak een random gebruikersnaam en wachtwoord. Ze worden niet opgeslagen dus boeiend!</b></p>
<table border="0">
<form name="rekenmachine" method="post" action="Opdracht_44a.php">
<tr><td>Gebruikersnaam:</td>
<td><input type = "text" size="25" name = "gebruikersnaam"></td></tr>
<tr><td>Wachtwoord:</td>
<td><input type = "password" size="25" name = "wachtwoord"></td></tr>
<tr><td><input type = "submit" value = "Inloggen"></td></tr>
</form>
</table>
<?php
}
else
{
$_SESSION['gebruikersnaam'] = $gebruikersnaam;
echo "Klik hier om door te gaan $gebruikersnaam";
?>
<form name="jwz" method="post" action="Opdracht_44b.php">
<input type="submit" value="Naar geheime pagina...">
</form>
</body>
</html>
<?php
}
?>
En mijn 2e script is:
Code (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
29
30
31
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
29
30
31
<?php
session_start();
error_reporting(E_ALL);
ini_set('display_errors', '1');
if ($_SESSION['gebruikersnaam'])
{
echo"Heey $gebruikersnaam! Welkom op de beveiligde pagina! <br />
Uw gebruikersnaam is $gebruikersnaam. <br />
En uw wachtwoord is $wachtwoord. <br />
U kunt zich hier afmelden: <br />";
}
else
{
echo"u bent niet ingelogd";
?>
<html>
<head>
<title>Opdracht 44 geheim</title>
</head>
<body>
<form name="jwz" method="post" action="Opdracht_44a.php">
<input type="submit" value="AFMELDEN <?php echo $gebruikersnaam; ?>">
</form>
</body>
</html>
<?php
}
?>
session_start();
error_reporting(E_ALL);
ini_set('display_errors', '1');
if ($_SESSION['gebruikersnaam'])
{
echo"Heey $gebruikersnaam! Welkom op de beveiligde pagina! <br />
Uw gebruikersnaam is $gebruikersnaam. <br />
En uw wachtwoord is $wachtwoord. <br />
U kunt zich hier afmelden: <br />";
}
else
{
echo"u bent niet ingelogd";
?>
<html>
<head>
<title>Opdracht 44 geheim</title>
</head>
<body>
<form name="jwz" method="post" action="Opdracht_44a.php">
<input type="submit" value="AFMELDEN <?php echo $gebruikersnaam; ?>">
</form>
</body>
</html>
<?php
}
?>
Script 2 :hij laat nu wel de if zien, maar de $gebruikersnaam doet het niet. Als ik in plaats van $gebruikersnaam, $_SESSION['gebruikersnaam'] neer zet, doet pagina 44b (2e script) het niet meer.
Gewijzigd op 22/11/2013 11:30:07 door Stan Peters
Ben je hier iets mee?
Code (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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<?php
session_start();
error_reporting(E_ALL);
ini_set('display_errors', '1');
// eerst kijken of er een $_POST in de lucht hangt
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// hier controleer jij dus of de gegevens overeen komen met wat in de DB staat. Dit doe ik even niet
$_SESSION['gebruikersnaam'] = $_POST["gebruikersnaam"];
}
// kijken of de session variabelen gezet zijn
if (!isset($_SESSION['gebruikersnaam'])) {
// geen login in de sessie gevonden
// zie heredoc notation
echo <<<HTML
<html>
<head>
<title>Opdracht 44 inloggen</title>
</head>
<body>
<p><b>Welkom! Maak een random gebruikersnaam en wachtwoord. Ze worden niet opgeslagen, dus boeiend!</b></p>
<table border="0">
<form name="rekenmachine" method="post" action="">
<tr><td>Gebruikersnaam:</td>
<td><input type = "text" size="25" name = "gebruikersnaam"></td></tr>
<tr><td>Wachtwoord:</td>
<td><input type = "password" size="25" name = "wachtwoord"></td></tr>
<tr><td><input type = "submit" value = "Inloggen"></td></tr>
</form>
</table>
</body>
</html>
HTML;
}
else {
// login in de sessie gevonden
// Met andere woorden, vanaf hier kan je al de geheime pagina's tonen die je wil.
// laat me hier even een basis navigatie toevoegen, dus op basis van de URL
switch(isset($_GET['p']) ? $_GET['p'] : '') {
default:
echo <<<HTML
<a href="?p=welcome">Klik hier</a> om door te gaan, $_SESSION[gebruikersnaam]
<br><br><br><a href="?p=logout">Uitloggen</a>
HTML;
break;
case 'welcome':
echo 'Welkom op de geheime pagina van Stan. <br>Het doel van het leven is 42
<br><br><br><a href="?p=logout">Uitloggen</a>';
break;
case 'logout':
unset($_SESSION['gebruikersnaam']);
header('location: ?p=');
break;
}
}
?>
session_start();
error_reporting(E_ALL);
ini_set('display_errors', '1');
// eerst kijken of er een $_POST in de lucht hangt
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// hier controleer jij dus of de gegevens overeen komen met wat in de DB staat. Dit doe ik even niet
$_SESSION['gebruikersnaam'] = $_POST["gebruikersnaam"];
}
// kijken of de session variabelen gezet zijn
if (!isset($_SESSION['gebruikersnaam'])) {
// geen login in de sessie gevonden
// zie heredoc notation
echo <<<HTML
<html>
<head>
<title>Opdracht 44 inloggen</title>
</head>
<body>
<p><b>Welkom! Maak een random gebruikersnaam en wachtwoord. Ze worden niet opgeslagen, dus boeiend!</b></p>
<table border="0">
<form name="rekenmachine" method="post" action="">
<tr><td>Gebruikersnaam:</td>
<td><input type = "text" size="25" name = "gebruikersnaam"></td></tr>
<tr><td>Wachtwoord:</td>
<td><input type = "password" size="25" name = "wachtwoord"></td></tr>
<tr><td><input type = "submit" value = "Inloggen"></td></tr>
</form>
</table>
</body>
</html>
HTML;
}
else {
// login in de sessie gevonden
// Met andere woorden, vanaf hier kan je al de geheime pagina's tonen die je wil.
// laat me hier even een basis navigatie toevoegen, dus op basis van de URL
switch(isset($_GET['p']) ? $_GET['p'] : '') {
default:
echo <<<HTML
<a href="?p=welcome">Klik hier</a> om door te gaan, $_SESSION[gebruikersnaam]
<br><br><br><a href="?p=logout">Uitloggen</a>
HTML;
break;
case 'welcome':
echo 'Welkom op de geheime pagina van Stan. <br>Het doel van het leven is 42
<br><br><br><a href="?p=logout">Uitloggen</a>';
break;
case 'logout':
unset($_SESSION['gebruikersnaam']);
header('location: ?p=');
break;
}
}
?>
Hij doet het bedankt iedereen!!!!