Ik ben een beginner op het gebied van PHP, dus voor jullie zal het waarschijnlijk simpel zijn.
Ik moet controleren of je ingelogd bent ( zo niet zou je terug naar de index.php gestuurd moeten worden)
Maar als ik dit test door bv localhost/opdracht/toevoegen.php in de adresbalk in te geven ( waar ik zo niet in zou mogen geraken) kom ik toch op de pagina terecht ( je kan wel geen games toevoegen. enkel menubalk, banner en footer zijn zichtbaar) maar ik word dus niet naar de index.php gestuurd. Kan iemand helpen en zeggen wat ik fout doe?


<!DOCTYPE HTML>
<html>
    <?php
    session_start();
    
    ?>
	
    <head>
        <link rel="stylesheet" type="text/css" href="opmaak.css">
    </head>
	
	<body>	

         <!-- Banner-->
		<header id="header">
			<div class="innertube">
				<h1>Gamechick1988's Gaming Database  </h1>
				<img id="logo" src="image.png" alt="logo.png" title="gamertag"/>
			</div>
		</header>
       
       <!-- Gedeelte vlak onder de header-->
	   <div id="wrapper">
		
		<main>
           

				<div id="content">
					<div id="toevoegen">
                    <?php

                        if ((isset($_SESSION["gebruikersnaam"])) AND (isset($_SESSION["wachtwoord"])))
                        {
                        
                            //database connectie maken
                            //variable aanmaken van de server

                            $servername= "localhost";
                            $username = "root";
                            $password = "";

                            //variable database-naam en tabelnaam

                            $dbname = "gamingdatabase";
                        
                            //connectie maken

                            $conn = mysqli_connect($servername, $username, $password, $dbname);
                            // connectie controleren

                            if (!$conn)
                            {
                                die("Connectie mislukt:" . mysqli_connect_error());
                            }

                            else
                            {
                                echo "";
                            }


                        
                            $sql2 = "SELECT ID, platform FROM consoles";
                            $result2 = mysqli_query($conn, $sql2 );

                            //teller
                            $i = 1;
                            if (mysqli_num_rows($result2) > 0)
                            {
                            ?>

                            
                                <div id="game">
                                    <h2 style="text-decoration: underline; text-align: center; ";>Een game toevoegen</h2>
                                    <img id ="addgame" src="add.png" alt="add" />
                        
                                            
                                        <form action="toegevoegd.php"  method="post" >
                                            <table style="color:black; text-align: center;" cellpadding="5">
                                            </br>
                                            <tr>
                                                <td>Titel</td>
                                                    <td><input type="text" name="titel" value="Geef de titel in" required style="width: 200px; color: black; "  /></td></br>
                                            </tr>
                                            </br>
                                            <tr>
                                                <td>Platform</td>
                                                <td>
                                                    <select name="platform" style="width: 200px;color: black;">
                                                    <option value="">Selecteer het juiste platform</option>"
                                                    <?php
                                                        while($row = mysqli_fetch_assoc($result2))
                                                            {
                                                                echo "<option value=".$row["platform"].">".$row["platform"]."</option>";
                                                                $i++;
                                                            }
                                                    
                                                            echo "</select>";
                                                    ?>
                                                    
                                                </td>
                                            </tr>
                                            <tr>
                                                <td>Genre</td>
                                                    <td><input type="text" name="genre" value="Geef het genre in" required style="width: 200px; color: black; "  /></td></br>
                                            </tr>
                                            </br>
                                            <tr>
                                                <td>Publisher</td>
                                                    <td><input type="text" name="publisher" value="Geef de publisher in" required style="width: 200px; color: black; "  /></td></br>
                                            </tr>
                                            </br>
                                            <tr>
                                                <td>Special Edition </td>
                                                <td>
                                                    <select name="se"  required style="width: 200px; color: black;">
                                                        <option value="niet ingevuld">-</option>
                                                        <option value="yes">Yes</option>
                                                        <option value="no">No</option>
                                                    </select>
                                                </td>
                                                
                                            </tr>
                                            </br>
                                            <tr>
                                                <td>Finished </td>
                                                <td>
                                                    <select name="finished"  required style="width: 200px; color: black;">
                                                        <option value="niet ingevuld">-</option>
                                                        <option value="yes">Yes</option>
                                                        <option value="no">No</option>
                                                    </select>
                                                </td>

                                            </tr>
                                            </br>
                                            <tr>
                                                <td>Copy </td>
                                                <td>
                                                    <select name="copy"  required style="width: 200px; color: black;">
                                                        <option value="niet ingevuld">-</option>
                                                        <option value="digital">Digital copy</option>
                                                        <option value="physical">Physical copy</option>
                                                    </select>
                                                </td>

                                            </tr>
                                            </br>
                                        
                                            </table>

                                            <table>
                                                <tr>
                                                <td colspan="2">
                                                    <input type="submit"  value="toevoegen" name="toevoegen" />
                                                </td>
                                                </tr>
                                            </table>
                                            
                                        </form>
                                </div>
                            
                                 
                            <?php

                            //connectie met server sluiten nadat al de data werd opgehaald  
                            mysqli_close($conn);     
                            }
                        
                            else
                            {
                                
                                echo('location: index.php');
                            }
                        

                        }
                   
                    
                    ?>
                    </div>
				</div>
			</main>
			
			<nav id="nav">
				<div class="innertube">
					<h3>Mijn collectie</h3>
					<ul>
						<li><a href="toevoegen.php">Een game toevoegen</a></li>
  						<li><a href="opvragen.php">Mijn games opvragen</a></li>
  						<li><a href="verwijderen.php">Een game verwijderen</a></li>
                        <li><a href="wijzigen.php"> Een game wijzigen </a></li>
                        <li><a href="consolestoevoegen.php"> Een console toevoegen </a></li>
                        <li><a href="consolesopvragen.php"> Mijn consoles opvragen </a></li>

            
                        <form id="aanmelden" action= "index.php" method="post">
                        <br>
                            <label class="logoutLblPos">
                                <input type= "submit" name="afmelden" id="afmelden" value="Afmelden"/>
                            </label>
                        </form>
  						
					</ul>
					
				</div>
			</nav>
		
		</div>

       
    
        <footer id="footer">
			<div class="innertube">
				<a href="index.php"> Loginscherm </a>|<a href="toevoegen.php"> Een game toevoegen </a>|<a href="opvragen.php"> Games opvragen </a>|
				<a href="verwijderen.php"> Een game verwijderen </a>|<a href="wijzigen.php"> Een game wijzigen </a>|<a href="consolesopvragen.php"> Mijn consoles opvragen </a>|
                <a href="consolestoevoegen.php"> Een console toevoegen </a>|
			</div>
		</footer>
	
	</body>
