2016-08-20 3 views
0

Ich möchte Benutzer auf andere Seite basierend auf ihrer Rolle mit PHP umleiten. Aber das Problem ist, wer immer der Benutzer ist, sie werden immer auf die gleiche Seite umgeleitet (Seite, auf die die erste if-Anweisung verweist).User-Rolle basierte Login immer auf die gleiche Seite umleiten

Hier ist der Code

<?php 
include("config.php"); 
session_start(); 

if($_SERVER["REQUEST_METHOD"] == "POST") { 

    $myusername = mysqli_real_escape_string($db,$_POST['username']); 
    $mypassword = mysqli_real_escape_string($db,$_POST['password']); 

    $sql = "SELECT * FROM user WHERE username = '$myusername' and password = '$mypassword'"; 
    $result = mysqli_query($db,$sql); 
    $row = mysqli_fetch_array($result,MYSQLI_ASSOC); 
    $active = isset($row['active']); 
    $count = mysqli_num_rows($result); 

    $role = isset($row['role']); 

    if($role == 'admin'){ 
     $link = 'admin.php'; 
    } 
    elseif($role == 'user'){ 
     $link = 'user.php'; 
    } 
    elseif($role == 'expert'){ 
     $link = 'expert.php'; 
    } 
    else{ 
     $link = '404.php'; 
    } 

    if($count == 1) { 
    $_SESSION['username'] = $myusername; 

    header("Location: ".$link.""); 
    exit(); 
    }else { 
    $error = "Your Login Name or Password is invalid"; 
    } 
} 
?> 

Also, wenn ich admin.php auf der ersten ersetzen if-Anweisung mit einer anderen Seite werden die Nutzer dort umgeleitet werden. Ich habe Lösungen aus verschiedenen Fällen verfolgt, aber es hat nicht funktioniert.

+0

sogar ich ändere das "=" zu "==" es wird das gleiche sein, immer noch auf die gleiche Seite auf der ersten if-Anweisung umgeleitet. Wenn ich es in "===" ändere, wird es in die 404.php umgeleitet. –

Antwort

2

Diese Linie

$role = isset($row['role']); 

Sets $role zu true oder möglicherweise false aber es ist definitiv nicht gesetzt nicht auf den Inhalt der $row['role']

ich völlig, dass die Linie zu entfernen vorschlagen würde, ist es nicht notwendig, als wenn/elseif/else deckt alle möglichen Optionen recht gut ab.

Es ist auch völlig unnötigen einen Wert aus der $row Feld in eine skalare Variable zu bewegen, so würde dies einfacher sein

//$role = isset($row['role']); 

if($row['role'] == 'admin'){ 
    $link = 'admin.php'; 
} elseif($row['role'] == 'user'){ 
    $link = 'user.php'; 
} elseif($row['role'] == 'expert'){ 
    $link = 'expert.php'; 
} else{ 
    $link = '404.php'; 
} 

Leider muss ich erwähnen, dass: Ihr Skript ist in Gefahr SQL Injection Attack Werfen Sie einen Blick auf das, was passiert Little Bobby Tables Selbst if you are escaping inputs, its not safe! Verwenden prepared parameterized statements

Es ist auch sehr dangerou s Speichern von Nur-Text-Passwort in Ihrer Datenbank. Der wahrscheinlichste Angriffsvektor in Ihrer Datenbank sind interne Mitarbeiter. Daher sollten alle Passwörter verworfen werden. PHP bietet password_hash() und password_verify() bitte verwenden Sie sie.

+0

Um zu erweitern: 'if (isset ($ row ['role'])) $ role = $ (row ['role']);' –

+0

@Devrim Es ist normalerweise nicht notwendig, nach dem Vorhandensein einer Spalte in einem Ergebnis der Datenbankabfrage – RiggsFolly

+1

Ich hatte diese Frage früher mit den 3 gleich und schloss sie auf der Grundlage ihrer Kommentar/bearbeiten wieder geöffnet. Das einzige, was übrig blieb, war das "isset"; Lordie, können sie sich nicht selbst etwas einfallen lassen? * Seufzen/Stöhnen *, scheint nicht so zu sein. –

Verwandte Themen