Mam plik PHP, który jest czasami wywoływany ze strony, która rozpoczęła sesję, a czasami ze strony, która nie rozpoczęła sesji. Dlatego gdy mam session_start()
ten skrypt, czasami pojawia się komunikat o błędzie „sesja już się rozpoczęła”. W tym celu umieściłem następujące linie:
if(!isset($_COOKIE["PHPSESSID"]))
{
session_start();
}
ale tym razem dostałem ten komunikat ostrzegawczy:
Uwaga: Niezdefiniowana zmienna: _SESSION
Czy istnieje lepszy sposób sprawdzenia, czy sesja już się rozpoczęła?
Jeśli użyję, @session_start
czy to zadziała poprawnie i po prostu zamknie ostrzeżenia?
php
session
session-variables
Logan
źródło
źródło
Odpowiedzi:
Zalecany sposób dla wersji PHP> = 5.4.0, PHP 7
Odniesienie: http://www.php.net/manual/en/function.session-status.php
Dla wersji PHP <5.4.0
źródło
session_start();session_write_close();
: wtedy warunek if się nie powiedzie, ale nie mamy otwartej sesji ...session_start()
u góry skryptu jest ZAMKNIĘTA, gdy skrypt kończy się, LUB gdysession_write_closed()
jest wywoływana przed zakończeniem skryptu. Tj. Sesja ZAMYKA, gdy dane są zapisywane w pliku cookie sesji, a sesja jest odblokowana w celu uzyskania dostępu przez inny skrypt, który również wywołuje „session_start”. ZAMKNIĘCIE NIE oznacza zatem, że sesja jest ZNISZCZONA. Możesz zamknąć sesję, wychodząc z bieżącego skryptu lub wywołującsession_write_close()
, i możesz otworzyć ją ponownie, wywołującsession_start()
. Przynajmniej moje zrozumienie.W przypadku wersji PHP wcześniejszych niż PHP 5.4.0:
Chociaż, IMHO, naprawdę powinieneś pomyśleć o refaktoryzacji kodu zarządzania sesją, jeśli nie wiesz, czy sesja się rozpocznie ...
To powiedziawszy, moja opinia jest subiektywna i zdarzają się sytuacje (których przykłady opisano w komentarzach poniżej), w których może nie być możliwe ustalenie, czy sesja się rozpoczęła.
źródło
PHP 5.4 wprowadził session_status () , który jest bardziej niezawodny niż poleganie na nim
session_id()
.Rozważ następujący fragment kodu:
Tak więc, aby sprawdzić, czy sesja się rozpoczyna, zalecanym sposobem w PHP 5.4 jest teraz:
źródło
możesz to zrobić i to jest naprawdę łatwe.
Mam nadzieję, że to pomoże :)
źródło
$_SESSION=array();
, więc ta odpowiedź wydaje się dobra.session_destroy()
został wywołany,$_SESSION
nadal można go ustawić. Ponadto w testach jednostkowych możesz ustawić$_SESSION
bezpośrednio. Ale głosowałem za tym, ponieważ w większości praktycznych sytuacji ta odpowiedź powinna być wystarczająco dobra (dopóki PHP 5.3 nigdy więcej nie będzie widoczne ...)źródło
W wersjach wcześniejszych niż PHP 5.4 nie ma innej wiarygodnej metody niż ustawienie flagi globalnej.
Rozważać:
Lub:
Tak więc przed PHP 5.4 powinieneś ustawić globalną wartość logiczną.
źródło
Dla wszystkich wersji php
źródło
if ((defined('PHP_SESSION_ACTIVE') && session_status() !== PHP_SESSION_ACTIVE) || !session_id())
Sprawdź to :
Źródło http://php.net
źródło
Użyj session_id () , zwraca pusty ciąg, jeśli nie jest ustawiony. Jest bardziej niezawodny niż sprawdzanie
$_COOKIE
.źródło
mam nadzieję, że to pomoże !
źródło
Powinno to działać dla wszystkich wersji PHP. Określa wersję PHP, a następnie sprawdza, czy sesja jest uruchamiana na podstawie wersji PHP. Następnie, jeśli sesja nie zostanie uruchomiona, rozpocznie się.
źródło
Jedyne, co musisz zrobić, to:
źródło
Nie jestem pewien co do wydajności takiego rozwiązania, ale pochodzi z działającego projektu. Jest to również używane, jeśli musisz zdefiniować domyślny język
źródło
@
przed wywołaniem funkcji pomija wszelkie błędy, które mogą być zgłaszane podczas wywołania funkcji.Dodanie
@
wcześniejsession_start
mówi PHP, aby uniknąć drukowania komunikatów o błędach.Na przykład:
Używanie
session_start()
po tym, jak już coś wydrukowałeś w przeglądarce, powoduje błąd, więc PHP wyświetli coś takiego: „nagłówki nie mogą zostać wysłane: rozpoczęte o (linia 12)”,@session_start()
w tym przypadku nadal się nie powiedzie, ale komunikat o błędzie nie jest drukowany na ekran.Przed dołączeniem plików lub przekierowaniem na nową stronę skorzystaj z
exit()
funkcji, w przeciwnym razie pojawi się błąd.Tego kodu można użyć we wszystkich przypadkach:
źródło
W PHP 5.3 to działa dla mnie:
to masz. Jeśli nie umieścisz instrukcji „if” na początku, sesja rozpocznie się w jakikolwiek sposób, nie wiem dlaczego.
źródło
Odpowiedź OPARTA na odpowiedzi @Meliza Ramos (patrz pierwsza odpowiedź) i http://php.net/manual/en/function.phpversion.php ,
DZIAŁANIA:
używaj tylko openSession ()
źródło
Właściwie jest już za późno, aby wyjaśnić to tutaj, ponieważ zostało rozwiązane. To był plik .inc jednego z moich projektów, w którym konfigurujesz menu restauracji, wybierając danie i usuwając / dodając lub zmieniając kolejność. Serwer, na którym pracowałem, nie miał rzeczywistej wersji, więc uczyniłem ją bardziej elastyczną. To zależy od autorów, którzy chcą go wykorzystać i wypróbować.
źródło
Czy ten fragment kodu działa dla Ciebie?
źródło
Powinieneś zreorganizować swój kod, aby wywoływać
session_start()
dokładnie raz na wykonanie strony.źródło
źródło
Wersja PHP_VERSION_ID jest dostępna od wersji PHP 5.2.7, więc sprawdź to najpierw i, jeśli to konieczne, utwórz ją.
session_status
jest dostępny od PHP 5.4, dlatego też musimy to sprawdzić:źródło
Opierając się na mojej praktyce, przed uzyskaniem dostępu do
$_SESSION[]
musisz zadzwonić zasession_start
każdym razem, aby użyć skryptu. Zobacz poniższy link do instrukcji.http://php.net/manual/en/function.session-start.php
Dla mnie przynajmniej
session_start
jest mylące jako nazwa. Asession_load
może być bardziej jasne.źródło
skończyłem z podwójną kontrolą statusu. php 5.4+
źródło
Możesz użyć następującego rozwiązania, aby sprawdzić, czy sesja PHP już się rozpoczęła:
źródło
Właśnie tego używam do ustalenia, czy sesja się rozpoczęła. Używając pustego i isset w następujący sposób:
źródło
Zamień na
session_start();
:źródło