Hallo jongens!

Ik heb een website gemaakt (nou ja... bezig met het maken eigenlijk)

Nu heb ik deze vrij eenvoudig geschreven, maar weinig opgelet met het echt valide maken van het geheel.

Ik zit bijvoorbeeld met een headers send fout, en weet ook dat het ligt aan eerst html en dan php.

Maar zou iemand mij kunnen vertellen hoe ik dit stukje script nu het makkelijkst valide maak?

<?php
require("connect.php"); //hier heb ik gezorgt dat er nog geen html output in zit
require("session.php"); //hier heb ik gezorgt dat er nog geen html output in zit
echo "<!DOCTYPE html>";
echo "<html>";
echo "<head>";
echo "<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>";
echo "<link rel='stylesheet' type='text/css' href='css.css'>";
echo "</head>";
echo "<body>";
if(!isset($_SESSION['suser'])) {
echo "Je bent nog niet ingelogd.";
header("Location: login.php"); //hier op krijg ik al de headers send fout ivm html
}
else {
echo "<div id=ingelogd><table><tr><td width=170>Ingelogd als: ". $_SESSION['suser']. "</td><td><a href=logout.php>Uitloggen</a></td></table></div>";
if(($_SESSION['slevel']) >= 1) {
//Level 1
}
else {
//Geen Level 1
}
if(($_SESSION['slevel']) >= 2) {
//Level 2
}
else {
//Geen Level 2
}
if(($_SESSION['slevel']) >= 3) {
//Level 3
echo "<table class=buiten>";
echo "<th>Invul Opties</th>";
echo "<tr>";
echo "<td width=150>";
echo "<a href=uitslageninvullen.php>Uitslagen Invullen</a><br>";
echo "<a href=topscoresbew.php>Topscores Invullen</a><br>";
echo "</td>";
echo "</tr>";
echo "</table>";
echo "<br>";
echo "<table class=buiten>";
echo "<th>Bewerk Opties</th>";
echo "<tr>";
echo "<td width=150>";
echo "<a href=programmabew.php>Programma bewerken</a>";
echo "</td>";
echo "</tr>";
if (($_SESSION['slevel']) == '3') { echo "</table>"; echo "<br>";}
}
else {
//Geen Level 3
}
}
echo "</body>";
echo "</html>";
?>
Dit is eerder vandaag nog naar voren gekomen, en het komt doordat je HTML voor je header() plaatst, en dit mag niet. Zelf een spatie laat het script een foutmelding geven.

Oplossing: Geen HTML of witruimte plaatsen voor je header(), session_start() of setcookie()

En verder nog een tip, je hoeft niet op elke regel een echo te gebruiken.
Ik heb dat topic inderdaad gelezen, maar ik vraag me af hoe ik dit nu het beste valide maak.

Alleen bij de else de html zetten, dan is hij bij de if niet valide (toch?)

En de quotes ga ik nog aanpassen.
Misschien als je alles opslaat in variabelen en dan na de header pas echoed
Ik heb nu bij de if alleen header gedaan en bij de else de html output, en dat werkt perfect :)

Dank allen
Je mist ook een </tr> in de bovenste tabel (waarom je een tabel gebruikt is mij ook niet duidelijk)...
Je charset klopt niet.
Je mist een titel, welke verplicht is.
Daarnaast: echo HTML in enkele haakjes, zodat je gewoon dubbele haakjes in je HTML kan gebruiken.

Het wordt zoiets als dit:

<?php
	require ("connect.php");
	require ("session.php");

	// define $html
	$html = '';

	// bij geen sessie: eerst inloggen
	if( !isset($_SESSION['suser']))
	{
		header("Location: login.php");
		// je kan hier niets tonen: header is direct. Wil je een melding tonen: html
		// gebruiken.
		// dus ook een html-redirect <meta refresh>
	}

	else
	{
		// geef aan dat je ingelogd bent
		$html .= '	<p id=ingelogd>
							<span class="w170">Ingelogd als: ' . $_SESSION['suser'] . '</span>
							<a href=logout.php>Uitloggen</a>
						</p>';

		// per level iets doen
		if($_SESSION['slevel'] >= 1)
		{
			//Level 1
		}
		elseif($_SESSION['slevel'] >= 2)
		{
			//Level 2
		}
		elseif($_SESSION['slevel'] >= 3)
		{
			//Level 3
			$html .= '
			<p class="buiten">
				<h2>Invul Opties</h2>
					<a href=uitslageninvullen.php>Uitslagen Invullen</a>
					<a href=topscoresbew.php>Topscores Invullen</a>
				<h2>Bewerkopties</h2>
					<a href=programmabew.php>Programma bewerken</a>
			</p>';
		}
		else
		{
			$html .= 'Er is iets foutgegaan: je hebt blijkbaar geen user-level gekregen...';
		}
	}

	// toon html
	echo '
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>Test</title>
		<link rel="stylesheet" type="text/css" href="css.css">
	</head>
	
	<body>
		' . $html . '
	</body>
</html>';
?>
Hallo Eddy,

Bedankt voor je reactie.

Word het veel gebruikt om pas op het einde heel de html te echoen?
Templates werken ook zo.
Persoonlijk doe ik het wel anders: ik echo ook gewoon eerst HTML die ik kwijt wil.
En dan gebruik ik gewoon geen header().

Dit is wel good-practice (niet best-practice) zo. En sneller en makkelijker te bewerken (als nodig).

Reageren