Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]PDO wyszukiwanie usera w bazie
Forum PHP.pl > Forum > Przedszkole
Boshi
Cześć, za cholerę nie mogę napisac prostego warunku sprawdzania w PDO, co innego w mysql korzystając z funkcji mysql_num_row.

Co tutaj jest źle? w tej chwili wpisując imię do formularza które jest już w bazie, nie wyświetla żadnego komunikatu. Zresztą w ogóle nie wyświetla czy jest czy nie jest.

Jak sprawdzić czy taki user jest już w bazie czy nie?
  1. $add = $conect->prepare('SELECT `id`, `imie` FROM user WHERE `imie` = :imie');
  2.  
  3. // $add=$conect->prepare('INSERT INTO uzytkownicy ( `imie`, `nazwisko`, `haslo`)
  4. // VALUES(:imie, :nazwisko, :haslo)');
  5. $add->bindValue('imie', $imie, PDO::PARAM_STR);
  6. $add->execute();
  7. if($add->fetch())
  8. {
  9. echo 'istnieje taki user';
  10.  
  11. }
  12. else 'nie istnieje taki user';
nospor
Skoro ci nie wyswietla zadnego komunikatu to:
albo w ogole nie dochodzi do tego kodu
albo masz blad, ktory powoduje przerwanie skryptu. Włącz wyswietlanie bledow a sie dowiesz
Boshi
brakuje 'echo' przy elsie dlatego nie wyświela , teraz zauważyłem.

Jednak dalej nie rozumiem jak sprawdzić czy w bazie jest taki user ? Powyższy kod niestety nie działa.
Wyswietla elsa a więc 'nie istnieje taki user' co jest oczywiście bzdurą bo takowy w bazie jest.
nospor
$row = $add->fetch();
var_dump($row);

co wyswietla?
Boshi
bool(false) , czy wpiszę w polu imię dane z bazy czy totalna bzdurę zwraca false.
nospor
Widac nie znajduje wink.gif

To lecim dalej:
var_dump($imie);
co wyswietla?
Boshi
Zwraca długość wpisanego stringa w pole imie:)

string(6) "Kacper"
nospor
No dobra, a pokaz kod jaki dales z fetch co kazalem ci dopisac. Moze wstawiles to w zlym miejscu
Boshi
Może aby było łatwiej podam cały kod. ( nie jest długi+ wyrzuciłem łączenie bo jest na pewno dobrze a szkoda rozszerzać kod tutaj) Jest sporo błędów, brak zastosowania wyrażeń regularnych itd, ale najpierw chcę nauczyć się operacji na samej bazie a potem te szczegóły sobie poprawię smile.gif

  1. <?php
  2. function przekieruj()
  3. {
  4. echo 'nie wszyskie pola zostaly wypelnione'."<br />";
  5. echo ' za 5 sekund nastąpi powrót do formularza rejestracyjnego'."<br />";
  6. header("Refresh: 5; dane_reje.html");
  7. }
  8.  
  9. function codepass($password)
  10. {
  11. return sha1(md5($password).'#!Rfdgd64'); // zakodowanie hasla algorytmem SHA1 ORAZ MD5
  12. }
  13.  
  14.  
  15. $imie= $_POST['imie'];
  16. $nazwisko= $_POST['nazwisko'];
  17. $haslo= codepass($_POST['haslo']);
  18. $haslo1=codepass($_POST['haslo1']);
  19.  
  20.  
  21. //sprawdzenie czy zmienne nie są puste
  22.  
  23.  
  24. if (empty($imie) || empty($nazwisko) || empty($haslo) || empty($haslo1) )
  25. przekieruj();
  26.  
  27. else if($haslo!=$haslo1)
  28. {
  29. echo 'podane hasla nie sa takie same'."<br />";
  30.  
  31. echo ' za 5 sekund nastąpi powrót do formularza rejestracyjnego'."<br />";
  32. header("Refresh: 5; dane_reje.html");
  33. exit;
  34. }
  35.  
  36. // sprawdzenie czy dany uzytkownik istnieje w bazie
  37. $add = $conect->prepare('SELECT `id`, `imie` FROM user WHERE `imie` = :imie');
  38.  
  39. // $add=$conect->prepare('INSERT INTO uzytkownicy ( `imie`, `nazwisko`, `haslo`)
  40. // VALUES(:imie, :nazwisko, :haslo)');
  41. $add->bindValue('imie', $imie, PDO::PARAM_STR);
  42. $add->execute();
  43.  
  44. $row = $add->fetch();
  45. var_dump($row);
  46. var_dump($imie);
  47.  
  48. {
  49. echo 'istnieje taki user';
  50.  
  51. }
  52.  
  53. else echo 'nie istnieje taki user';
  54.  
  55.  
  56.  
  57. ?>
