Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL][HTML] Tworzenie sesji
Forum PHP.pl > Forum > Przedszkole
wiedzma92
Witam. Od kilku tygodni bawię się w programowanie i chyba porwałam się z motyką na Słońce. Stworzyłam formularz logowania, który działa bez zarzutu, teraz chcę napisać kod, który po zalogowaniu utworzy sesję z ID użytkownika i na jej podstawie przeprowadzi proces autoryzacji usera, znajdującego się w bazie MySQL. Niestety, za nic mi to nie wychodzi...

W skrypcie jest na pewno masa błędów, ale wierzę, że ktoś z szanownych kolegów i koleżanek forumowych wyjaśni mi, co mam zrobić, żeby było dobrze smile.gif

  1. <?php
  2. $id = $_SESSION['id'];
  3. $wylogowanie = $_POST['wylogowanie'];
  4.  
  5. include('baza_MySQL.php');
  6. $zapytanie = $mysql->prepare("SELECT * FROM uzytkownicy WHERE id = :id");
  7. $zapytanie->bindValue(':id', $id, PDO::PARAM_INT);
  8. $zapytanie->execute();
  9. $uzytkownik = $zapytanie->fetch();
  10.  
  11. echo 'Jesteś zalogowany. ID: '.$uzytkownik.'<br>';
  12. ?>
  13.  
  14. <!DOCTYPE html>
  15. <html>
  16. <head>
  17. <title>Wyloguj</title>
  18. <meta charset="utf-8">
  19. </head>
  20. <body>
  21.  
  22. <?php
  23. if (isset($_POST['wylogowanie'])) {
  24. header('Location: logowanie.php');
  25. }
  26. ?>
  27.  
  28. <form method="post" action="">
  29. <input type="submit" id="wylogowanie" name="wylogowanie" value="Wyloguj"></input>
  30. </form>
  31.  
  32. </body>
  33. </html>
Geniesis
Witam, całość wygląda dosyć niekompletnie i nie logicznie jeżeli dobrze zrozumiałem Twoje intencje,
1)Przed logowaniem powinno zostać sprawdzone czy użytkownik już nie jest zalogowany
a) jest -> nie można wejść na stronę z formularzem
-przekierowanie
-opcjonalnie komunikat błędu
b)nie jest -> pojawia się formularz
-wyświetlanie formularza
-po wciśnięciu "submit"
=validacja danych
=polecenie SELECT id, username, password FROM db_name.table_name u WHERE u.username=:username AND u.password=:password LIMIT 1 (oczywiście wszystko bindowane!)
*jeżeli zwróci puste to błąd logowania (nie prawidłowe dane)
*jeżeli zwróci wynik to przechodzi dalej
= ustawienie sesji (id, username)

2)Przed wylogowaniem powinno zostać sprawdzone czy użytkownik już jest zalogowany
a) nie jest -> nie można wejść na stronę z formularzem
-przekierowanie
-opcjonalnie komunikat błędu
b)jest -> pojawia się przycisk
-po naciśnięciu usunięcie sesji użytkownika
-przekierowanie
wiedzma92
W skrócie chodzi mi o to, żeby po przekierowaniu z formularza logowania do strony z wylogowaniem (kod, który wrzuciłam), pokazało mi się ID użytkownika, który się zalogował. Dodam tylko, że formularzem logowania jest wszystko okej i kiedy wprowadzam prawidłowe dane z bazy MySQL (login, hasło), loguję się i zostaję przekierowana na stronę wylogowanie.php. Szkopuł w tym, że nie widzę ID zalogowanego użytkownika… :/
Geniesis
W miejscu gdzie sprawdzasz czy dane są poprawne (moment logowania) leci zapytanie do bazy danych (w końcu musisz skąś wiedzieć czy dane są ok), w SELECT dodaj 'id', i nadpisz wtedy sesję $_SESSION['id'] = $userIdFromDb, wtedy powinnaś mieć dostęp do owego id.
Zmienna $userIdFromDb to id wyniku z bazy danych.

Nie wiem co dokładnie się dzieje podczas logowania (przed kodem, który podałaś), więc to trochę wróżenie z fusów.

Dodam, że nie powinno mieszać się FRONT endu z BACK end'em, tak więc kod PHP powinien być w osobnym pliku.
wiedzma92
Cytat(Geniesis @ 17.03.2016, 16:21:29 ) *
Dodam, że nie powinno mieszać się FRONT endu z BACK end'em, tak więc kod PHP powinien być w osobnym pliku.

Dzięki za radę! smile.gif

