У меня есть следующая функция, которая проверяет логин пользователя.В своем текущем состоянии он проверяет либо имя пользователя, либо адрес электронной почты, а также пароль (хеш), и, если результат совпадает с данными в БД, он возвращает некоторые значения (пожалуйста, сделайте абстракцию других переменных или функций, которые не имеют смысла, если вы не можетесм. их):
// 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);
}
Может ли кто-нибудь помочь мнес этим, потому что я не могу понять, как это сделать правильно?