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
Er staat ook bij vermeld in welk bestand de output staat.
ja in de login.php

Maar ik kan de fout niet zien.
Dit staat in de login.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) {
			$_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>";
	}
Het leuke van deze foutmelding is dat deze heeeel duidelijk is:

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.
Hier de index, waar zit dan de header hier?
<?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>';
?>
Niet daar.

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?
Of een logische structuur met if-else. Het is onzinnig om HTML te tonen voordat je iemand doorstuurt.

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.
Een handige benadering is:

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 <?= $gebruikersnaam; ?>, welkom op de site</span>


Reageren