Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Dziwny problem z logowanie PDO
Forum PHP.pl > Forum > Przedszkole
Forti
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)

  1. <?PHP
  2. //Formularz rejestracji
  3. function form(){
  4. echo '
  5. <form method="post" action="">
  6. <label for="login">Login:</label>
  7. <input maxlength="32" type="text" name="login" id="login" />
  8.  
  9. <label for="pass">Hasło:</label>
  10. <input maxlength="32" type="password" name="password" id="pass" />
  11.  
  12. <label for="pass_again">Hasło (ponownie):</label>
  13. <input maxlength="32" type="password" name="password2" id="pass_again" />
  14.  
  15. <label for="email">Email:</label>
  16. <input type="text" name="email" maxlength="50" id="email" />
  17.  
  18. <label for="email_again">Podaj swój Battle.tag: (nie wymagane)</label>
  19. <input type="text" maxlength="255" name="battle" id="btag" />#<input type="text" maxlength="255" name="tag" id="btag" /><br />
  20.  
  21.  
  22. <input type="submit" name="wyslano" value="Zarejestruj" />
  23. </form>
  24.  
  25. ';
  26. }
  27.  
  28.  
  29. if(isset($_POST['wyslano'])){ //Sprawdzamy, czy submit został wciśnięty
  30. //Usuwamy białe znaki z przesłanych danych
  31. $login = trim($_POST['login']);
  32. $password = trim($_POST['password']);
  33. $password2 = trim($_POST['password2']);
  34. $email = trim($_POST['email']);
  35. $battle = trim($_POST['battle']);
  36. $tag = trim($_POST['tag']);
  37.  
  38. $errors = NULL; //Tworzymy zmienną przechowująca ewentualne błędy
  39.  
  40. //Sprawdzamy, czy przesłane dane mają odpowiednią ilość znaków
  41. if(strlen($login)<3) $errors .= 'Login musi zawierać co najmniej 3 znaki<br>';
  42. if(strlen($password)<6) $errors .= 'Hasło musi zawierać co najmniej 6 znaków<br>';
  43. if($password!==$password2) $errors .= 'Hasła nie są takie same<br>';
  44. if(!preg_match('/\@/', $email) || strlen($email)<5) $errors .= 'Podany adres e-mail jest nieprawidłowy<br>';
  45.  
  46. //Sprawdzamy czy użytkownik o takim samym loginie już nie istnieje
  47. $stmt = $baza->prepare("SELECT COUNT(id) FROM users WHERE login=:login");
  48. $stmt->bindValue(":login", $login, PDO::PARAM_STR);
  49. $stmt->execute();
  50. $row = $stmt->fetch();
  51. if($row[0]>0) $errors .= 'Konto o takim loginie już istnieje<br>';
  52.  
  53. //Sprawdzamy czy użytkownik o takim samym adresie e-mail już nie istnieje
  54. $stmt2 = $baza->prepare("SELECT COUNT(id) FROM users WHERE email=:email");
  55. $stmt2->bindValue(":email", $email, PDO::PARAM_STR);
  56. $stmt2->execute();
  57. $row2 = $stmt2->fetch();
  58. if($row2[0]>0) $errors .= 'Konto o takim adresie e-mail już istnieje<br>';
  59.  
  60. if(empty($errors)){ //Jeśli nie ma błędów, rejestrujemy użytkownika
  61. $password = sha1($password); //kodujemy hasło
  62. $dodaj = $baza->prepare("INSERT INTO users (login, pass, email, date, battle, tag) VALUES(:login, :password, :email, NOW(), :battle, :tag)");
  63. $dodaj->bindValue(":login", $login, PDO::PARAM_STR);
  64. $dodaj->bindValue(":password", $password, PDO::PARAM_STR);
  65. $dodaj->bindValue(":email", $email, PDO::PARAM_STR);
  66. $dodaj->bindValue(":battle", $battle, PDO::PARAM_STR);
  67. $dodaj->bindValue(":tag", $tag, PDO::PARAM_STR);
  68. $dodaj->execute();
  69. echo "Zarejestrowałeś się. Możesz się teraz <a href=\"login.php\">zalogować</a>";
  70. }
  71. else{
  72. echo '<div style="color:red">'.$errors.'</div>';
  73. form(); //Wyświetlamy formularz
  74. }
  75. }
  76. else form();
  77. ?>


