Логин на основе роли пользователя всегда перенаправляется на одну и ту же страницу

php redirect

68 просмотра

1 ответ

Я хочу перенаправить пользователей на разные страницы в зависимости от их роли с помощью PHP. Но проблема в том, что кто бы ни был пользователь, он всегда будет перенаправлен на одну и ту же страницу (страницу, на которую ссылался первый оператор if).

вот код

<?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";
  }
}
?>

Итак, если я заменим admin.php в первом операторе if другой страницей, пользователи будут перенаправлены туда. Я следовал решениям из другого случая, но это не сработало.

Автор: psdm Источник Размещён: 08.11.2019 11:27

Ответы (1)


2 плюса

Решение

Эта линия

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

Наборы $roleдля trueили , возможно , falseно это , безусловно , не ставит его содержание$row['role']

Я бы посоветовал полностью удалить эту строку, в этом нет необходимости, так как ваш if / elseif / else очень хорошо охватывает все возможные варианты.

Также совершенно необязательно перемещать значение из $rowмассива в скалярную переменную, так что это будет проще

//$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';
}

К сожалению, я должен упомянуть следующее: ваш сценарий подвержен риску атаки с использованием SQL-инъекций. Посмотрите, что произошло с таблицами Бобби Бобби. Даже если вы избегаете входных данных, это небезопасно! Используйте подготовленные параметризованные операторы

Также очень опасно хранить простой текстовый пароль в вашей базе данных. Наиболее вероятным вектором атаки на вашу базу данных является внутренний персонал. Поэтому все пароли должны быть ХЕШЕНЫ. PHP предоставляет password_hash() и, password_verify()пожалуйста, используйте их.

Автор: RiggsFolly Размещён: 20.08.2016 03:21
Вопросы из категории :
32x32