Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL]Nie mogę uruchomić sesji
Forum PHP.pl > Forum > Przedszkole
Fakebook
Witam

Utknałem tym razem w momencie gdy chcę zalogować się do bazy danych.

Plik loginform.inc.php zawiera formularz i sprawdza poprawność danych (i działa poprawnie, bo po podaniu odpowiedniego hasła i loginu wyświetla się właściwy rząd w tabeli), natomiast za diabła nie wiem dlaczego nie mogę odpalić sesji. Kod ma wg opisu albo wyswietlic 'You are logged in' po podaniu poprawnych danych, albo wyswietlic ponownie formularz logowania, i wygląda tak:
  1.  
  2. require 'connect.inc.php';
  3.  
  4. if (isset($_SESSION['user_id']) && !empty($_SESSION['user_id'])) {
  5. echo 'You are logged in';
  6. } else {
  7.  
  8. include 'loginform.inc.php';
  9. }

a tu jeszcze fragment pliku loginform.inc.php z przypisanym id sesji:
  1. if ($query_num_rows==1) {
  2. $user_id = mysql_result($query_run, 0, 'id');
  3. $_SESSION['user_id'] = $user_id;
  4. header('Location: index.php');

Rezultat jest taki, że wpisanie odpowiedniego loginu i hasła wyświetla ponownie formularz logowania, a nie komunikat 'you are logged in'.

Troche eksperymentowalem, wywaliłem loginform.inc.php poza warunek if:
  1. $current_file = $_SERVER['SCRIPT_NAME'];
  2.  
  3. require 'connect.inc.php';
  4.  
  5. include 'loginform.inc.php';
  6.  
  7. if (isset($_SESSION['user_id']) && !empty($_SESSION['user_id'])) {
  8. echo 'You are logged in';
  9. } else {
  10. echo 'try again';
  11. }

I zadzialalo, tzn po zalogowaniu sie dostaje prawidlowy komunikat.

Z tym ze w tutorialu jest tak jak w pierwszym przykładzie, i nie mam pojęcia dlaczego na filmiku działało a u mnie nie. Tutorial jest z 2011 roku, czy jest możliwość że zmieniła się struktura php i dlatego u mnie nie zadziałało?

Pozdrawiam
Kshyhoo
Pomyśl logicznie, Twój warunek: jeżeli istnieje $_SESSION['user_id'] i jest "pusta" $_SESSION['user_id'] to zalogowany a jak nie, to dołącz plik, gdzie te dane wrzucam...
Fakebook
Cytat(Kshyhoo @ 23.03.2014, 13:57:05 ) *
Pomyśl logicznie, Twój warunek: jeżeli istnieje $_SESSION['user_id'] i jest "pusta" $_SESSION['user_id'] to zalogowany a jak nie, to dołącz plik, gdzie te dane wrzucam...



tam jest !empty, czyli NIE jest pusta
Kshyhoo
No tak, miało być "nie pusta".
Fakebook
Dzięki, ale to są chyba warunki które się nie wykluczają, zresztą też próbowałem wcześniej (w akcie depseracji probowalem wszystkiego smile.gif ) i tez nie zadzialalo. Dla pewnosci teraz ununałem !empty i efekt taki sam jak poprzednio niestety, czyli nie wyswietla sie komunikat ze jestem zalogowany, ani tez 'try again'.:

  1. <?php
  2. $current_file = $_SERVER['SCRIPT_NAME'];
  3.  
  4. require 'connect.inc.php';
  5.  
  6. if (isset($_SESSION['user_id'])) {
  7. echo 'You are logged in';
  8. } else {
  9. echo 'try again';
  10. include 'loginform.inc.php';
  11. }
  12. ?>
Damonsson
Warunek jest dobry, nie słuchaj głupot. Musiałbyś pokazać więcej kodu. Ale skoro przeniosłeś include i działa, to w czym jeszcze problem?
trueblue
A gdzie wyłączasz buforowanie rozpoczęte poprzez ob_start();?
Fakebook
Cytat(Damonsson @ 23.03.2014, 14:52:59 ) *
Warunek jest dobry, nie słuchaj głupot. Musiałbyś pokazać więcej kodu. Ale skoro przeniosłeś include i działa, to w czym jeszcze problem?


Problem w tym że chciałbym aby formularz zniknął po zalogowaniu, to po 1., po drugie chciałbym zrozumieć dlaczego, skoro obydwa warunki są dobre, nie wyświetla mi się głupie echo (w procesie uczenia staram się zrozumieć jak coś działa, a nie napisać kod i modlić się żeby się udało jak nie ręką to młotkiem)

Nie wiem czy to pomoże, ale kod formularza wygląda tak (kod index.php był wklejony w całości w pierwszym poście)

  1. <?php
  2.  
  3. if (isset($_POST['username']) && isset($_POST['password'])) {
  4.  
  5. $username = $_POST['username'];
  6. $password = $_POST['password'];
  7.  
  8. $password_md5 = md5($password);
  9.  
  10. if (!empty($username) && !empty($password)) {
  11.  
  12.  
  13. $query = "SELECT `id` FROM `users (135)` WHERE `username`='$username' AND `password`='$password_md5'";
  14.  
  15. if ($query_run = mysql_query($query)) {
  16. $query_num_rows = mysql_num_rows($query_run);
  17.  
  18. if ($query_num_rows == 0) {
  19. echo 'Invalid username or password';
  20. } else if ($query_num_rows==1) {
  21. $user_id = mysql_result($query_run, 0, 'id');
  22. $_SESSION['user_id'] = $user_id;
  23. header('Location: index.php');
  24.  
  25. }
  26.  
  27. }
  28.  
  29. } else {
  30. echo 'You must type in username and password';
  31. }
  32.  
  33. }
  34.  
  35. ?>
  36.  
  37. <form action="index.php" ?>" method="POST">
  38. Username:
  39. <input type="text" name="username"><br>
  40. Password:
  41. <input type="password" name="password"><br>
  42. <input type="submit" name="submit" value="Log In">
  43.  
  44. </form>




Cytat(trueblue @ 23.03.2014, 14:59:00 ) *
A gdzie wyłączasz buforowanie rozpoczęte poprzez ob_start();?


Najprawdopodobniej nie wyłączam, szczerze mówiąc nie rozumiem jeszcze działania tej funkcji i do czego służy, dodałem ją gdyż tak mówił tutorial
trueblue
Cytat(Fakebook @ 23.03.2014, 16:32:24 ) *
Najprawdopodobniej nie wyłączam, szczerze mówiąc nie rozumiem jeszcze działania tej funkcji i do czego służy, dodałem ją gdyż tak mówił tutorial

Na początek zakomentuj ob_clean, lub dodaj w linii 5: ob_end_clean();
Fakebook
Cytat(trueblue @ 23.03.2014, 17:06:23 ) *
Na początek zakomentuj ob_clean, lub dodaj w linii 5: ob_end_clean();


Niestety bez zmian
ZaXaZ
wymień
  1. <form action="index.php" ?>" method="POST">
  2. <!--na-->
  3. <form action="index.php" method="POST">

oraz
Kod
$query = "SELECT `id` FROM `users (135)`
#na
$query = "SELECT `id` FROM `users`


poza tym za FROM powinna być tabela a nie kolumna tabeli.
Fakebook
Cytat(ZaXaZ @ 24.03.2014, 00:06:33 ) *
wymień
  1. <form action="index.php" ?>" method="POST">
  2. <!--na-->
  3. <form action="index.php" method="POST">


nadal bez zmian niestety, nadal to echo ' You are logged on' sie nie wyswietla, za to formularz non stop jest widoczny.

A co do tabeli, to "users (135)" to jej nazwa w bazie danych (łącznie z tym (135) właśnie)
trueblue
Zakomentuj ob_start(); i wrzuć przed linią 6 (w pierwszym przykładzie na stronie).
  1. print_r($_SESSION);

Pokaż co się wydrukowało.
Fakebook
Cytat(trueblue @ 24.03.2014, 16:55:35 ) *
Pokaż co się wydrukowało.


Kompletnie nic, jak wkleilem to samo w loginform.inc.php to wyswietlil sie prawidlowo Array ( [user_id] => 1 ), ale print_r($_SESSION); w kodzie index.php nie wyswietliło absolutnie nic
com
no a gdzie session_start(); w index?
Fakebook
  1. <?php
  2.  
  3. require 'connect.inc.php';
  4. print_r($_SESSION);
  5.  
  6. if (isset($_SESSION['user_id']) && !empty($_SESSION['user_id'])) { // jesli sesja zostala ustanowiona, odpalamy ponizszy kod
  7. echo 'You are logged in';
  8. } else {
  9. include 'loginform.inc.php';
  10. }
  11. ?>


Stan pliku na chwilę obecną
Dyktus
Ja widzę session_start() na początku.

Spróbuj zrobić coś takiego
  1. <?php
  2. echo 'debug 1';
  3. require 'connect.inc.php';
  4. echo 'debug 2';
  5. print_r($_SESSION);
  6.  
  7. echo 'debug 3';
  8. if (isset($_SESSION['user_id']) && !empty($_SESSION['user_id'])) { // jesli sesja zostala ustanowiona, odpalamy ponizszy kod
  9. echo 'You are logged in';
  10. echo 'debug Prawdy';
  11. } else {
  12. echo 'debug Fałszu przed includem';
  13. include 'loginform.inc.php';
  14. echo 'debug Fałszu';
  15. }
  16.  
  17. echo 'debug 4';
  18. ?>


I powiedz który debug będzie ostatni. Przecież instrukcja warunkowa powinna działać tak, że wykona jedno lub drugie. To pozwoli wyszukać nam w której linijce może być problem smile.gif bo kod wygląda poprawnie.

Jeszcze pytanie czy korzystasz z serwera jakiegoś czy może localhost ?

A samego if-a proponuję zrobić tak:
  1. if ( (isset($_SESSION['user_id']) && (!empty($_SESSION['user_id']) ) {

Przynajmniej dopiero taki zapis zawsze u mnie poprawnie działał.
Fakebook
Cytat(Dyktus @ 24.03.2014, 18:25:38 ) *
Jeszcze pytanie czy korzystasz z serwera jakiegoś czy może localhost ?

Jest to hosting na godaddy

Jako pierwszy pojawia sie debug1, potem wyswietla sie formularz, a pod spodem (jako ostatnie), cytuję: "debug FaĹlszudebug 4" (czyli dwa ostatnie, debug fałszu i debug 4)

Co jest ciekawe natomiast, to jesli nie wpisze hasła albo loginu wcale, po pojawia sie error z formularza ze musze wpisac dane (tak mialo byc, jest ok), jesli wpisze dane niepoprawne, rownież pojawia się poprawny komunikat błędu (niewłaściwy login lub hasło), jeśli natomiast wpiszę hasło poprawne, to pojawiają się te debugi które wypisałem powyżej, NATOMIAST jeśli teraz odświeżę ekran, znika wszystko oprócz 'debug1'
Dyktus
Spróbuj na samym początku swojego kodu podać coś takiego smile.gif zobaczymy czy coś wyświetli.
Wygląda na to jakby był problem przy require

  1. ini_set('display_errors','1');


except upon failure it will also produce a fatal E_COMPILE_ERROR level error. In other words, it will halt the script whereas include only emits a warning
Może wyprodukuje jakiś błąd.

Dodam od siebie, że mam aktualnie podobny problem. W moim systemie logowania tworzy sesje, ale jak przejdę do podstrony swojego serwisu to sesja znika :| gdy zaloguje się poprawnie wszystko jest już w porządku.
Fakebook
Cytat(Dyktus @ 25.03.2014, 17:55:49 ) *
Spróbuj na samym początku swojego kodu podać coś takiego smile.gif zobaczymy czy coś wyświetli.
Wygląda na to jakby był problem przy require



Dyktus, wielkie dzięki, problem rozwiązany!

Wkleiłem ten kod od błędu, i wyświetliło się coś takiego: 'Warning: session_start(): Cannot send session cache limiter (...)'

Pół godziny googlowania i okazało się że problem leży po stronie godaddy, a dokładniej formy kodu który może strawić.

Na początku pliku, jeszcze przed znacznikiem <?php, opisuję w komentarzach co dany plik zawiera i co robi. Okazało się że godaddy nie może tego strawić, więc usunąłem wszystkie komentarze spoza znaczników <?php /> i zadziałało jak magia, natychmiast.

Gdybyś mi nie polecił wkleić tego kodu to bym jeszcze się długo z tym dziadostwem męczył, wielkie dzięki!

Pozdrawiam
Dyktus
Cieszę się, że pomogłem smile.gif
Masz kolejne doświadczenie, szerokiej drogi w programowaniu.

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.