Login en logout
Een van die fouten is deze:
Quote:
Warning: Undefined array key "menu" in /data/sites/web/******/www/test/inc/login.php on line 2
daarna als ik inlog, wat werkt, krijg ik deze fouten :
Quote:
Warning: Cannot modify header information - headers already sent by (output started at /data/sites/web/*******/www/test/inc/dbase.php:13) in /data/sites/web/*******/www/test/inc/login.php on line 43
daarn doe ik een refresh, waardoor ik daarna wil uitloggen, dan krijg ik deze fout
Quote:
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator at [email protected] to inform them of the time this error occurred, and the actions you performed just before this error.
More information about this error may be available in the server error log.
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator at [email protected] to inform them of the time this error occurred, and the actions you performed just before this error.
More information about this error may be available in the server error log.
de index.php
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
session_start();
error_reporting(0);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
include('./inc/dbase.php');
if(!isset($_SESSION['Username'])){
include("./inc/login.php");
}else{
echo "<br>Welcome User: ";
echo $_SESSION['Username'];
}
echo "<br><a href='./inc/logout.php'>logout</a>";
?>
session_start();
error_reporting(0);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
include('./inc/dbase.php');
if(!isset($_SESSION['Username'])){
include("./inc/login.php");
}else{
echo "<br>Welcome User: ";
echo $_SESSION['Username'];
}
echo "<br><a href='./inc/logout.php'>logout</a>";
?>
inlog.php
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<?php
if($_GET['menu'] == 'login' && $_GET['action'] == 'check' ) {
$user = $_POST['username'];
$pass = md5($_POST['password']);
$key = $_POST['key'];
$sql = "SELECT * FROM AdminUsers WHERE Username='".$user."' AND Passwd='".$pass."' AND LoginKey='".$key."'";
$result = mysqli_query($connect, $sql);
$logindetails = mysqli_fetch_all($result, MYSQLI_ASSOC);
foreach($logindetails as $detail) {
echo "This we got from DBase<br>";
echo "Username : ".$detail['Username']."<br>";
echo "Password : ".$detail['Passwd']."<br>";
echo "LoginKey : ".$detail['LoginKey']."<br>";
echo "Name : ".$detail['Name']."<br>";
echo "Level : ".$detail['Access']."<br>";
}
echo "<div class='login'>";
if($detail['Username'] == $user) {
echo "<br>Username OK<br>";
} else {
echo "Username not OK<br>";
}
if($detail['Passwd'] == $pass) {
echo "Password OK<br>";
} else {
echo "Password not OK<br>";
}
if($detail['LoginKey'] == $key) {
echo "Key OK<br>";
} else {
echo "Key not OK<br>";
}
echo "<br>Nu gaan we een sessie aanmaken<br>";
/* session_start(); */
$_SESSION['Name'] = $detail['Name'];
$_SESSION['Username'] = $detail['Username'];
$_SESSION['Passwd'] = $detail['Passwd'];
$_SESSION['Level'] = $detail['Access'];
$_SESSION['ID'] = $detail['ID'];
header("location: ./index.php");
echo "</div>";
}else{
?>
<html>
<head>
<title>Sexy Devil</title>
<link href='inc/login.css' rel='stylesheet' type='text/css' media='screen'/>
</head>
<body>
<!-- Start framework login page -->
<?php echo"
<div class='login'>
<form id='login' action='".htmlspecialchars($_SERVER["PHP_SELF"]."?menu=login&action=check")."' method='POST'>
<fieldset>
<input type='text' name='username' placeholder='Username'>
<input type='password' name='password' placeholder='Password'>
<input type='text' name='key' placeholder='Keycode'>
<button type='submit' name='submit'>Login</button>
</fieldset>
</form>
<img id='img-login' src='./img/page/Sexy-Devil.jpg'>
</div>";
?>
<!-- End framework login page -->
</body>
</html>
<?php
}
?>
if($_GET['menu'] == 'login' && $_GET['action'] == 'check' ) {
$user = $_POST['username'];
$pass = md5($_POST['password']);
$key = $_POST['key'];
$sql = "SELECT * FROM AdminUsers WHERE Username='".$user."' AND Passwd='".$pass."' AND LoginKey='".$key."'";
$result = mysqli_query($connect, $sql);
$logindetails = mysqli_fetch_all($result, MYSQLI_ASSOC);
foreach($logindetails as $detail) {
echo "This we got from DBase<br>";
echo "Username : ".$detail['Username']."<br>";
echo "Password : ".$detail['Passwd']."<br>";
echo "LoginKey : ".$detail['LoginKey']."<br>";
echo "Name : ".$detail['Name']."<br>";
echo "Level : ".$detail['Access']."<br>";
}
echo "<div class='login'>";
if($detail['Username'] == $user) {
echo "<br>Username OK<br>";
} else {
echo "Username not OK<br>";
}
if($detail['Passwd'] == $pass) {
echo "Password OK<br>";
} else {
echo "Password not OK<br>";
}
if($detail['LoginKey'] == $key) {
echo "Key OK<br>";
} else {
echo "Key not OK<br>";
}
echo "<br>Nu gaan we een sessie aanmaken<br>";
/* session_start(); */
$_SESSION['Name'] = $detail['Name'];
$_SESSION['Username'] = $detail['Username'];
$_SESSION['Passwd'] = $detail['Passwd'];
$_SESSION['Level'] = $detail['Access'];
$_SESSION['ID'] = $detail['ID'];
header("location: ./index.php");
echo "</div>";
}else{
?>
<html>
<head>
<title>Sexy Devil</title>
<link href='inc/login.css' rel='stylesheet' type='text/css' media='screen'/>
</head>
<body>
<!-- Start framework login page -->
<?php echo"
<div class='login'>
<form id='login' action='".htmlspecialchars($_SERVER["PHP_SELF"]."?menu=login&action=check")."' method='POST'>
<fieldset>
<input type='text' name='username' placeholder='Username'>
<input type='password' name='password' placeholder='Password'>
<input type='text' name='key' placeholder='Keycode'>
<button type='submit' name='submit'>Login</button>
</fieldset>
</form>
<img id='img-login' src='./img/page/Sexy-Devil.jpg'>
</div>";
?>
<!-- End framework login page -->
</body>
</html>
<?php
}
?>
logout.php
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();
error_reporting(0);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
unset($_SESSION['Username']);
session_destroy();
header("location : ./index.php");
?>
session_start();
error_reporting(0);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
unset($_SESSION['Username']);
session_destroy();
header("location : ./index.php");
?>
Waar zit hier de fout?
Normaal werkt het op een andere site wel
Gewijzigd op 25/03/2023 13:22:04 door - Ariën -
De melding zegt het al: "More information about this error may be available in the server error log."
Dus ga eens graven.....
2) 'Undefined array key "menu"' kan je vertalen naar Ongedefineerde array sleutel 'menu'.
Je roept in je array 'menu' op. Maar die bestaat niet.
3) 'Cannot modify header information' wordt op internet uitgebreid besproken, dan die error krijg je als er output voor een header() staat. Dit kunnen witregels voor de php-tags zijn, maar ook HTML. En dat mag juist niet. De header moet als eerste uitgevoerd worden. Het kan ook in combinatie met een eerdere foutmelding zijn. Dus als je die error oplost, dan kan deze melding ook meteen verdwijnen.
Verder is dit wel vreemd:
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
// start sessie (dat is prima)
session_start();
// Ik wil geen foutafhandeling (waarom wil je dat bij het testen?)
error_reporting(0);
// Ik wil WEL fouten tonen (ah, dat willen we graag!)
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
// Ik wil wel foutafhandeling (en nu op eens weer wel?)
error_reporting(E_ALL);
?>
// start sessie (dat is prima)
session_start();
// Ik wil geen foutafhandeling (waarom wil je dat bij het testen?)
error_reporting(0);
// Ik wil WEL fouten tonen (ah, dat willen we graag!)
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
// Ik wil wel foutafhandeling (en nu op eens weer wel?)
error_reporting(E_ALL);
?>
Je komt een beetje onzeker over op deze manier ;-)
De beste oplossing:
Maak in je configuratie-bestand een waarde waarin je kan aangeven of je site in de test-modus staat.
Zo ja, dan zet je alle foutafhandeling aan. En zo nee, dan zet je alle foutafhandeling uit.
En zorg er ook voor dat je niet overal in elk bestand je code hoeft te herhalen. Ik noem dit DRY:
Don't
Repeat
Yourself
Je kan repeterende code in een include() zetten, of anders in een eigen gemaakte functie.
Nog een paar dingetjes over je code:
- Ook zie ik dat je een wachtwoord opslaat in een sessie. met welke reden is dat nodig? Het password is ene sleutel, en die heb je alleen nodig als je ergens binnen wilt komen. Eenmaal binnen heb je die NOOIT meer nodig.
- En Wachtwoorden hoor je met password_hash() te hashen, en zeker niet met het onveilige md5(). Controleren kan met password_verify().
En dan ook even nog een huishoudelijke mededeling:
Ik weet niet wat de strekking van je site zal zijn. Maar volgens de huisregels is het niet toegestaan om naar websites te refereren die voor 18+ publiek zijn. Dus graag hier alvast op letten. Alvast bedankt.
Gewijzigd op 25/03/2023 13:21:14 door - Ariën -
- Ariën - op 25/03/2023 13:07:11:
1) De 'Internal Server Error' heeft 1001 oorzaken, die je kan vinden in de error-log file.
De melding zegt het al: "More information about this error may be available in the server error log."
Dus ga eens graven.....
De melding zegt het al: "More information about this error may be available in the server error log."
Dus ga eens graven.....
Response header name 'location ' contains invalid characters, aborting request
Dit vind ik terug in de server log over de logout.php
Toevoeging op 25/03/2023 13:25:59:
Het zelfde gebruik ik ook op happy-truffles.com en daar werkt het wel.
Zo ziet de perfecte location-header eruit.
Let erop dat je steevast ook exit(); daarna gebruikt.
Toevoeging op 25/03/2023 13:28:18:
Arno van Zanten op 25/03/2023 13:23:59:
Het zelfde gebruik ik ook op happy-truffles.com en daar werkt het wel.
Elke server werkt weer anders. Maar het advies om netjes volgens de richtlijnen en voorbeelden te programmeren. Gebruik ook een goede editor die je tegen zulke typefouten beschermt.
Gewijzigd op 25/03/2023 13:27:19 door - Ariën -
Zelfde server, alles op transip
Code-snippets kunnen helpen.
Quote:
Warning: Cannot modify header information - headers already sent by (output started at /data/sites/web/[site url]/www/test/index.php:6) in /data/sites/web/[site url]/www/test/inc/login.php on line 42
en als ik dat bekijk.
index.php
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
session_start();
include('./inc/dbase.php');
?>
<html>
<head>
<title>[Site name]</title>
<link href='inc/login.css' rel='stylesheet' type='text/css' media='screen'/>
</head>
<body>
<!-- Start framework login page -->
<?php
if(!isset($_SESSION['Username'])){
include("./inc/login.php");
}else{
echo "<br>Welcome User: ";
echo $_SESSION['Username'];
echo "<br><a href='./inc/logout.php'>logout</a>";
}
?>
<!-- End framework login page -->
</body>
</html>
session_start();
include('./inc/dbase.php');
?>
<html>
<head>
<title>[Site name]</title>
<link href='inc/login.css' rel='stylesheet' type='text/css' media='screen'/>
</head>
<body>
<!-- Start framework login page -->
<?php
if(!isset($_SESSION['Username'])){
include("./inc/login.php");
}else{
echo "<br>Welcome User: ";
echo $_SESSION['Username'];
echo "<br><a href='./inc/logout.php'>logout</a>";
}
?>
<!-- End framework login page -->
</body>
</html>
en de login.php
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
if($_GET['menu'] == 'login' && $_GET['action'] == 'check' ) {
$user = $_POST['username'];
$pass = md5($_POST['password']);
$key = $_POST['key'];
$sql = "SELECT * FROM AdminUsers WHERE Username='".$user."' AND Passwd='".$pass."' AND LoginKey='".$key."'";
$result = mysqli_query($connect, $sql);
$logindetails = mysqli_fetch_all($result, MYSQLI_ASSOC);
foreach($logindetails as $detail) {
echo "This we got from DBase<br>";
echo "Username : ".$detail['Username']."<br>";
echo "Password : ".$detail['Passwd']."<br>";
echo "LoginKey : ".$detail['LoginKey']."<br>";
echo "Name : ".$detail['Name']."<br>";
echo "Level : ".$detail['Access']."<br>";
}
/* echo "<div class='login'>";
if($detail['Username'] == $user) {
echo "<br>Username OK<br>";
} else {
echo "Username not OK<br>";
}
if($detail['Passwd'] == $pass) {
echo "Password OK<br>";
} else {
echo "Password not OK<br>";
}
if($detail['LoginKey'] == $key) {
echo "Key OK<br>";
} else {
echo "Key not OK<br>";
}
*/
$_SESSION['Name'] = $detail['Name'];
$_SESSION['Username'] = $detail['Username'];
$_SESSION['Passwd'] = $detail['Passwd'];
$_SESSION['Level'] = $detail['Access'];
$_SESSION['ID'] = $detail['ID'];
header("location: ./index.php");
exit();
echo "</div>";
}[/code]
en de exit pakt hij ook niet.
if($_GET['menu'] == 'login' && $_GET['action'] == 'check' ) {
$user = $_POST['username'];
$pass = md5($_POST['password']);
$key = $_POST['key'];
$sql = "SELECT * FROM AdminUsers WHERE Username='".$user."' AND Passwd='".$pass."' AND LoginKey='".$key."'";
$result = mysqli_query($connect, $sql);
$logindetails = mysqli_fetch_all($result, MYSQLI_ASSOC);
foreach($logindetails as $detail) {
echo "This we got from DBase<br>";
echo "Username : ".$detail['Username']."<br>";
echo "Password : ".$detail['Passwd']."<br>";
echo "LoginKey : ".$detail['LoginKey']."<br>";
echo "Name : ".$detail['Name']."<br>";
echo "Level : ".$detail['Access']."<br>";
}
/* echo "<div class='login'>";
if($detail['Username'] == $user) {
echo "<br>Username OK<br>";
} else {
echo "Username not OK<br>";
}
if($detail['Passwd'] == $pass) {
echo "Password OK<br>";
} else {
echo "Password not OK<br>";
}
if($detail['LoginKey'] == $key) {
echo "Key OK<br>";
} else {
echo "Key not OK<br>";
}
*/
$_SESSION['Name'] = $detail['Name'];
$_SESSION['Username'] = $detail['Username'];
$_SESSION['Passwd'] = $detail['Passwd'];
$_SESSION['Level'] = $detail['Access'];
$_SESSION['ID'] = $detail['ID'];
header("location: ./index.php");
exit();
echo "</div>";
}[/code]
en de exit pakt hij ook niet.
Verder heb ik nog wat adviezen gegeven over onder meer de veiligheid en de wachtwoorden. Ik hoop dat je daar nog wat mee doet.
Gewijzigd op 25/03/2023 14:29:48 door - Ariën -
- Ariën - op 25/03/2023 14:29:24:
Verder heb ik nog wat adviezen gegeven over onder meer de veiligheid en de wachtwoorden. Ik hoop dat je daar nog wat mee doet.
Dat komt in orde
Top!
Warning: Cannot modify header information
Ik heb echt alles nagekeken en nog blijft deze fout ontstaan
Er staat ook bij vermeld in welk bestand de output staat.
Maar ik kan de fout niet zien.
Dit staat in de login.php
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if($_GET['menu'] == 'login' && $_GET['action'] == 'check' ) {
$user = $_POST['username'];
$pass = md5($_POST['password']);
$key = $_POST['key'];
$sql = "SELECT * FROM AdminUsers WHERE Username='".$user."' AND Passwd='".$pass."' AND LoginKey='".$key."'";
$result = mysqli_query($connect, $sql);
$logindetails = mysqli_fetch_all($result, MYSQLI_ASSOC);
foreach($logindetails as $detail) {
$_SESSION['Name'] = $detail['Name'];
$_SESSION['Username'] = $detail['Username'];
$_SESSION['Passwd'] = $detail['Passwd'];
$_SESSION['Level'] = $detail['Access'];
$_SESSION['ID'] = $detail['ID'];
}
header('location: http://www.[URL].nl/test/index.php');
exit();
echo "</div>";
}
$user = $_POST['username'];
$pass = md5($_POST['password']);
$key = $_POST['key'];
$sql = "SELECT * FROM AdminUsers WHERE Username='".$user."' AND Passwd='".$pass."' AND LoginKey='".$key."'";
$result = mysqli_query($connect, $sql);
$logindetails = mysqli_fetch_all($result, MYSQLI_ASSOC);
foreach($logindetails as $detail) {
$_SESSION['Name'] = $detail['Name'];
$_SESSION['Username'] = $detail['Username'];
$_SESSION['Passwd'] = $detail['Passwd'];
$_SESSION['Level'] = $detail['Access'];
$_SESSION['ID'] = $detail['ID'];
}
header('location: http://www.[URL].nl/test/index.php');
exit();
echo "</div>";
}
Warning: Cannot modify header information - headers already sent by (output started at /data/sites/web/[site url]/www/test/index.php:6) in /data/sites/web/[site url]/www/test/inc/login.php on line 42
Het is niet mogelijk om de header te sturen, omdat de header al verstuurd is.
Die header is verstuurd toen php begon om output te geven. Dat gebeurde op regel 6 (zegt de foutmelding zelf!)
Daarna staat ter afsluiting ook nog dat dat versturen van de header niet lukte op regel 42.
Er vanuit gaande dat je inderdaad op regel 42 een header moet komen van jou, dan heb je dus een issue op regel 6: waarom komt daar output.
Stel dat dat die melding over "undefined index menu" is, dan los eerst die fout op.
Als daar staat "echo $xyz", dan vraag je af waarom je daar iets op het scherm wilt zetten, als niemand dat ooit te zien krijgt aangezien je op regel 42 "ga door naar locatie X" wilt roepen.
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
<?php
session_start();
include('./inc/dbase.php');
echo '
<html>
<head>
<title>Site name</title>
<link href="inc/login.css" rel="stylesheet" type="text/css" media="screen"/>
</head>
<body>
<!-- Start framework login page -->';
if(!isset($_SESSION['Username'])){
include("./inc/login.php");
}else{
echo "<br>Welcome User: ";
echo $_SESSION['Username'];
echo "<br><a href='./inc/logout.php'>logout</a>";
}
echo '
<!-- End framework login page -->
</body>
</html>';
?>
session_start();
include('./inc/dbase.php');
echo '
<html>
<head>
<title>Site name</title>
<link href="inc/login.css" rel="stylesheet" type="text/css" media="screen"/>
</head>
<body>
<!-- Start framework login page -->';
if(!isset($_SESSION['Username'])){
include("./inc/login.php");
}else{
echo "<br>Welcome User: ";
echo $_SESSION['Username'];
echo "<br><a href='./inc/logout.php'>logout</a>";
}
echo '
<!-- End framework login page -->
</body>
</html>';
?>
Gewijzigd op 25/03/2023 18:43:08 door Arno van Zanten
Warning: Cannot modify header information - headers already sent by (output started at /data/sites/web/[site url]/www/test/index.php:6) in /data/sites/web/[site url]/www/test/inc/login.php on line 42
Op index.php, lijn 6 staat output. En de header staat op login.php op mijn 42.
ja? Moet ik dus een aparte include maken voor een stukje HTML?
Ik zorg er altijd voor dat de headers geplaatst worden voordat er HTML gebruikt wordt. Als het niet direct is zijn er altijd wel voorwaarden aan die met if-else kan oplossen.
1) zet je sessions
2) kijk of er een form gepost is.
2a) zo ja, handel die af.
2b) niet heel ongebruikelijk: na een form post volgt een redirect (GET) naar een/dezelfde url
3) bereid de output voor: verzamel data uit de database, doe berekeningen etc. En bewaar dit in een variabele
4) mogelijk moet nav. stap 3 de gebruiker nog ergens heen geredirect: now is the time
5) begin met je output.
5a) als het niet de standaard html is, dan doe een contentType header (application/json bijv)
5b) begin output: bijvoorbeeld een lap html. In deze html zitten waarschijnlijk plekken waar je iets uit stap 3 wilt tonen: <span>Hallo , welkom op de site</span>