2009-03-19 13 views
7

Nie mogę używać zmiennych sesji na stronie innej niż ta, w której są ustawione, IOW działają jak zmienne niesesyjne. Znalazłem podobne pytanie na pół tuzinie innych podobnych forów, ale odpowiedź w tych innych przypadkach zawsze okazuje się nie mieć zastosowania.Zmienne sesji PHP nie są przechowywane

Oto moje pliki:

sess1.php

<?php 
session_start(); 

session_register("userid"); 
session_register("textvar"); 

$_SESSION['userid'] = 10333 ; 
$_SESSION['textvar'] = TextVariable ; 

echo "<p>User ID is: " . $_SESSION['userid'] . "</p>" ; 
echo "<p>Another variable is: " . $_SESSION['textvar'] . "</p>" ; 
?> 
<p>Go to the <a href="sess2.php">next page</a>.</p> 

i sess2.php

<?php 
session_start(); 

echo "<p>The userid session variable is: " . $_SESSION['userid'] . "</p>"; 
echo "<p>The other session variable is: " . $_SESSION['newvar']. "</p> "; 
?> 

Wyjście przeglądarka jest w każdym przypadku:

sess1.php

ID użytkownika jest: 10333

Inną zmienną jest: TextVariable

Przejdź do następnej strony [].

i sess2.php

Zmienna sesja userid jest:

Druga sesja jest zmienna:

Przejdź do ostatniej strony [].

Kilka rzeczy nie jest:

  • muszę session_start() w górnej części obu plików.
  • Katalog zmiennych jest zapisywalny, a zmienne sesji są tam wyświetlane. (Mam około stu małych plików o nazwie sess_b62, które mają to w środku: 'userid | i: 10333; textvar | s: 12: "TextVariable";'.)
  • phpinfo() mówi mi, że plik php.ini jest poprawnie odczytywany, a czas życia jest ustawiony na wartość domyślną, 0, tj. dopóki przeglądarka nie zostanie zamknięta.

Jestem na końcu mojego dowcipu. Jakieś sugestie?

Dziękuję bardzo.

+0

Czy sprawdziłeś, czy używany jest ten sam identyfikator sesji? – Gumbo

+0

Czy jedna ze stron korzysta z protokołu SSL? –

+0

Jaką wersję PHP używasz? (również z phpinfo()) –

Odpowiedz

2

Identyfikator sesji musi być przenoszony w pewien sposób, aby tę samą sesję można było wykorzystać na kilku stronach. Generalnie odbywa się to za pomocą pliku cookie (zob. session.use_cookies), ale można to również zrobić w adresie URL lub w formularzach (zob. session.use_trans_sid).

Najpierw należy się upewnić, że identyfikator sesji jest przesyłany, aby PHP mogło załadować właściwe dane sesji i sesji.

Patrz także Is my understanding of PHP sessions correct?

+0

Dzięki za pomoc. phpinfo() zdawałoby się potwierdzać, że używam ciasteczek, a identyfikator jest przesyłany. session.use_cookies to "On", a session.use_trans_sid to 0. Set-Cookie rejestruje plik cookie, który został utworzony na pierwszej stronie, a strona nazywa się jako referer. –

+0

Identyfikator sesji jest taki sam na obu stronach?To, że wysłano pole nagłówka Set-Cookie, nie oznacza, że ​​plik cookie został zaakceptowany i wysłany wraz z drugim żądaniem. Spróbuj porównać wartości zwracane 'session_id()' na obu stronach. – Gumbo

+0

Crud. Identyfikatory sesji są różne. Co teraz...? –

7

session_register() nie jest wymagany i może być przyczyną problemu. Czytaj dokumenty na temat session_register() - ma to na celu przypisanie zmiennych sesji z użyciem istniejących zmiennych.

iz here:

Cóż, session_register() w PHP mówi, że pewna zmienna globalna powinien być traktowany jako zmienna sesji.Oznacza to, że na końcu wykonywania skryptu (czyli wtedy, gdy zwykle ma miejsce zapis danych sesji), wynikowa wartość tej zmiennej globalnej zostanie zapisana przy użyciu aktualnie obsługiwanych procedur obsługi sesji.

Myślę, że to jest problem, którego doświadczasz. Pod koniec wykonywania skryptu zmienna sesji zostaje nadpisana.

+0

Tak, session_register() jest przestarzałe, zdecydowanie nie powinno być używane. Nie wiem, czy to powoduje ten konkretny problem, ale nie powinno to być w tym kodzie, niezależnie. –

+0

Interesujące. Pracuję z wprowadzającej książki PHP/SQL, która jest chroniona prawami autorskimi '07, a kod jest prawie bezpośrednim cytatem. Niestety, usunięcie linii session_register() nie rozwiązuje problemu. Bardzo dziękuję za informacje. –

0

