Twój kod wygląda mniej więcej tak:
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.