PHP - Niedziałające zmienne sesji przy przekierowaniach
Zdarzyło mi się ostatnio, że na zewnętrznym serwerze nie działały zmienne sesyjne, a raczej nie były przekazywane podczas przekierowywania na inne podstrony przy pomocy funkcji header("Location: ..."). Jako, że dość długo szukałem przyczyn i rozważałem kilka możliwości, chciałbym się podzielić doświadczeniem.
Nie działają zmienne sesyjne?
Jeśli zmienne przechowywane w sesji ($_SESSION[""]) nie są przekazywane ze strony na podstronę, to cała logika aplikacji internetowej, może się wyłożyć. A niestety przyczyn może być kilka. Dlatego postaram się je omówić w kolejności od najczęściej występujących, do tych rzadziej spotykanych.
Czy zaczynasz od session_start()?
Najczęstszą przyczyną problemów ze zmiennymi przechowywanymi w sesji, jest brak zainicjowania sesji dokładnie na samym początku strony i to każdej, na której zmienne te mają być użyte. Dlatego jeśli zmienne nie są przekazywane między podstronami, upewnij się, czy na pewno pierwszą rzeczą jaką robisz na każdej z podstron jest wywołanie funkcji session_start(). Pamiętaj również o tym, że między pierwszym blokiem kodu PHP, w którym znajduje się wywołanie tej funkcji, a faktycznym początkiem pliku, nie może znajdować się żaden (!) znak, łącznie ze znakami białymi takimi jak spacje, tabulatory czy znaki nowego wiersza. Sprawdź czy na pewno na każdej ze stron tak się sprawy mają.W ramach prewencji, polecam każdą ze stron zaczynać od:
session_start();
?>
Czy wywołujesz exit() po użyciu przekierowanie przez header()?
Innym powodem nie przekazywania zmiennych sesyjnych po przekierowaniu za pomocą funkcji header("Location: jakasStrona"), może być fakt, że w niektórych przypadkach, kod znajdujący się za wywołaniem tej funkcji, mimo wszystko będzie wykonywany. Dlatego też każde przekierowanie powinno wyglądać podobnie do tego:exit;
die();
A może sesja nie zdążyła się zapisać przed przekierowaniem?
Możliwe jest również, że sesja nie zdążyła się zapisać, a my już przekierowujemy przeglądarkę na inną podstronę. Aby wymusić zapisanie sesji, należy wywołać metodę session_write_close() przed momentem przekierowania. Może to wyglądać np. w ten sposób:header("Location: jakas_strona.php");
exit;
Czy ścieżka zapisu sesji istnieje?
Innym problemem może być fakt, że ścieżka wskazana w pliku php.ini w której sesja ma zostać zapisana, nie istnieje w systemie. Szczególnie często ma to miejsce, gdy serwer stoi na systemie Windows, a konfiguracja php jest dostosowana do systemów Linux. Odszukajmy więc wpis session.save_path i upewnijmy się, czy istnieje. Jeśli nie - należy zmienić tę ścieżkę, lub utworzyć jej odpowiednik na dysku. Jeśli ścieżka jest poprawna...
Czy serwer ma prawa zapisu w katalogu zapisu sesji?
Jeżeli ścieżka zapisu sesji jest prawidłowa, to może się zdarzyć, że serwer (Apache, nginx etc.) nie ma prawa do zapisu w tejże lokacji. W takiej sytuacji należy nadać prawa do zapisu dla użytkownika, pod którego postacią widnieje serwer.
Wciąż zmienne sesji nie działają?
Jeśli wszystko wydaje się być poprawne, warto spróbować ręcznie ustalić Id sesji. Dołączmy ją zatem do strony przekierowania za pomocą parametru GET:header("Location: list.php?PHPSESSID=".session_id());
exit;
session_start();
Jak widać, przyczyn nie działających zmiennych sesji może być sporo. Mam jednak nadzieję, że po przejściu tego łańcucha nieszczęść, każdy dojdzie do rozwiązania problemu.
Komentarze (0) - Nikt jeszcze nie komentował - bądź pierwszy!