Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][MySQL][HTML] Tworzenie sesji
wiedzma92
post
Post #1





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 17.03.2016

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/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>


Ten post edytował wiedzma92 17.03.2016, 14:05:10
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 10)
Geniesis
post
Post #2





Grupa: Zarejestrowani
Postów: 53
Pomógł: 5
Dołączył: 4.12.2013
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


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

Ten post edytował Geniesis 17.03.2016, 14:53:25
Go to the top of the page
+Quote Post
wiedzma92
post
Post #3





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 17.03.2016

Ostrzeżenie: (0%)
-----


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… :/

Ten post edytował wiedzma92 17.03.2016, 16:07:19
Go to the top of the page
+Quote Post
Geniesis
post
Post #4





Grupa: Zarejestrowani
Postów: 53
Pomógł: 5
Dołączył: 4.12.2013
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
wiedzma92
post
Post #5





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 17.03.2016

Ostrzeżenie: (0%)
-----


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ę! (IMG:style_emoticons/default/smile.gif)

Dla pełnego obrazu podrzucę kod z formularzem logowania (IMG:style_emoticons/default/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>
Go to the top of the page
+Quote Post
Geniesis
post
Post #6





Grupa: Zarejestrowani
Postów: 53
Pomógł: 5
Dołączył: 4.12.2013
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


  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

Ten post edytował Geniesis 17.03.2016, 16:51:37
Go to the top of the page
+Quote Post
wiedzma92
post
Post #7





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 17.03.2016

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Geniesis
post
Post #8





Grupa: Zarejestrowani
Postów: 53
Pomógł: 5
Dołączył: 4.12.2013
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


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"


Ten post edytował Geniesis 17.03.2016, 18:04:20
Go to the top of the page
+Quote Post
wiedzma92
post
Post #9





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 17.03.2016

Ostrzeżenie: (0%)
-----


Ech, u mnie cały czas zwraca pustą tablicę array(0) { }. Ale popracuję jeszcze nad tym, bo sporo nowych rzeczy mnie nauczyłeś (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Geniesis
post
Post #10





Grupa: Zarejestrowani
Postów: 53
Pomógł: 5
Dołączył: 4.12.2013
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
wiedzma92
post
Post #11





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 17.03.2016

Ostrzeżenie: (0%)
-----


Kiedy pisałeś ostatniego posta, udało mi się rozwiązać problem (IMG:style_emoticons/default/smile.gif) Do instrukcji warunkowej z mojego kodu, dodałam rozpoczęcie sesji i wszystko działa. Dziękuję za pomoc i cierpliwość (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.12.2025 - 17:48