Witam
Cały swój projekt zmieniam na biblioteki PDO (dużo roboty z tym mam) i często wyskakują mi błędy. Generalnie z wszystkim sobie radzę, ale nad systemem logowania siedze od godziny i już brakuje mi pomysłów. Skrypt jest od turson (turson.pl).
Rejestracja działą prawidłowo, wszystko zapisuje do bazy itp.
plik config jest require w index.php, tam natomiast include rejestracja i logowanie. (rejestracja działa, jak już pisałem)
<?PHP
//Formularz rejestracji
function form(){
<form method="post" action="">
<label for="login">Login:</label>
<input maxlength="32" type="text" name="login" id="login" />
<label for="pass">Hasło:</label>
<input maxlength="32" type="password" name="password" id="pass" />
<label for="pass_again">Hasło (ponownie):</label>
<input maxlength="32" type="password" name="password2" id="pass_again" />
<label for="email">Email:</label>
<input type="text" name="email" maxlength="50" id="email" />
<label for="email_again">Podaj swój Battle.tag: (nie wymagane)</label>
<input type="text" maxlength="255" name="battle" id="btag" />#<input type="text" maxlength="255" name="tag" id="btag" /><br />
<input type="submit" name="wyslano" value="Zarejestruj" />
</form>
';
}
if(isset($_POST['wyslano'])){ //Sprawdzamy, czy submit został wciśnięty //Usuwamy białe znaki z przesłanych danych
$login = trim($_POST['login']); $password = trim($_POST['password']); $password2 = trim($_POST['password2']); $email = trim($_POST['email']); $battle = trim($_POST['battle']); $tag = trim($_POST['tag']);
$errors = NULL; //Tworzymy zmienną przechowująca ewentualne błędy
//Sprawdzamy, czy przesłane dane mają odpowiednią ilość znaków
if(strlen($login)<3
) $errors .= 'Login musi zawierać co najmniej 3 znaki<br>'; if(strlen($password)<6
) $errors .= 'Hasło musi zawierać co najmniej 6 znaków<br>'; if($password!==$password2) $errors .= 'Hasła nie są takie same<br>';
if(!preg_match('/\@/', $email) || strlen($email)<5
) $errors .= 'Podany adres e-mail jest nieprawidłowy<br>';
//Sprawdzamy czy użytkownik o takim samym loginie już nie istnieje
$stmt = $baza->prepare("SELECT COUNT(id) FROM users WHERE login=:login");
$stmt->bindValue(":login", $login, PDO::PARAM_STR);
$stmt->execute();
$row = $stmt->fetch();
if($row[0]>0) $errors .= 'Konto o takim loginie już istnieje<br>';
//Sprawdzamy czy użytkownik o takim samym adresie e-mail już nie istnieje
$stmt2 = $baza->prepare("SELECT COUNT(id) FROM users WHERE email=:email");
$stmt2->bindValue(":email", $email, PDO::PARAM_STR);
$stmt2->execute();
$row2 = $stmt2->fetch();
if($row2[0]>0) $errors .= 'Konto o takim adresie e-mail już istnieje<br>';
if(empty($errors)){ //Jeśli nie ma błędów, rejestrujemy użytkownika $password = sha1($password); //kodujemy hasło
$dodaj = $baza->prepare("INSERT INTO users (login, pass, email, date, battle, tag) VALUES(:login, :password, :email, NOW(), :battle, :tag)");
$dodaj->bindValue(":login", $login, PDO::PARAM_STR);
$dodaj->bindValue(":password", $password, PDO::PARAM_STR);
$dodaj->bindValue(":email", $email, PDO::PARAM_STR);
$dodaj->bindValue(":battle", $battle, PDO::PARAM_STR);
$dodaj->bindValue(":tag", $tag, PDO::PARAM_STR);
$dodaj->execute();
echo "Zarejestrowałeś się. Możesz się teraz <a href=\"login.php\">zalogować</a>"; }
else{
echo '<div style="color:red">'.$errors.'</div>'; form(); //Wyświetlamy formularz
}
}
else form();
?>
A o to logowanie:
<?PHP
//Formularz logowania
function form(){
<form action="" method="post">
<label for="login">Login</label>
<input type="text" name="login" required>
<br>
<label for="password">Hasło</label>
<input type="password" name="pass" required>
<br>
<input type="submit" name="wyslano" value="Zaloguj się"/>
</form>
';
}
if(isset($_POST['wyslano'])){ //Sprawdzamy, czy submit został wciśnięty //Usuwamy białe znaki z przesłanych danych
$login = trim($_POST['login']); $pass = trim($_POST['pass']);
//Kodujemy hasło - przy rejestracji również je zakodowaliśmy, wiec przy porównywaniu musi być zakodowane
$pass = sha1($pass);
//Sprawdzamy czy użytkownik o podanych danych istnieje
$stmt = $baza->prepare("SELECT login, pass FROM users WHERE login=:login AND pass=:pass");
$stmt->bindValue(":login", $login, PDO::PARAM_STR);
$stmt->bindValue(":pass", $pass, PDO::PARAM_STR);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if($stmt->rowCount()!=0){
/*
* Tworzymy sesję dla zalogowanego uzytkownika z:
* - informacja, ze uzytkownik jest zalogowany
* - jego id
*/
$_SESSION['logged'] = true;
$_SESSION['user_id'] = $row['id'];
}
else{
echo '<div style="color:red">Login i/lub hasło są nieprawidłowe</div>'; form();
}
}
else form();
?>
Problem: po wpisaniu login i pass pokazuje Login i/lub hasło są nieprawidłowe.
Tak, tak, ale sytuacja taka, że login i hasło są na 100% prawidłowe. Założyłem już 11 kont i wszędzie ten sam problem. Już nie wiem na co patrzeć...
Struktura bazy danych:
users
id - login - pass - email - date - battle - tag - grupa (interesuje nas przy logowaniu tylko login i pass, prawda?)