Operacje na sesjach

0

Cześć, tworzę aplikację mobilną w androdzie, połączona z bazą mysql, a skrypty połączenia/edycji/wyświetlania są po stronie serwera w PHP.

Potrzebuję w zakładce użytkowników wyświetlić obecnie zalogowanego użytkownika więc chyba najprościej zrobić to na zasadzie sesji.
Utworzyłem sesję podczas logowania, wygląda to następująco:

session_start();

if((isset($_POST['username'])) && (isset($_POST['password']))) {

$username = $_POST['username'];
$password = $_POST['password'];
$password = md5($password);

$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = mysqli_query($conn, $sql);
        $row = mysqli_fetch_assoc($result);
        if (mysqli_num_rows($result) == 1) {
           $_SESSION['id_user'] = $row['id'];

Na początku kodu rozpocząłem session_start(); i chce dodać id obecnie logowanego użytkownika więc zrobiłem $_SESSION['id_user'] = $row['id'];

Po czym chce tego użytkownika wyświetlić w programie, dlatego korzystam z kodu:

 $sql = "SELECT * FROM users WHERE id =  $_SESSION['id_user']";
 $result = mysqli_query($conn, $sql);
 $users = array();

W momencie, gdy po WHERE ustawiam ID na sztywno to wyświetla prawidłowo, jednak z sesji nie pobiera.
Kody logowania i wyświetlania znajdują się w innych plikach, ale w tym samym folderze.
Proszę o pomoc, gdzie robię błąd?

1

Nie przechowuj w bazie hasła tylko hasz z hasła.

Nie wklejaj bezpośrednio w zapytanie zmiennych, których wartości wprowadził użytkownik, bo to potencjalna dziura bezpieczeństwa. Użyj bind_param:


$zapytanie = "SELECT * FROM users  WHERE username = ? AND password_hash = ?";
$o_szablon_odczytu =  $db -> prepare($zapytanie);
$o_szablon_odczytu -> bind_param('ss', $username, $password_hash); 
$o_szablon_odczytu -> execute();
$o_odczyt = $o_szablon_odczytu -> get_result();

if ($o_odczyt -> num_rows > 0) {
  // zgadza się, zalogowany
} else {
  // nie zgadza się, spada na drzewo
}

Pisane z palca, nietestowane.

0

Dziękuję za wskazówkę, jednak najważniejsze dla mnie póki co to rozwiązanie kwestii pobierania aktualnie zalogowanego na podstawie sesji :D

0

@NewUser2k13: znajdował się tam również, jednak to też mi powodowało błąd. W momencie, gdy ustawie SELECT na sztywno to wyświetla prawidłowo i ten 'session_start();' mi sypał wszystko

0
$login = "";
if (isset($_SESSION['login']))  $login = $_SESSION['login'];

a zapis na odwrót:

$_SESSION['login'] = $login;
1
Syene napisał(a):

i ten 'session_start();' mi sypał wszystko

Coś mi nie działa. Nie powiem, jak nie działa i nie podam wam komunikatu błędu, zgadnijcie.

Prawdopodobnie nie umieściłeś session_start(); na początku strony jeszcze przed wysłaniem innych danych.

1

session_start() musi być w każdym pliku, gdzie chcesz korzystać z sesji - co więcej musi być na jego początku. Co to za błąd był? Skoro działa jak wpiszesz ręcznie, to pewnie zmienna sesyjna, z której korzystasz jest pusta. Daj sobie dla pewności print_r($_SESSION); w tym pliku i bedziesz wiedział czy coś tam w ogóle jest.

0

W zdjęciu przedstawienie, jaki błąd mi się pojawia w przypadku: doddania 'session_start()' w pliku wyszukiwania
screenshot-20210102151416.png

oraz kolejny, gdy dodam 'print_r("$_SESSION);'
screenshot-20210102151402.png

0

Nie znam się na Javie, ale powyższe wygląda na Javowy komunikat błędu.
Jeśli w PHP robisz backend dla apki pisanej w innym języku, to wypada otworzyć plik PHP w przeglądarce wraz z odpowiednimi parametrami i zobaczyć, jakie dane on z siebie wypluwa i ew. jakie błędy.

0

To jest na 100% komunikat błędu Javy, dlatego nie chciałem go tutaj umieszczać żeby nie mieszał. Kod Javy miałem dodatkowo sprawdzony przez programistę wiec z tej strony mam pewność, że jest wszystko w porządku. Jeżeli nawet po ustawionym ID w SELECT nie wyświetlał by bazy to wtedy byłaby też szansa, że i po stronie androida jest problem, ale to mam na pewno wykluczone.
Ten kod PHP tylko wyszukuje w bazie i przesyła do aplikacji, co ma wyświetlić więc można powiedzieć, ze ten skrypt PHP jest cześciowo back-endem.

Bazę mam zrobioną lokalnie, przez xampp

2

Przed całą sesją zrób sobie
print_r($_POST)
Zobaczysz pewnie, że to przychodzi z Twojej apki androidowej. Zamiast mieć w POST to hasło i użytkownika.

0

I w przypadku print_r($_POST) i w przypadku print_r($_SESSION) wyrzuca pustego Arraya. Users.png

1

Dobra, to może inaczej.
1 - masz sesję otwartą 2 razy. Jak includujesz plik, w którym jest otwierana sesja to nie otwieraj jej drugi raz.
2 - zrób sobie testowo formularz w PHP z 2 inputami (na usera i hasło), który będzie je przesyłał POSTem na adres Twojego logowanie. Tam podawaj na sztywno login i hasło/hash i przetestuj sobie sam skrypt PHP.
3 - żeby przestawać komunikację między apką androidową a PHP, zarówno po stronie PHP jak i androida loguj sobie jakoś odpowiedzi. Po stronie PHP możesz np. zapisywać do pliku to co wysyła android.

Jak będziesz pewien, że po stronie PHP już wszystko działa jak należy to testuj sobie już komunikację między jednym a drugim.

1 użytkowników online, w tym zalogowanych: 0, gości: 1