Dla pełnego obrazu podrzucę kod z formularzem logowania smile.gif
  1. <?php
  2. $login = strip_tags($_POST['login']);
  3. $haslo = strip_tags($_POST['haslo']);
  4. ?>
  5. <!DOCTYPE html>
  6. <html lang="pl">
  7. <head>
  8. <meta charset="utf-8">
  9. <title>Logowanie</title>
  10. </head>
  11. <body>
  12. <?php include('baza_MySQL.php');
  13. $zapytanie = $mysql->prepare("SELECT * FROM uzytkownicy WHERE login = :login && haslo = :haslo");
  14. $zapytanie->bindValue(':login', $login, PDO::PARAM_STR);
  15. $zapytanie->bindValue(':haslo', $haslo, PDO::PARAM_STR);
  16. $zapytanie->execute();
  17. $uzytkownik = $zapytanie->fetchALL();
  18.  
  19. if (count($uzytkownik) > 0) {
  20. header('Location: wylogowanie.php');
  21. } else {
  22. echo 'Nieprawidłowe dane logowania';
  23. }
  24. ?>
  25.  
  26. <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
  27.  
  28. <div class="required field">
  29. <label>Login</label>
  30. <input type="text" name="login" id="login" value="">
  31. </div>
  32.  
  33. <div class="required field">
  34. <label>Hasło</label>
  35. <input type="text" name="haslo" id="haslo" value="">
  36. </div>
  37. <input type="submit" id="send" name="send" value="Wyślij"></input>
  38. </form>
  39. </body>
  40. </html>
Geniesis
  1. if (count($uzytkownik) > 0) {
  2. $_SESSION['id'] = $użytkownik[0]['id']; // coś w ten deseń, nie pamiętam 1:1 jaką strukturę wynikową zapytanie daje ew. $użytkownik[0]->id
  3. header('Location: wylogowanie.php');
  4. }
  5.  



Dodam, że input z hasłem powinien mieć type="password", hasło powinno być potrakowane najlepiej md5
  1. $password = md5($_POST['password']);

Podczas rejestracji tak samo zapisywane w bazie z użyciem md5.

Edit:
pierdoła: jezeli się tego trzymać to zrobiłbym raczej warunek:
  1. if(isset($_POST['send'])) {
  2. // wykonaj cały kod
  3. }


Edit2:
jeżeli nie znasz standardów:
https://github.com/php-fig/fig-standards/tr...master/accepted
wiedzma92
Chyba jestem jakaś ograniczona… Wstawiam ten fragment kodu i nic, wciąż przekierowuje mnie do stronki z przyciskiem „Wyloguj“, nie pokazując ID użytkownika.

  1. if (count($uzytkownik) > 0) {
  2. $_SESSION['id'] = $uzytkownik[0]['id'];
  3. header('Location: wylogowanie.php');
  4. }


BTW Dzięki za wszystkie rady smile.gif
Geniesis
Po przekierowaniu na stronę wylogowanie.php próbowałaś użyć var_dump() na $_SESSION? Zwróciło Ci to dane czy pustą zmienną?

Zrobiłem króciutki skrypt na podstawie Twojego:
  1. ini_set("display_errors", 1);
  2. require_once('db.php');
  3. if(isset($_POST['submit'])) {
  4. $db = new ConnectionSQL(); //
  5. $conn = $db->connectWithDb(); // dane do połączenia
  6. $stmt = $conn -> prepare('SELECT * FROM user WHERE `username`=:u AND `password`=:te_emitikontki LIMIT 1');
  7. $stmt->bindValue(':u', $_POST['u'], PDO::PARAM_STR);
  8. //pomijam md5()
  9. $stmt->bindValue(':te_emitikontki', $_POST['p'], PDO::PARAM_STR);
  10. $stmt->execute();
  11. $resultDb = $stmt ->fetchAll(PDO::FETCH_ASSOC);
  12. if (count($resultDb) > 0) {
  13. $_SESSION['id'] = $resultDb[0]['id']; // ustawiam dane do sesji
  14. header('Location: wylogowanie.php');
  15. } else {
  16. echo 'Nieprawidłowe dane logowania';
  17. }
  18.  
  19. }
  20. ?>
  21. <!DOCTYPE html>
  22. <html>
  23. <head>
  24. <title></title>
  25. </head>
  26. <body>
  27. <form method="POST">
  28. <input type="text" name="u">
  29. <input type="password" name="p">
  30. <button name="submit" type="submit">sub</button>
  31. </body>
  32. </html>

wylogowanie.php
  1. <?php
  2. var_dump($_SESSION); //wyświetla ["id"]=> string(2) "moje id z bazy"
wiedzma92
Ech, u mnie cały czas zwraca pustą tablicę array(0) { }. Ale popracuję jeszcze nad tym, bo sporo nowych rzeczy mnie nauczyłeś smile.gif
Geniesis
Ustaw testową zmienną sesyjną przed przekierowaniem np. $_SESSION['test'] = 'test'; i w wylogowanie.php sprawdź czy się pojawi, jeżeli tak to niepoprawnie deklarujesz obecnie sesję, jeżeli zwróci pustą to trzeba będzie pomyśleć dalej.
wiedzma92
Kiedy pisałeś ostatniego posta, udało mi się rozwiązać problem smile.gif Do instrukcji warunkowej z mojego kodu, dodałam rozpoczęcie sesji i wszystko działa. Dziękuję za pomoc i cierpliwość 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.