Как заблокировать пользователя, если значение, выбранное из базы данных, равно 1? - PullRequest
1 голос
/ 27 января 2012

У меня есть следующая функция, которая проверяет логин пользователя.В своем текущем состоянии он проверяет либо имя пользователя, либо адрес электронной почты, а также пароль (хеш), и, если результат совпадает с данными в БД, он возвращает некоторые значения (пожалуйста, сделайте абстракцию других переменных или функций, которые не имеют смысла, если вы не можетесм. их):

// Start Checking The Login Credentials
public function checkUserLogin($username, $password) {
    $password = hash_hmac('sha512', $password, $this->salt($password));
    if(preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/i", $username)){
        $identifier = 'user_email';
    } else {
        $identifier = 'user_username';
    }
    $sql      = 'SELECT user_username,user_level FROM users WHERE '.$identifier.' = ? AND user_password = ?';
    // Check Login Attempts
    if (isset($_SESSION['attempts']) && $_SESSION['attempts'] >= NUMBER_OF_ATTEMPTS) {
        $lockdown            = true;
        $message['lockdown'] = true;
        $message['message']  = SYSTEM_LOCKDOWN_MESSAGE;
        return json_encode($message);
    } else {
        if ($stmt = $this->connect->prepare($sql)) {
            $stmt->bind_param('ss', $username, $password);
            $stmt->execute();
            $stmt->bind_result($username, $level);
            if ($stmt->fetch()) {
                $stmt->close();
                $_SESSION['member_logged_in'] = true;
                $_SESSION['username']         = $username;
                $_SESSION['level']            = $level;
                $_SESSION['attempts']         = 0;
                $ip = $this->getIP();
                $sql      = "UPDATE users SET user_last_login_date = NOW(), user_last_login_ip = '$ip' WHERE user_username = '$username'";
                if ($stmt = $this->connect->prepare($sql)) {
                    $stmt->execute();
                    $stmt->close();
                } else {
                    $error              = true;
                    $message['error']   = true;
                    $message['message'] = CANNOT_PREPARE_DATABASE_CONNECTION_MESSAGE;
                    return json_encode($message);
                }
                $message['level']             = $level;
                if( $level = 0 ) {
                    $_SESSION['standard'] = true;   
                } elseif( $level = 1 ) {
                    $_SESSION['special'] = true;
                } elseif( $level = 2 ) {
                    $_SESSION['admin'] = true;
                }
                $error                        = false;
                $message['error']             = false;
                $message['message']           = SUCCESFUL_LOGIN_MESSAGE;
                return json_encode($message);
            } else {
                @$_SESSION['attempts'] = $_SESSION['attempts'] + 1;
                $error              = true;
                $message['error']   = true;
                $message['message'] = FAILED_LOGIN_MESSAGE;
                return json_encode($message);
            }
        }
    }
}

Теперь, что я пытаюсь сделать, прежде чем возвращать значения, если учетные данные найдены в БД и совпадают, проверьте другое значение в БД с именем user_disabled, котороеможет быть либо 0, либо 1, и если значение 1 найдено, верните другое сообщение, например, This account has been disabled, и, если найдено 0, продолжите работу с остальным кодом, как это было раньше (успешноlogin).

У меня есть следующий код, который делает примерно то, что мне нужно, но когда я попытался поместить в эту публичную функцию, он не работает:

$sql = "SELECT user_disabled FROM users WHERE user_username = '$username'";
if ($stmt = $this->connect->prepare($sql)) {
    $stmt->execute();
    $stmt->bind_result($disabled);
    $stmt->fetch();
    $stmt->close();

    if($disabled = 0){

        /* Here is what should happen if the user is not blocked | The code after "$stmt->fetch()" */

    } else {
        @$_SESSION['attempts'] = $_SESSION['attempts'] + 1;
        $error              = true;
        $message['error']   = true;
        $message['message'] = 'ceva';
        return json_encode($message);
    }
} else {
    $error              = true;
    $message['error']   = true;
    $message['message'] = CANNOT_PREPARE_DATABASE_CONNECTION_MESSAGE;
    return json_encode($message);
}

Может ли кто-нибудь помочь мнес этим, потому что я не могу понять, как это сделать правильно?

1 Ответ

2 голосов
/ 27 января 2012

В строке

if($disabled = 0){

должно читаться

if($disabled == 0){
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...