Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Dziwny problem z logowanie PDO
Forti
post
Post #1





Grupa: Zarejestrowani
Postów: 655
Pomógł: 73
Dołączył: 2.05.2014

Ostrzeżenie: (0%)
-----


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?)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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 (IMG:style_emoticons/default/wink.gif)

Skoro przy logowaniu pobierasz $row, to sprawdzaj czy ten $row jest poprawny a nie ilosc
Go to the top of the page
+Quote Post
Forti
post
Post #3





Grupa: Zarejestrowani
Postów: 655
Pomógł: 73
Dołączył: 2.05.2014

Ostrzeżenie: (0%)
-----


"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. }
Go to the top of the page
+Quote Post
Turson
post
Post #4





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

Ostrzeżenie: (0%)
-----


if($stmt!=0){
a nie
if($stmt->rowCount()!=0){

(IMG:style_emoticons/default/questionmark.gif)
Go to the top of the page
+Quote Post
Forti
post
Post #5





Grupa: Zarejestrowani
Postów: 655
Pomógł: 73
Dołączył: 2.05.2014

Ostrzeżenie: (0%)
-----


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ą.
Go to the top of the page
+Quote Post
Turson
post
Post #6





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

Ostrzeżenie: (0%)
-----


Wyświetl sobie przez echo zmienne $login i $pass, może hasło trzeba zakodować np. sha1 przy logowaniu bo rejestrując kodujesz?
Go to the top of the page
+Quote Post
nospor
post
Post #7





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




A czego ty robisz if ($stmt!=0){ (IMG:style_emoticons/default/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
Go to the top of the page
+Quote Post
Forti
post
Post #8





Grupa: Zarejestrowani
Postów: 655
Pomógł: 73
Dołączył: 2.05.2014

Ostrzeżenie: (0%)
-----


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

Ten post edytował Forti 9.06.2014, 18:12:23
Go to the top of the page
+Quote Post
Turson
post
Post #9





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

Ostrzeżenie: (0%)
-----


$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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 12:58