Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Porównanie hasła z bazy i formularza
Forum PHP.pl > Forum > Przedszkole
MrGohut
Mam skrypt do zmiany hasła. Aby zmienić hasło trzeba wpisać obecne. Jak zrobić, aby skrypt porównywał zhashowane hasło w bazie z tym zhashowanym (przez skrypt) w formularzu ?
Próbowałem samemu ale mi to nie wychodzi ;/
  1. if ($_POST['send'] == 1) {
  2. $pass_aktualne = $_POST['pass_aktualne'];
  3. $pass = $_POST['pass'];
  4. $pass_v = $_POST['pass_v'];
  5.  
  6. $errors = ''; // Zmienna przechowująca listę błędów które wystąpiły
  7.  
  8. if (!$pass_aktualne) $errors .= '- Musisz podać swoje stare hasło jeżeli chcesz je zmienić<br />';
  9. if (!$pass || !$pass_v ) $errors .= '- Musisz podać nowe hasło i wpisać je ponownie w następne pole<br />';
  10. if ($pass != $pass_v) $errors .= '- Hasła się nie zgadzają<br />';
  11.  
  12. if ($errors != '') {
  13. echo '<p class="error">Zmiana danych nie powiodła się, popraw następujące błędy:<br />'.$errors.'</p>';
  14. }
  15. else {
  16. //$pass = user::passSalter($pass);
  17. //$pass = hash("sha256", $pass);
  18.  
  19. try {
  20. $pass_aktualne = hash("sha256", $pass_aktualne);
  21.  
  22. $pass_porownaj = $db->prepare("SELECT COUNT(*) FROM users WHERE pass=:pass");
  23. $pass_porownaj->bindValue(':pass', $pass_aktualne, PDO::PARAM_STR);
  24. $pass_porownaj->execute();
  25.  
  26. if($pass_porownaj)
  27. {
  28. if($pass_porownaj==$pass_aktualne)
  29. {
  30. $pass = hash("sha256", $pass);
  31.  
  32. $zmiana_hasla = $db->prepare("UPDATE `users` SET `pass` = :pass WHERE `id` = :id");
  33. $zmiana_hasla->bindParam(':pass', $pass, PDO::PARAM_STR);
  34. $zmiana_hasla->bindParam(':id', $id, PDO::PARAM_INT);
  35. $zmiana_hasla->execute();
  36. echo '<p class="success">Zmieniłeś hasło pomyślnie ! <br />Zaloguj się ponownie.'.header( "refresh:1;url='.$location.'" );'';
  37. }
  38. }
  39. else {
  40. echo '<p class="error">Wpisane aktualne hasło jest błędne.</p>';
  41. }
  42. }
  43. catch (PDOException $e) {
  44. echo 'Oops ! Cos poszło nie tak !<br>'.$e->getMessage();
  45. die();
  46. }
  47. //mysql_query("UPDATE `users` SET `pass` = '$pass' WHERE `id` = '$id'") or die ('<p class="error">Wystąpił błąd w zapytaniu i nie udało się zarejestrować użytkownika.</p>');
  48. //echo '<p class="success">Zmieniłeś hasło pomyślnie !';
  49. }
  50. }


od razu mówię, że w kodzie jest pewnie troche błędów ale .. ucze się dopiero biggrin.gif
Turson
Jaki konkretnie jest problem?
nospor
Przeciez Ty nigdzie z bazy nie pobierasz aktualnego hasla usera zapisane w bazie.... Nie sadzisz ze wypadaloby wpierw je pobrac, a potem porownac z tym co wpisal w formularzu? Naprawde nie potrafisz pobrac rekordu z bazy danych?
MrGohut
Cytat
Jaki konkretnie jest problem?

Nie potrafie zrobić sprawdzania zhashowanego hasła w bazie z tym co zostało wpisane w formularzu.

Przecież robie select ... nie wiem jak to inaczej moge zrobić, nie jestem wszechwiedzący, dopiero zaczynam, więc się pytam, lol.
nie wiem.
Jak bym wiedział, to pewnie bym tu nie pisał bo bym nie miał problemu.
może tak
  1. $pass_porownaj = $db->prepare("SELECT id=:id FROM users WHERE pass=:pass");
  2. $pass_porownaj->bindValue(':pass', $pass_aktualne, PDO::PARAM_STR);
  3. $pass_porownaj->bindParam(':id', $id, PDO::PARAM_INT);
  4. $pass_porownaj->execute();
  5. $haslo = $pass_porownaj->fetch();
nospor
Przeciez ja ci udzielam wskazowek. Jak bym mial cie w 4 literach to bym nic nie pisal.
Masz pobrac rekord z bazy. To powinienies umiec. Kazdy lepszy poradnik mowi jak pobrac rekord z bazy :/

przenosze na przedszkole i tam zakladaj ewentualne swoje nastepne tematy.

Turson
SELECT id=:id FROM users WHERE pass=:pass
sprawdź jak powinno wyglądać
nospor
I w WHERE ma byc sprawdzanie loginu usera a nie HASLA. Haslo porownasz potem w kodzie php
MrGohut
czyli tak
  1. $pass_porownaj = $db->prepare("SELECT id=:id FROM users WHERE login=:login");
  2. $pass_porownaj->bindParam(':login', $login, PDO::PARAM_STR);
  3. $pass_porownaj->bindParam(':id', $id, PDO::PARAM_INT);
  4. $pass_porownaj->execute();
  5. $haslo = $pass_porownaj->fetch();

i po tym porównać hasła ? też przez selecta ?
nospor
Cos ty sie uczepil tego : id=:id
Po slowie SELECT masz napisac jakie pola chcesz pobrac.

fetch() zwraca wiersz danych czyli tablice. Z tej tablicy masz pobrac interesujaca cie kolumne. Zobaczy w manualu przy fetch().
I tę kolumne masz normalnie w php IFem porownac do hasla wpisane z forma (i przepuszczone przez sha)
Turson
I czemu nie pobierasz aktualnego hasła użytkownika, jeśli właśnie o to głównie chodzi
MrGohut
Wait, czyli tak
  1. SELECT `id`, `pass` FROM `users` WHERE id=:id AND pass=:pass

questionmark.gif
wtedy pobieram pola id i pass ? Czy najpierw muszę pobrać id, aby sprawdzić uzytkownika i potem u niego pobrać pass aby porównać hasło ?
Turson
Nie widzę w Twoim pierwszym kodzie, żebyś w ogóle określił czym zmienna $id jest.

Zapytanie dobre.
Potem
  1. if($pass_aktualne===$haslo["pass"]){
  2. ok
  3. }
  4. else{
  5. nie ok
  6. }

$haslo musisz zahashowac oczywiście wcześniej lub w warunku
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.