Hallo, ik heb een login script, dat normaal werkt, maar nu wil ik het zelfde script gebruiken op een andere site, krijg ik steeds fouten na fouten.
Een van die fouten is deze:
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 :

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

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.


de index.php
 <?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>";
?>


inlog.php

<?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

<?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
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.....

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:
<?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);
?>

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.
- 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.....



Response header name 'location ' contains invalid characters, aborting request
Dit vind ik terug in de server log over de logout.php

[size=xsmall]Toevoeging op 25/03/2023 13:25:59:[/size]

Het zelfde gebruik ik ook op happy-truffles.com en daar werkt het wel.
Ik gok op de spatie voor de dubbele punt.

Zo ziet de perfecte location-header eruit.

<?php
header('Location: http://www.example.com/');
exit();
?>


Let erop dat je steevast ook exit(); daarna gebruikt.

[size=xsmall]Toevoeging op 25/03/2023 13:28:18:[/size]

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.
Zelfde server, alles op transip
Dan lijkt het mij sterk. Maar goed, zoals ik al zei: Werk netjes en volgens de richtlijnen.
Code-snippets kunnen helpen.
header in grote lijn opgelost, maar zodra ik inlog, blijft hij zeuren met deze fout die ik niet begrijp.

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
<?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>

en de login.php
<?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>";
	}

en de exit pakt hij ook niet.
Die echo's in je foreach daarvoor zijn ook output.

Verder heb ik nog wat adviezen gegeven over onder meer de veiligheid en de wachtwoorden. Ik hoop dat je daar nog wat mee doet.
- 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
Maar toch blijft hij dit doen :

Warning: Cannot modify header information

Ik heb echt alles nagekeken en nog blijft deze fout ontstaan

Reageren