Użyj jakiegoś narzędzia i sprawdź nagłówki http, aby zobaczyć, jak plik cookie jest wysyłany. Być może twój serwer internetowy nie jest skonfigurowany i wysyła pliki cookie z nieprawidłową inną domeną.

Możesz chcieć spojrzeć na wykonanie session_set_cookie_params() na każdym żądaniu i upewniając się, że właściwa domena, ścieżka i tym podobne są ustawione.

-1

Użyj pliku session_register w zarówno w plikach, jak i powinno działać.

+0

Dzięki za sugestię. Próbowałem go w obie strony, z liniami session_register() w obu plikach i bez. Nie pojawiła się żadna zmiana w zachowaniu. –

+0

session_register jest przestarzałe: nie używaj go, jeśli możesz go ominąć. – rhodesjason

+0

@Jason: czy chcesz udostępnić URL, który mówi, że jest przestarzały? Co należy zamiast tego użyć? –

2

Jednym błędem, który widzę jest to, że w pierwszym pliku ustawiasz $_SESSION['textvar'], aw drugim pliku wywołujesz $_SESSION['newvar'].

Ponadto przetestowałem twój kod na serwerze, o którym wiem, że działa i zadziałało dobrze, niż powyższy błąd.

Próbowałem również usunąć session_register(), a kod nadal działa idealnie.

+0

Dobre oko - "newvar" było literówką, po którym skopiowałem kod do nowych prostszych plików. Ale rozwiązanie session_register() nie działa w moim systemie. Bardzo dziękuję za sugestię. –

+0

Czy próbowałeś wyczyścić pliki cookie (lub usunąć ten plik cookie z witryny) i uzyskać dostęp do tej strony jako pierwszej strony, do której ponownie masz dostęp? Ponadto, czy na pewno nie ma żadnego innego tekstu powyżej lub

1

„session_register() jest zmienną liczbę argumentów, z których każdy może być albo łańcuchem posiadający nazwę zmiennej lub tablicę zawierającą nazwy zmiennych lub inne macierze. Dla każdej nazwy session_register() rejestruje zmienną globalną o tej nazwie w bieżącej sesji. "

ponieważ nie masz zmiennych o tych nazwach, wynik będzie nieprzewidywalny.

wystarczy użyć $_SESSION[$key] = $value;

1

Jeśli wszystkie powyższe kroki nie rozwiążą problemu, I'll po prostu zapytać, co oczywiste: Nie wouldn't być żadnych spacji ani nowe linie przed tagiem otwarcie php?

Możesz również sprawdzić wiadomości w pliku dziennika błędów serwera, który powinien powiedzieć, czy twoje zmienne są zdefiniowane (chociaż myślę, że to zależy również od poziomu zgłaszania błędów).

0

Kolejna oczywista rzecz do sprawdzenia:

Upewnij się, że miejsce na dysku nie jest pełne; co uniemożliwiłoby zapisanie danych sesji.

0

Wiesz, że jest to starszy wpis, ale miałem podobny problem (nie używając session_register()).

Musiał konwertować sesje na pliki cookie, ponieważ sesja wygasała zbyt często i ze względu na konfigurację serwera ("specjalne" środowisko hostingu serwerów Windows (z Apache)), wartość limitu czasu sesji PHP nie mogła zostać zmieniona .

Czy końcowy wynik był/jest po przekształceniu na pliki cookie z przedłużonym okresem życia, ale dane cookie nadal są tracone (w transmisji)? czasami.

Bardzo frustrujące.

NIGDY nie zdarzyło się tak w środowisku LAMPY, więc może pytanie, które należy zadać, dotyczy tego, czy używasz serwera LAMP.

Mam nadzieję, że to pomoże. Nie sądzę, że jest to problem PHP.

3

Miałem do czynienia z tym samym problemem. Powód był następujący: php.ini Ustawiłem wartość parametru session.cookie_secure na . Ale użyłem adresu http zamiast https w adresie URL. Korzystanie z https rozwiązało problem.

Ustawienie session.cookie_secure = 1 oznacza, że ​​pliki cookie powinny być wysyłane tylko przez bezpieczne połączenia. Dlatego otrzymywałem nowe session_ids na każdej nowej stronie podczas korzystania z http.

0

Sprawdź dzienniki serwera swojego serwera PHP, na przykład nginx lub apache.

Możesz znaleźć informacje, dlaczego sesje nie działają w pliku nginx error.log. Ścieżka do tego pliku zwykle jest: /var/log/nginx/error.log.

W moim przypadku mówiono, że danych sesji nie można zapisać. Okazało się, że w tym samym katalogu stary plik error.log.1 miał rozmiar 17 GB i zajmował całą dostępną przestrzeń dyskową.

Po prostu zwolnienie miejsca na dysku przywróciło normalne zachowanie sesji.

Powiązane problemy