Błąd "Podany login jest błędny." podczas próby logowania

0

Nawet jak podam prawidłowe dae logowania otrzymuję komunikat:

Podany login jest błędny.

nawet jak jest dobry a hasło jest złe. Dlaczego? Co zrobiłem nie tak?
Formularz:

<form action="user-login.php" method="post" class="center-form">
	<p>Nazwa użytkownika:
		<input type="text" name="user_login" id="a"/></p>
	<p>Hasło:
		<input type="password" name="user_pass"/></p>
	<hr>
	<button type="submit" name="loginUser">Zaloguj się</button>
</form>

Logowanie PHP:

<?php
	if(isset($_POST['loginUser'])){
	$msgError1 = 'Hasło nie zgadza się z tym w bazie.';
	$msgError2 = 'Podany login jest błędny.';
	$msgError3 = 'Pole zawiera mniej niż 4 znaki.';
									
	$userLogin = trim($_POST['user_login']);
	$userPass = trim($_POST['user_pass']);
					
	if(mb_strlen($userLogin) > 4 && mb_strlen($userPass) > 4){
		$userExists = $db->prepare("SELECT `username`, `password` FROM `members` WHERE `username` = BINARY :userLogin AND `password` = BINARY :password");
		$userExists->bindValue(":userLogin", $userLogin, PDO::PARAM_STR);
		$userExists->bindValue(":password", $userPass, PDO::PARAM_STR);
		if(!$userExists->execute()){
		    print_r($userExists->errorInfo());
		}
	if($userExists !== null && (false !== $data = $userExists->fetch())){
		if(crypt($userPass, $data['password']) == $data['password']){
			$_SESSION['logged'] = true;
			$_SESSION['user_login'] = $userLogin;
			$_SESSION['user_pass'] = $userPass;
			header('Location: '.$_SERVER['REQUEST_URI']);
		}else{
			echo '<div class="error">'.$msgError1.'</div>';
		}
	}else{
		echo '<div class="error">'.$msgError2.'</div>';
	}
}else{
	echo '<div class="error">'.$msgError3.'</div>';
}
}
?>
0

Twój kod wygląda mniej więcej tak:
user image

I właśnie dlatego nie możesz znaleźć błędu. Spróbujmy coś z tym zrobić.

Jeżeli w pliku user-login.php jest tylko logika odpowiedzialna za logowanie, to po co ten if?

if(isset($_POST['loginUser'])){
    // ...
}
$msgError1 = 'Hasło nie zgadza się z tym w bazie.';
$msgError2 = 'Podany login jest błędny.';
$msgError3 = 'Pole zawiera mniej niż 4 znaki.';

$userLogin = trim($_POST['user_login']);
$userPass = trim($_POST['user_pass']);

if(mb_strlen($userLogin) > 4 && mb_strlen($userPass) > 4){
    $userExists = $db->prepare("SELECT `username`, `password` FROM `members` WHERE `username` = BINARY :userLogin AND `password` = BINARY :password");
    $userExists->bindValue(":userLogin", $userLogin, PDO::PARAM_STR);
    $userExists->bindValue(":password", $userPass, PDO::PARAM_STR);
    if(!$userExists->execute()){
        print_r($userExists->errorInfo());
    }
    if($userExists !== null && (false !== $data = $userExists->fetch())){
        if(crypt($userPass, $data['password']) == $data['password']){
            $_SESSION['logged'] = true;
            $_SESSION['user_login'] = $userLogin;
            $_SESSION['user_pass'] = $userPass;
            header('Location: '.$_SERVER['REQUEST_URI']);
        }else{
            echo '<div class="error">'.$msgError1.'</div>';
        }
    }else{
        echo '<div class="error">'.$msgError2.'</div>';
    }
}else{
    echo '<div class="error">'.$msgError3.'</div>';
}

Wydzielmy walidację wartości wejściowych, żeby nie zaciemniały nam obrazu i żeby uniknąć zagnieżdzeń

function validateCredentials($login, $password) {
    if(mb_strlen($login) < 4) {
        return "Login zawiera mniej niż 4 znaki";
    }

    if(mb_strlen($password) < 4) {
        return "Hasło zawiera mniej niż 4 znaki";
    }
}

function redirectWithError($message) {
    header("Location: {$_SERVER['HTTP_REFERER']}?error_message=$message");
}
$msgError1 = 'Hasło nie zgadza się z tym w bazie.';
$msgError2 = 'Podany login jest błędny.';

$userLogin = trim($_POST['user_login']);
$userPass = trim($_POST['user_pass']);

$errorMessage = validateCredentials($userLogin, $userPass);

if(!empty($errorMessage)) {
    // przekierowujemy na stronę logowanie z wiadomością o błędzie
    redirectWithError($errorMessage);
}

$userExists = $db->prepare("SELECT `username`, `password` FROM `members` WHERE `username` = BINARY :userLogin AND `password` = BINARY :password");
$userExists->bindValue(":userLogin", $userLogin, PDO::PARAM_STR);
$userExists->bindValue(":password", $userPass, PDO::PARAM_STR);
if(!$userExists->execute()){
    print_r($userExists->errorInfo());
}
if($userExists !== null && (false !== $data = $userExists->fetch())){
    if(crypt($userPass, $data['password']) == $data['password']){
        $_SESSION['logged'] = true;
        $_SESSION['user_login'] = $userLogin;
        $_SESSION['user_pass'] = $userPass;
        header('Location: '.$_SERVER['REQUEST_URI']);
    }else{
        echo '<div class="error">'.$msgError1.'</div>';
    }
}else{
    echo '<div class="error">'.$msgError2.'</div>';
}

Hasła powinny być hashowane, a nie trzymane plain textem, więc musisz to poprawić, jeżeli jeszcze tego nie masz. Tak tworzymy hasło:

$plainPassword = 'test123'
password_hash($plainPassword, PASSWORD_BCRYPT, ['cost' => 10]);

Teraz trzeba to uwzględnić w twojej logice logowania:

$userLogin = trim($_POST['user_login']);
$userPass = trim($_POST['user_pass']);

$errorMessage = validateCredentials($userLogin, $userPass);

if(!empty($errorMessage)) {
    // przekierowujemy na stronę logowanie z wiadomością o błędzie
    redirectWithError($errorMessage);
}

$fetchUserStmt = $db->prepare("
  SELECT username, password 
  FROM members 
  WHERE username = :userLogin
");
// pobieramy tylko po loginie, hasło sprawdzamy później!
$fetchUserStmt->bindValue(":userLogin", $userLogin); // param str jest domyślnie
$fetchUserStmt->execute();

if(!$fetchUserStmt->execute()){
    redirectWithError("Wystąpił błąd podczas próby logowania.");
}

$user = $userExists->fetch();

if(!$user) {
    redirectWithError("Nieprawidłowy login.");
}

if(!password_verify($userPass, $user['password'])) {
    redirectWithError("Nieprawidłowe hasło.");
}

$_SESSION['logged'] = true;
$_SESSION['user_login'] = $userLogin;
$_SESSION['user_pass'] = $userPass;
header('Location: '.$_SERVER['REQUEST_URI']);

Nie ma teraz tylu zagnieżdzeń, więc łatwiej to przeczytać i znaleźć błąd.

1 użytkowników online, w tym zalogowanych: 0, gości: 1