Witam
Tworze sobie pewną stronkę. Aktualnie pracuje nad funkcją zmiany hasła…
Witam
Tworze sobie pewną stronkę. Aktualnie pracuje nad funkcją zmiany hasła…
nie jest to dokładnie to o co pytasz, ale możesz to zrobić jednym zapytaniem:
mysqli_query($polacz,"UPDATE users SET haslo = md5('$haslo'), haslo2 = md5('$haslo') WHERE id_usera = '$id_uzyt'");
btw Tu masz chyba źle:
$haslo = htmlspecialchars(mysqli_real_escape_string($polacz,$_POST['haslo']));
$nhaslo = htmlspecialchars(mysqli_real_escape_string($polacz,$_POST['nhaslo']));
$nhaslo2 = htmlspecialchars(mysqli_real_escape_string($polacz,$_POST['nhaslo2']));
Po co ci zmienna $polacz tutaj?
Edit3
Widzę błąd
$id_uzyt to nie jest string tylko obiekt i musisz pobrać daną z tego obiektu:
np tak:
$row = mysqli_query($polacz,"SELECT id_usera FROM users WHERE login ='{$_COOKIE['login']}'");
$id_uzyt = $row['id_uzyt'];
zmiast
mysqli_query($polacz,"UPDATE users SET haslo = md5('$haslo') WHERE id_usera = '$id_uzyt'");
zrób
mysqli_query($polacz,"UPDATE users SET haslo = md5($haslo) WHERE id_usera = $id_uzyt");
albo
$pass =md5($haslo);
mysqli_query($polacz,"UPDATE users SET haslo = $pass WHERE id_usera = $id_uzyt");
MD5? Serio?
Jesli nie mam dwóch argumentów wywala błąd. Jest to zapewne związane z poleceniami ‘mysali’.
Ale razem z $polacz jest OK. Puki co udało się ominąć błąd.
Teraz kombinuje z samym updateowaniem - baza pozostaje bez zmian mimo iż na stronce ‘udało się’ zmienić . Robiłem kilka wersji, teraz wpadłem na takie coś.
$row = mysqli_query($polacz,"SELECT id_usera FROM users WHERE login ='{$_COOKIE['login']}'");
$zmn = mysqli_fetch_row($row);
Zrobiłem to w ten sposób, mysqli_fetch_row z definicji zapisuje wynik do tablicy wynikowej, ale jako że $zmn nie jest tablicą powinno poskutkować.
Moje uwagi:
zapytanie bezpośrednio w bazie działa prawidłowo?
skoro warunki są spełnione i wyświetla się komunikat, że dane zostały zmienione, to przyczyn szukaj albo w połączeniu z bazą albo w samym zapytaniu. Nie sprawdzałem, ale na pierwszy rzut oka nie pasuje mi:
mysqli_query($polacz,"UPDATE users SET haslo = $has WHERE id_usera = $id_uzyt");
raczej zrobiłbym to w taki sposób:
mysqli_query($polacz,'UPDATE users SET haslo = "'.$has.'" WHERE id_usera= '. $id_uzyt);
a jeżeli dalej nie zadziała to sprawdź co przechowuje zmienna $has.
Niestety ten sposób też nie działa.
$has - to tylko hasło z md5. Testowałem echo’em co pokaże mi hasło z bazy, hasło które podaje oraz potwierdzenie hasła. Tam wszystko się zgadza.
W przypadku rejestracji mam taki kod - wszystko działa poprawnie.
mysqli_query($polacz,"INSERT INTO users (imie,nazwisko,login,email,haslo) VALUES('$imie','$nazwisko','$login','$email',md5('$haslo'))");
Działa bez zarzutu. Połączenie jest ok, bo mogę się logować i rejestrować.
mysqli_query($polacz,"UPDATE users SET haslo = md5('$haslo') WHERE id_usera= $id_uzyt");
po pierwsze, składniowo tu jest błąd, w poście wyżej napisałem poprawne rozwiązanie, które właśnie sprawdziłem i działa, po drugie - $haslo to jest w formularzu obecne hasło (zapisane w bazie), więc on tym update’m nadpisuje te hasło, które już jest zapisane, innymi słowy, nie $haslo a $nhaslo.
mysqli_query($polacz,'UPDATE users SET haslo = "'.md5($nhaslo).'" WHERE id_usera= '. $id_uzyt);
i jak już wcześniej wspomniałem:
$loginzm = $_COOKIE['login'];
taki pomysł jest zupełnie nietrafiony.
Dzięki! Działa. Użyłem Twojego rozwiązania już wcześniej ale nie działało… ponieważ jak zauważyłeś, miałem hasło zamiast nhasło. Ciekawe jak długo walczyłem z wiatrakami o.O
powalcze z $_COOKIE[‘login’]; i już będzie to trochę lepiej funkcjonowało
Jeśli jeszcze mogę prosić, gdybyś zerknął na całość kodu - wcześniej pisałeś o bałaganie - więc prosił bym jeszcze o jakieś wskazówki, co powinienem okroić, zmienić itp
Po pierwsze, warto oddzielić warstwę prezentacji od warstwy logiki aplikacji. Jeżeli masz formularz w HTML + obsługę w PHP to robiąc dołączanie plików PHP w środku formularza + wypisywanie błędów przez funkcję robi bałagan w kodzie. Tu akurat masz w miarę prosty przykład, ale w większych projektach ciężko by było się w tym połapać.
W pliku z formularzem, na początku zrobiłbym:
<? include('_funkcje/zmiana.php') ?>
Drugą sprawą jest działanie samej tej funkcji. Funkcja powinna zwracać jakąś wartość a nie wykonywać wypisywanie błędów. To znaczy, jeżeli masz sprawdzanie błędów, powinno wyglądać to np. tak:
if($old_password != $old_db_password){
return array('error' => 1, 'code' => '1', 'msg'=> $messages['incorrect_old_password']);
}
if($new_password != $new_password2){
return array('error' => 1, 'code' => '2', 'msg'=> $messages['passwords_are_different']);
}
...
w pliku z funkcją zmiany hasła zrobiłbym również obsługę:
if(isset($_POST['change_password_form'])){
$cp = zmien($_POST);
}else{
$cp = null;
}
i potem w miejscu formularza, gdzie ma wyświetlać się komunikat błędu zrobiłbym:
<? if($cp): ?>
<p class="<?= $cp['error'] == 1 ? 'error' : 'ok' ?>"><?= $cp['msg'] ?></p>
<? endif ?>
Kolejną sprawą jest rażące w oczy wykorzystanie zmiennej globalnej $_COOKIE do sprawdzenia loginu i próby zmiany hasła. Wykorzystaj tablicę $_SESSION, po to to jest.
Następnie wykonywanie zapytań do bazy:
$zapyt = mysqli_query($polacz,"SELECT id_usera, haslo FROM users WHERE login = '$loginzm'");
znowu się uczepie tego $_COOKIE. Co w przypadku jak sobie jako wartość ciasteczka ‘login’ wpiszę coś na wzór:
testuser; drop table users;
zmieni się wóczas hasło testuser a następnie wykona się polecenie usunięcia tabeli z użytkownikami. Typowy przykład SQL Injection. Nie widzę, żeby zmienna $id_uzyt była gdzieś w jakikolwiek sposób filtrowana. Zapoznaj się z biblioteką PDO dla PHP, jest prosta i pozwala na konstruowanie zapytań poprzez bindowanie parametrów pochodzących od użytkownika i konstruowanie bezpiecznych zapytań do bazy danych.
MD5 jak ktoś wyżej wspomniał, zamieniłbym na coś mocniejszego + dodanie soli.
Buforowanie ob_start() nie sądzę, żeby Ci tu było potrzebne.
Wyrażenia regularne z eregi są przestarzałe w wersji PHP>5.3. Użyj preg_match.
Warto by to było robić w pełni obiektowo.
To chyba tyle co udało mi się wychwycić, to jest oczywiście moja koncepcja pisania kodu w tym języku i zdaję sobie sprawę, że nie każdy się ze mną musi zgadzać.
Ok, dzięki Sam problem został rozwiązany.
Teraz pobawię się w kodzie i myślę że za jakiś czas postaram się wrzucić wyniki