[PHP][MySQL] zmiana hasła zalogowanego usera

Witam, rozwijam swój skrypt edytora. Powoli idzie to do przodu, ale napotkałem problem jak dla mnie nie do przejścia. Otóż mam zrobione logowanie gdzie zapamiętuję login usera w sesji i po poprawnym zalogowaniu przekierowuję go header(“Location: usermang.php”);. W tymże pliku użytkownik ma do wyboru kilka opcji w tym zmianę hasła. I powstają schody. Teoretycznie uporałem się z wyświetleniem opcji dla jednego konkretnie zalogowanego użytkownika, ale za to po kliknięciu w link “zmień hasło” efekt pracy skryptu to pusta strona. Jeśli ktoś mógłby pomóc i przynajmniej naprowadzić lub podać przykład rozwiązania tego problemu to byłbym wdzięczny

usermanag.php

<?


$wynik = mysql_query("SELECT * FROM $tbl_name") or die('Bł±d zapytania');

if(mysql_num_rows($wynik) > 0) {


while($r = mysql_fetch_assoc($wynik))

{

if($_SESSION['user'] == $r['uzytkownik'])

{

   echo"Strona główna |
Edytor podstron |
Zmień hasło |
Wyloguj";

}

    echo '

';

}

}

?>[/code]




sprawdz.php (plik odpowiadający za wyswietlenie formularza)

[code]<? if ($akcja == ‘edytuj_usera’ and !empty($uzytkownik)) { $wynik = mysql_query(“SELECT * FROM $tbl_name”) or die(‘Bł±d zapytania’); $d = mysql_fetch_row($wynik); echo ’

Użytkownik: Rola: Nowe hasło: '; } ?>

Taka uwaga odnośnie bezpieczeństwa - nie przekazuj między skryptami nazwy użytkownika - przecież ją znasz i masz zapamiętaną w sesji - jeszcze ktoś zmieni sobie linka i przez ewentualny błąd w skrypcie będzie miał możliwość podejrzenia lub edycji danych innego użytkownika.

W pliku usermanag.php masz wywołanie skryptu usermanag.php (w linku), ale w kodzie zupełnie tego nie bierzesz pod uwagę.

Zapewne zamiast wywołania usermanag.php miałoby być sprawdz.php?

Poza tym nie widzę w kodzie włączenia sesji (session_start()) - jest automatycznie włączona w konfiguracji PHP?

Włącz wyświetlanie błędów w PHP i zobacz czy coś się wyświetla.

Zamień echo ’

’ na coś co będzie się wyświetlać i zobacz czy czasem nie trafiasz w to miejsce.

Sprawdź co w danej chwili przechowują zmienne, to może pomóc: http://www.dobreprogramy.pl/slepciu/Sprawdzamy-co-kryja-zmienne-w-PHP,31008.html

No i jak napisał Pablo_Wawa upewnij się, że sesje są włączone, jeśli PHP automatycznie ich nie włącza (w domyślnej konfiguracji tego nie robi) musisz to zrobić w każdym skrypcie na samym początku wywołując session_start()

Proponuje poczytać więcej o MySQL Przeszukujesz całą tabelę by dopasować jednego użytkownika a jak tych użytkowników będzie milion?

Druga rzecz to, że nadałeś

readonly="readonly"

Nie znaczy, ze nikt tego nie będzie mógł zmodyfikować, mam nadzieję, że nie używasz tych elementów w update do bazy Trzecia rzecz używaj mysql_fetch_assoc czytelniejsze i wygodniejsze. Czwarta banalna :slight_smile: w php cudzysłów " uruchamia coś w rodzaju wyrażeń regularnych by sprawdzić czy nie ma tam zmiennych itp. Zdecydowanie szybsze i zalecane jest używanie pojedynczych ciapek :wink: ’ nie musisz wtedy robić " w HTMLu Zanim zabierzesz się za zrobienie czegoś dużego, polecam poczytać o wzorcach projektowych od MVC zaczynając, o obiektach i na koniec o framworkach do php by nie wywarzać drzwi na nowo :wink: P.S. Twój błąd to:

Zmień hasło |[/code]


chyba chciałeś mieć tam:

[code]Zmień hasło |

Wciąż nie widzisz, gdzie masz błąd (pisałem Ci już o tym) - w linku do zmiany hasła:

Zmień hasło [/code]
masz wywołanie skryptu [b]sprawdz.php[/b], w którym pewnie masz coś źle.

Poza tym wydaje mi się, że źle użyłeś wstawienia wartości zmiennej (tablicy) w tekście - nie chce mi się teraz tego sprawdzać, ale wywołanie powinno chyba mieć postać:

[code]uzytkownik=${r[‘uzytkownik’]}

  • czyli nawiasy {} po znaku $. Poza tym widzę, że używasz zmiennych globalnych - a jak nie, to zapewne masz gdzieś pobranie przesyłanych danych

    $akcja=$_GET[‘akcja’];

    $edytuj_usera=$_GET[‘edytuj_usera’];

Sugeruję być sprawdził czy do skryptu zmieniającego dane (hasło) użytkownika poprawnie przekazujesz parametry - np tym kodem:

echo '

';

print_r($_GET);

echo '

'; [/code] Poza tym w pliku sprawdz.php są błędy - co chcesz uzyskać instrukcją

[code]$wynik = mysql_query(“SELECT * FROM $tbl_name”) or die(‘Bł±d zapytania’);
? Bo tu pobierasz do zmiennej $wynik wszystkie rekordy (wiersze) z danymi o użytkownikach (a nie tylko tego jednego!). Brakuje części

WHERE = $edytuj_usera

, zawężającej pobranie danych tylko dla tego jednego użytkownika.

Poza tym nie powinieneś nazwy użytkownika pobierać z wywołania (przez link), tylko ze zmiennej sesyjnej, bo tak jak teraz masz to ktoś może wpisać dowolnego usera i dostać się do panelu (profilu) np. admina. :stuck_out_tongue:

echo '

';

print_r($_GET);

echo '

'; [/code] kod pokazuje:

[code]Array ( [akcja] => edytuj_usera [uzytkownik] => user )

czyli to, co powinien, bo aktualnie zalogowany był “user”

  • jaką zmienną muszę tą część zastąpić? takie z lekka debilne pytanie

Jeśli chodzi o fragment zapytania SQL

WHERE = $edytuj_usera

to jest nazwą pola w Twojej bazie danych (chodzi o tabelę $tbl_name) - tam gdzie pamiętasz login użytkownika, którym się w skrypcie posługujesz.

Temat do zamknięcia udało mi się ogarnąć problem. Dziękuję za rady