Ik ben bezig met een formulier, waarbij je op basis van gegevens uit de database naar een bepaalde pagina word gestuurd.
Staat er in de database dat je een Gebruiker bent, dan ga je naar gebruiker.php?...
ben je volgens de database een Medewerker, dan ga je naar admin.php

De volgende code heb ik geprobeerd met eerst alleen een check of je gebruiker bent, zonder succes:


<?php
session_start(); // Start a new session
if(isset($_GET['Medewerkerscode']))
{ 
  $ID = intval($_GET['Medewerkerscode']);
  // getting info from db
}
?>
<?php
if(isset($_GET['Gebruikersnaam']))
{ 
  $username = $_GET['Gebruikersnaam'];
  // getting info from db
}?><?php
                        
$con=mysqli_connect("-t");
// Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
};
// Get the data passed from the form
$username = $_POST['Gebruikersnaam'];
$password = $_POST['Wachtwoord'];

// escape variables for security
$username = mysqli_real_escape_string($con, $_POST['Gebruikersnaam']);
$password = mysqli_real_escape_string($con, $_POST['Wachtwoord']); 
$ID = mysqli_real_escape_string($con, $_POST['Medewerkerscode']); 

$sql = "select * FROM gebruikers WHERE Gebruikersnaam = '$username' and id = '$ID' and Wachtwoord = '$password'";

$result = mysqli_query($con, $sql) or die ( mysql_error() );

$nrOfRows = mysqli_num_rows($result);
if ($nrOfRows > 0)
{
	if(mysqli_query("SELECT Functie FROM gebruikers WHERE Functie = 'Medewerker'")){
    $_SESSION['Inloggen'] = "true";
    header("Location:admin.php?id=" . $row['Medewerkerscode'] . "&&Gebruikersnaam=" . $row['Gebruikersnaam'] . "&&Wachtwoord=" . $row['Wachtwoord'] . "");
}
}
else
{
    echo "Het inloggen is mislukt.";
}
mysqli_close($con);
?></body></html>

    if(mysqli_query("SELECT Functie FROM gebruikers WHERE Functie = 'Medewerker'")){

Je moet wel aangeven welke gebruiker het is.

Maar kan je de functies niet opslaan in de ledentabel? Dan kan je direct als een account goed is gevalideerd het record fetchen en kijken of diegene een gebruiker of medewerker is.


	if(mysqli_query("SELECT * FROM gebruikers WHERE Functie = 'Medewerker' and id = '$ID'")){
    $_SESSION['Inloggen'] = "true";
    header("Location:admin.php?id=" . $row['Medewerkerscode'] . "&&Gebruikersnaam=" . $row['Gebruikersnaam'] . "&&Wachtwoord=" . $row['Wachtwoord'] . "");
}


meer zoiets?
De tabel Gebruikers is de enige tabel die ik op dit moment heb.
Ik zou het anders doen, en in het algemeen de gebruiker eerst ophalen, ongeacht zijn functie:

<?php

$result = mysqli_query("SELECT * FROM gebruikers WHERE id = '".$ID."'");
if($result) {
	$data = mysqli_fetch_assoc($result);
    	$_SESSION['Inloggen'] = true;
	if($data['Functie']=='Medewerker') {
	}
			if($data['Functie']=='Medewerker') {
				$_SESSION['Medewerker'] = true;
				header("Location:admin.php");
				exit();
			} else {
				header("Location:gebruiker.php");
				exit();
			}
} else {
	// je query is foutgegaan, bouw hier foutafhandeling in
}
?>

En wachtwoorden in een URL geven? Ai ai ai ai ai.......
Verder kan je in plaats van de functie op te slaan in een sessie, deze ook op admin.php opnieuw ophalen. Zo voorkom je dat iemand nog vrolijk doorgaat met zijn beheerderstaken na het degraderen ervan in de database terwijl hij nog vrolijk ingelogd is.
if($sql) {
    $data = mysqli_fetch_assoc($sql);
        $_SESSION['Inloggen'] = true;
            if($data['Functie']='1') {
                $_SESSION['Medewerker'] = true;
                header("Location:Admin.php");
				exit();
            } if($data['Functie']='0'){
				$_SESSION['Gebruiker'] = true;
                header("Location:Gebruiker.php");
				exit();
            }
} else {
    header("Location:inlog.php");
				exit();
}
mysqli_close($con);

Admin pakt hij wel maar gebruiker niet
Bij witte pagina's waarin de HTML-source ook zo goed als leeg is, kan het altijd geen kwaad om foutafhandeling aan te zetten, door dit bovenaan te zetten:

<?php
error_reporting(E_ALL);
ini_set('display_errors',1);
?>

Verder over je code:
- Ik hoop niet dat je je wachtwoorden onbeveiligd en in plain-text opslaat?
- Waarom als je query mislukt laat je je inlog.php pagina opnieuw? Ik zou liever een foutmelding geven dat er een 'technische storing' is. Waarbij op de achtergrond de fout gelogd wordt.


$sql = mysqli_query($con, "select * FROM gebruikers WHERE Gebruikersnaam = '$username' and id = '$ID' and Wachtwoord = '$password'");
if($sql) {
    $data = mysqli_fetch_assoc($sql);
        $_SESSION['Inloggen'] = true;
            if($data['Functie']='0') {
                $_SESSION['Gebruiker'] = true;
                header("Location:Gebruiker.php");
				exit();
            } else if($data['Functie']='1'){
				$_SESSION['Medewerker'] = true;
                header("Location:Admin.php");
				exit();
            }
} else {
    
}
mysqli_close($con);
?></body></html>

waarom pakt hij hier alleen de bovenste en kijkt hij uberhaupt niet naar session medewerker?
Omdat je geen vergelijking doet maar een toewijzing (== vs =) en een toewijzing is altijd waar.
Echt die dingen waar ik overheen kijk, terwijl ik ze wel in mijn code weer heb toegevoegd. ;-)
Ben van Velzen op 20/06/2016 12:17:19
en een toewijzing is altijd waar.


Nietes! :)

<?php
if ($test = false) {
    echo 'cake';
} else {
    echo 'no cake';
}
// levert "no cake"
?>

De toekenning is alleen "waar" als de toegekende waarde "waar" is.

Of liever gezegd, de toekenning zelf "$test = false" wordt geevalueerd en het resultaat van deze evaluatie is de waarde van de toekenning, zodat er dus effectief "if (false)" staat.

@Bart, het lijk mij handiger om ook het user id mee te geven in de sessie. Je zou dan ook kunnen overwegen om de rechten die die gebruiker heeft elke keer opnieuw uit te rekenen. Op het moment dat de rechten of rol van die persoon wijzigt is deze dan ook direct doorgevoerd, en niet pas op het moment dat deze uitlogt of zijn/haar sessie verloopt...
bijna correct ;)

je hebt twee opties..
<?php
if(!$test === false):
echo "no cake";
else:
echo "cake";
endif;
//levert "no cacke"
?>

dus met een uitroep teken zeg je het zelfde als de post hier boven ;)

Reageren