mysqli_fetch_array возвращает значение для сеанса, но не переменную - PullRequest
0 голосов
/ 26 июня 2019

Итак, я делаю простую страницу входа на PHP. У меня есть 2 таблицы, одна для персонала (администратор, менеджер и т. Д.) И одна для клиента, обе имеют 3 общих столбца: имя пользователя, пароль, роль. Когда пользователь входит в систему, роль будет установлена ​​в сеансе, чтобы перенаправить пользователя на соответствующую страницу. В настоящее время мой код, как показано ниже:

function.php

function queryMySQL($query)
{
    global $conn;
    $result = $conn->query($query);
    if(!$result)
    {
        die($conn->error);
    }
    return $result;
}
function  passwordToToken($password)
{
    global $salt1;
    global $salt2;
    $token = hash("ripemd128", "$salt1$password$salt2");
    return $token;
}

login.php

<?php
require_once 'function.php'
$user = $_POST['user'];
$pass = $_POST['pass'];
$token = passwordToToken($pass); //encrypt password
$query = "Select userId, username, password, role 
          from users 
          where username = '$user' 
          and password = '$token' 
        union 
          Select customerId, username, password, role 
          from customer 
          where username = '$user' 
          and password = '$token'";
$result = queryMySQL($query); //function return mysqli_query
if($result->num_rows == 0)
{
    $error = "Username/password is invalid";
    echo $error;
} else {
    session_start();
    $_SESSION['uId'] = mysqli_fetch_array($result)[0];
    $_SESSION['user'] = $user;
    $_SESSION['pass'] = $pass;
    $role = mysqli_fetch_array($result)[3];
    if($role != 'admin' || $role != 'staff' || $role != 'manager')
    {
        $_SESSION['role'] = 'customer';
    } else {
        $_SESSION['role'] = $role;
    }
    echo $role;
}
?>

Моя проблема в том, что при правильном входе пользователя переменная $role остается пустой, однако, если я повторяю $_SESSION['uId'], она возвращает результат (userID), и даже если я изменю значение $_SESSION['uId'] на mysqli_fetch_array ($ result) [3] Я все еще получаю правильный результат, когда echo (роль пользователя).

Ответы [ 2 ]

2 голосов
/ 26 июня 2019

Ваша проблема в том, что вы продолжаете пытаться получить больше результатов. Каждый раз, когда вы звоните mysqli_fetch_array(), вы запрашиваете следующий ряд, но ожидаете только одного.

Вместо этого присвойте строку переменной $row и используйте ее там, где вам нужны столбцы.

Кроме того, я изменил ваши ролевые проверки, чтобы немного упростить их. Ваша текущая логика была немного неверной, так как это всегда будет клиент.

session_start();
$row =  mysqli_fetch_array($result);
$_SESSION['uId'] = $row[0];
$_SESSION['user'] = $user;
$_SESSION['pass'] = $pass;
$role = $row[3];
if (!in_array($role, ['admin', 'staff', 'manager']))
{
    $_SESSION['role'] = 'customer';
} else {
    $_SESSION['role'] = $role;
}
echo $role;

Тем не менее, вы, вероятно, можете изменить свой подход, чтобы иметь одну таблицу users и столбец, чтобы указать, какую роль они играют. Нет необходимости иметь отдельные таблицы.

Вы также должны использовать подготовленное заявление и надлежащий хэш своих паролей. См. Как использовать password_hash и Как я могу предотвратить внедрение SQL в PHP?

0 голосов
/ 26 июня 2019

Вероятно, только одна строка возвращается из запроса, и вы звоните mysqli_fetch_array дважды, поэтому второй вызов возвращает ноль.

Кстати, не должно ли это быть if($role != 'admin' && $role != 'staff' && $role != 'manager')?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...