A o to logowanie:

  1. <?PHP
  2. //Formularz logowania
  3. function form(){
  4. echo '
  5. <form action="" method="post">
  6. <label for="login">Login</label>
  7. <input type="text" name="login" required>
  8. <br>
  9. <label for="password">Hasło</label>
  10. <input type="password" name="pass" required>
  11. <br>
  12. <input type="submit" name="wyslano" value="Zaloguj się"/>
  13. </form>
  14. ';
  15. }
  16.  
  17. if(isset($_POST['wyslano'])){ //Sprawdzamy, czy submit został wciśnięty
  18. //Usuwamy białe znaki z przesłanych danych
  19. $login = trim($_POST['login']);
  20. $pass = trim($_POST['pass']);
  21.  
  22. //Kodujemy hasło - przy rejestracji również je zakodowaliśmy, wiec przy porównywaniu musi być zakodowane
  23. $pass = sha1($pass);
  24.  
  25.  
  26. //Sprawdzamy czy użytkownik o podanych danych istnieje
  27. $stmt = $baza->prepare("SELECT login, pass FROM users WHERE login=:login AND pass=:pass");
  28. $stmt->bindValue(":login", $login, PDO::PARAM_STR);
  29. $stmt->bindValue(":pass", $pass, PDO::PARAM_STR);
  30. $stmt->execute();
  31. $row = $stmt->fetch(PDO::FETCH_ASSOC);
  32. if($stmt->rowCount()!=0){
  33. echo "Zalogowałeś się!";
  34. /*
  35.   * Tworzymy sesję dla zalogowanego uzytkownika z:
  36.   * - informacja, ze uzytkownik jest zalogowany
  37.   * - jego id
  38.   */
  39. $_SESSION['logged'] = true;
  40. $_SESSION['user_id'] = $row['id'];
  41.  
  42. }
  43. else{
  44. echo '<div style="color:red">Login i/lub hasło są nieprawidłowe</div>';
  45. form();
  46. }
  47. }
  48. else form();
  49. ?>



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?)
nospor
http://pl1.php.net/manual/en/pdostatement.rowcount.php

Cytat
PDOStatement::rowCount() returns the number of rows affected by the last DELETE, INSERT, or UPDATE statement executed by the corresponding PDOStatement object.

If the last SQL statement executed by the associated PDOStatement was a SELECT statement, some databases may return the number of rows returned by that statement. However, this behaviour is not guaranteed for all databases and should not be relied on for portable applications.

No, i tyle w temacie wink.gif

Skoro przy logowaniu pobierasz $row, to sprawdzaj czy ten $row jest poprawny a nie ilosc
Forti
"najprostsze rozwiązania są najlepsze"

dzięki za rozwiązanie, działa. Nie wiem czemu tego nie zauważyłem.

Jeszcze coś mi nie wychodzi, obojętnie jaki user / pass to i tak loguje. Z tym sprawdzeniem $row coś źle kombinuje.

  1. $stmt = $baza->prepare("SELECT login, pass FROM smf_members WHERE login=:login AND pass=:pass");
  2. $stmt->bindValue(":login", $login, PDO::PARAM_STR);
  3. $stmt->bindValue(":pass", $pass, PDO::PARAM_STR);
  4. $stmt->execute();
  5. $row = $stmt->fetch(PDO::FETCH_ASSOC);
  6. if($stmt!=0){
  7. echo "Zalogowałeś się!";
  8. /*
  9.   * Tworzymy sesję dla zalogowanego uzytkownika z:
  10.   * - informacja, ze uzytkownik jest zalogowany
  11.   * - jego id
  12.   */
  13. $_SESSION['logged'] = true;
  14. $_SESSION['user_id'] = $row['id'];
  15.  
  16. }
  17. else{
  18. echo '<div style="color:red">Login i/lub hasło są nieprawidłowe</div>';
  19. form();
  20. }
Turson
if($stmt!=0){
a nie
if($stmt->rowCount()!=0){

questionmark.gif
Forti
if($stmt->rowCount()!=0){

cały czas pokazuje nieprawidłowy user / pass, a jest prawidłowe na 100%. Widać mam coś z bazą źle lub rejestracją.
Turson
Wyświetl sobie przez echo zmienne $login i $pass, może hasło trzeba zakodować np. sha1 przy logowaniu bo rejestrując kodujesz?
nospor
A czego ty robisz if ($stmt!=0){ questionmark.gif
Przeciez wyraznie ci mowilem ze masz sprawdzac $row.... czy ja po chinsku pisze? $stmt zawsze jest true, nawet jak nie znajdzie rekordu.... to rekord/$row masz sprawdzac
Forti
Działą tylko z if($stmt->rowCount()!=0){, warunku na $row coś mi nie wychodziło...

Okazało się, że problemem jest baza danych, pole na hasło miało maksymalnie 32 znaki, podczas kiedy kodowanie wymagało ich więcej.

Można zamknąć


edit: rozwiązane
Turson
$nurl->Url('log=profil?id='.$_SESSION['tutaj_problem_mam'].'')
jaki problem?
Jeżeli w logowaniu zapisałeś id usera:
$_SESSION['user_id'] = $row['id'];
to powinieneś wiedzieć co wstawić

nie wiem jak kopiujesz gotowce, że pominąłeś session_start na stronie głównej.

Cytat
W internecie znalazłem gotowe skrypty na mysqli, na mysql_query, jednak ja korzystam z PDO i niby nie powinienem mieć problemu, ale jednak go mam..

Czy to mysql, czy mysqli czy pdo to zapytania niczym sie nie roznia.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.