nospor
No dobra. Wynika z tego, że nie znajduje ci usera.
Albo go nie masz w bazie
Albo się łączysz do złej bazy
Albo się w ogóle nie łączysz do bazy - nigdzie nie widze, bys gdziekolwiek tworzyl obiekt $conect
Albo masz błąd zapytania - wyswietl go sobie
Turson
$add->bindValue('imie', $imie, PDO::PARAM_STR);
piewszy parametr w bindValue() ma być taki sam jak w zapytaniu, czyli ':imie' a nie 'imie'

Boshi
Poprawiłem ":" ale to nie to oczywiście.

łącze się z dobrą bazą, nie ma błędów.

Jeżeli dobrze rozumiem to metoda fetch powinna działac jak poniżej. Czyli wykonanie jej na zmiennej 'add' powinna zwórcić jako wynik dane z tabeli. Tutaj zwraca false za każdym razem.


Może prościej będzie jak ktoś userów poda prosty kod na sprawdzenie czy coś w bazie istnieje?
  1. if($add->fetch())
  2. {
  3. echo 'istnieje taki user';
  4.  
  5. }
  6.  
  7. else echo 'nie istnieje taki user';


tutaj jeszcze owe połaczenie dla pewności:

  1. $dbname='user';
  2. $host='localhost';
  3. $user='root';
  4. $pass='';
  5.  
  6. // nazwiazanie połączenia
  7. try
  8. {
  9. $conect=new PDO('mysql:host='.$host.';dbname='.$dbname, $user, $pass );
  10. echo '<span style="color:red"><b>polaczono z baza</b></span>'."<br>";
  11.  
  12. }
  13. catch (PDOException $e) // zlapanie wyjatku i wyprowadzenie komunkatu o bledzie polaczenia
  14. {
  15. echo 'nie udalo sie nawiazac polaczenia z baza danych'."<br>". $e->getMessage();
  16. }
nospor
Sprawdziles dokladnie wszystkie rzeczy co podalem? Pokaz kod po porawkach, ktore miales zrobic, bo jakoś ci nie wierzę.
Boshi
Sprawdziłem, ale miałeś rację... nie mam pojęcia jak mogłem popełnić tak banalny błąd w zapytaniu. Chodziło oczywiście o "FROM user" a user to nazwa bazy danych, a oczywiście miało być nazwa tabeli.. ehhh
Wszystko działa jak powinno.


jeszcze jedno pytanie. Czy ":" w metodzie bindValue jest konieczne? gdzieś spotkałem się, że można to pominąć?

Dziękuję serdecznie za pomoc, czasem faktycznie warto sprawdzać zapytania smile.gif

Turson
Sprawdz czy przejdzie bez : to sie dowiesz.
Boshi
Jeżeli miało to nie przejść, to niestety, a może stety ale przeszło biggrin.gif

Przy podaniu imienia z bazy -> istnieje taki user
przy podaniu bzdur-> nie istnieje taki user



Mógłbym prosić jeszcze o pomoc z logowaniem ? Nie chcę zakładać nowego tematu.

Doszedłem do rozwiązania, że loguje sie poprawnie, ale... hasło przesyłane w formularzu nie może być kodowane np funkcją password_hash() a mianowicie
$password= password_hash($password, PASSWORD_DEFAULT); - bez tej linijki sesja działa normalnie, z nią, wyrzuca że błąd logowania (nie znajduje hasła bo login sam sprawdzałem i działa.)
Czy to oznacza, że muszę rozkodowywać jakoś to hasło czy jak ?

