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(){ echo ' <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> '; } //Usuwamy białe znaki z przesłanych danych $errors = NULL; //Tworzymy zmienną przechowująca ewentualne błędy //Sprawdzamy, czy przesłane dane mają odpowiednią ilość znaków 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>'; $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(); } else{ form(); //Wyświetlamy formularz } } else form(); ?>
A o to logowanie:
<?PHP //Formularz logowania function form(){ echo ' <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> '; } //Usuwamy białe znaki z przesłanych danych //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{ 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?)