</html>
Je mag session_start() en header() alleen gebruiken als er nog geen output verzonden is. Jij zet boven de session_start() al HTML-code, dit mag dus niet, dit geld ook voor de header().
Als de header() enkel gebruikt mag worden zolang er geen output is, hoe gebruik je deze dan om je terug naar de index.php te sturen als je niet ingelogd bent (aangezien deze code onderaan staat)?
"Als de header() enkel gebruikt mag worden zolang er geen output is, hoe gebruik je deze dan om je terug naar de index.php te sturen als je niet ingelogd bent (aangezien deze code onderaan staat)?"

Dan klopt je volgorde dus niet...

Je controleert eerst of iemand ingelogd is. En pas als dat zo is, begin je met het aanbieden van een htmlpagina (in dit geval).

Stel je bent krantenbezorger.
Dan duw je ook niet eerst de krant door de brievenbus, en als die zo'n beetje op de mat ligt, check je of deze bus wel een krant moest hebben. (of een AD ipv een Telegraaf oid)

Dus eerst de controle in php of je iets moet tonen of moet door verwijzen.
En ook de controle WAT je eigenlijk moet tonen (bijvoorbeeld in het geval iemand wel rechten heeft om laten we zeggen orders, te bekijken, maar de lijst leeg is.
In dat geval begin je ook niet een html-lijst, maar een melding dat er niets gevonden is.
Er zijn een aantal dingen mis met de volgende constructie:
<?php
if ((isset($_SESSION["gebruikersnaam"])) AND (isset($_SESSION["wachtwoord"])))
{
    // ...
} else {
    echo('location: index.php');    
}
?>

Allereerst zou ik altijd && gebruiken in plaats van AND, en || in plaats van OR omdat de AND en OR niet altijd werken zoals je verwacht omdat er iets aan de hand was met de prioriteit van de operanden. Tenzij je precies weet hoe AND en OR precies werken ten opzichte van respectievelijk && en ||: gebruik simpelweg && en || in boolean statements (dat gedoe tussen de haakje van een if-statement).

Ten tweede: dit zorgt voor een enorm grote tangconstructie. Het is beter om het if-statement meteen aan het begin af te wikkelen, zoals @Ivo zegt: nog voordat je de krant door de bus hebt geduwd :p. Als je dit if-statement bent gepasseerd kun je er vanuit gaan dat bepaalde condities gelden, anders was je immers niet langs dit if-statement gekomen. Beschouw deze controle als de waakhond van je script.

En tot slot, deze syntax is verkeerd om twee redenen:
<?php
echo('location: index.php');    
?>

Ten eerste bedoelde je waarschijnlijk [color=#ff0000]header[/color]('Location: index.php'); en ten tweede moeten dit soort headers altijd gevolgd worden door een exit-statement omdat de daaropvolgende code anders niet goed beschermd is want header('Location: ...') transporteert je niet direct automagisch naar de nieuwe locatie. Dit is een misvatting die er beter in een heel vroeg stadium uitgestampt zou moeten worden :).

Wat je dus aan het begin van je script zet, nog voor je <!DOCTYPE> is zoiets:
<?php
session_start(); // begin een sessie of zet een sessie voort

if (empty($_SESSION['gebruikersnaam']) || empty($_SESSION['wachtwoord'])) {
    // een van de twee is leeg, verkassen maar
    header('Location: index.php');
    exit; // stopt verdere executie van het script
}
// Als we dit punt bereiken geldt dat zowel gebruikersnaam en wachtwoord in de sessie niet leeg zijn.
// Dit is in wezen de "ontkenning" van het vorige if-statement en dus in feite zitten we nu in het
// onzichtbare "else" deel van het if-statement. Dit scheelt je weer inspring in je code
// en een ogenschijnlijk verdwaalde sluit-accolade ~200 regels verderop.
?>

Wat natuurlijk ook een beetje raar is dat deze informatie (met name het wachtwoord) gepropageerd wordt in de sessie. Deze informatie heb je eigenlijk alleen maar nodig in de authenticatie-stap. En dan, als vastgesteld is wie je bent houd je dit bij in je sessie.

En dan wederom wat @Ivo zei: doorgaans is het niet zo belangrijk wie je bent (tenzij je applicatie iedereen toelaat die kan inloggen) maar meer wat voor rechten je hebt en dus wat voor acties je mag uitvoeren binnen de applicatie.
Bedankt voor de info allemaal. Het klinkt nu al een stuk duidelijker. Thomas, als ik dit bovenaan zet, kan ik dan mijn
 if ((isset($_SESSION["gebruikersnaam"])) AND (isset($_SESSION["wachtwoord"]))) { 


in het midden van mijn code verwijderen of mag dit blijven staan? Want als er geen gebruikersnaam en wachtwoord gevonden wordt, kom je er niet in
Dat kun je er gerust uithalen, want de inverse is bovenaan al gecontroleerd, en als een of beide leeg zijn gaat het script niet verder.

Reageren