Kawałek skryptu (obcięte dużo fragmentów aby zaoszczędzić na czasie)

  1. $login= ($_POST['login']);
  2. $password= ($_POST['password']);
  3. // haszowanie hasła
  4. $password= password_hash($password, PASSWORD_DEFAULT);
  5.  
  6. // wyciagniecie danych login oraz haslo z bazy danych
  7. $logg=$conect->prepare("SELECT * FROM uzytkownicy WHERE login=:login && haslo=:password");
  8. $logg->bindValue(':login', $login, PDO::PARAM_STR);
  9. $logg->bindValue(':password', $password, PDO::PARAM_STR);
  10. $logg->execute();
  11.  
  12. // jezeli istnieja takie dane...
  13. if ($logg->fetch())
  14. {
  15. echo 'zalogowales sie poprawnie';
  16. $_SESSION['login']=$login;
  17. $_SESSION['auth']=TRUE;
  18.  
  19. }
  20. else
  21. {
  22. echo 'blad podczas logowania do systemu'."<br>";
  23. }



I jeszcze miałbym prośbę. Czy taki skrypt logowania jest akutalny na dziś ? tzn dalej wszystko bazuje na sesjach?
nospor
Jesli przy logowaniu sprawdzasz hash z hasla, to i rejestrujac usera, masz do bazy wrzucac hash z hasla... to chyba logiczne. Nie mozesz podczas rejestracji wrzucac do bazy hasla jawnego a podczas logowania w bazie szukac hasła zahashowanego... przeciez to nie ma sensu...
Boshi
No tak to jest logiczne, ale powiedz mi jak mam porównać hash z logowania z hashem z bazy danych? wyprintowałem sobie hash logowania gdzie hasło odpowiada temu z bazy i się różnią sporo między sobą.

Hash z bazy
  1. $2y$10$jG6xksRgtAC/eCW1RF8S1eR2b/QEoThEu0o3XMFqmyB...


hash logowania
  1. $2y$10$aiun8XlhYrGgWUjK/tNZwO9MOmN8VFNXNdWfVzaHoMAIRwkwxZ4Vu
nospor
Nie sądzisz, że logicznym jest sprawdzenie skryptu rejestracji, gdyz to tam wlasnie prawdopodobnie wstawiasz ten hash do bazy?
Boshi
Wybacz ale nie za bardzo rozumiem.
Wg logiki to ma działać tak;

1 user się rejestruje-podaje hasło, skrypt przetwarza dane i hashuje hasło odpowiednim algorytmem
2 skrypt wrzuca do bazy zahashowane hasło
3 user się loguje- hash hasła które podaje user musi być identyczne jak w bazie

i przy 3 punkcie nie bardzo rozumiem jak to w skrypcie rejestracji poprawić?
untorched
Jak w trzecim? Przecież nospor miał niewątpliwie na myśli, aby sprawdzić poprawność metody szyfrującej w rejestracji(twój punkt pierwszy). Skoro podczas rejestracji szyfrowanie hasła daje inny wynik niż podczas szyfrowania przesłanego hasła podczas logowania, oznacz to błąd w metodzie szyfrowania(sól etc).
Boshi
Tak to rozumiem, bo trzeba porównywać generowany hash przecież. Tylko dlaczego ten hash jest inny? sprawdziłem dla pewności czy skrypt jest ok, hashowanie metodą md5(tak wiem, metoda niezbyt bezpieczna na dzisiejsze czasy) no i się okazało, że hash generowany podczas rejestracji oraz logowania jest taki sam, więc loguje normalnie. Dlaczego więc funkcja
  1. password_hash($password, PASSWORD_DEFAULT);
generuje dwa inne hashe? Jakim cudem?

Pyton_000
Bo tak to działa. Tak ma być.
Do weryfikacji używa się password_verify
Boshi
Dziękuję w takim razie za pomoc wszysktim smile.gif
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.