Dla mnie to działało po prostu usuwając session_start (), jeśli sesja jest już zaczęli to dlaczego musimy zacząć go again.In moim przypadku to był tylko plik config.php która obejmowała w kodzie
Mangesh Sathe
Umieściłem session_start()w jednym z moich require_oncezałączników i to w każdym pliku, którego potrzebuję.
Ułatwia to wdrażanie zabezpieczeń, jeśli używasz strony wzorcowej do zawijania całej zawartości.
Raymond Wachaga,
Jest to również zalecane w sytuacjach, gdy możesz lub nie załadować pliku zawierającego session_start (), więc dobra standardowa praktyka
Steve Whitby
31
Jeśli chcesz nowy, zrób to session_destroy()przed uruchomieniem. Aby sprawdzić, czy jest ustawiony przed uruchomieniem, zadzwoń session_status():
$status = session_status();
if($status == PHP_SESSION_NONE){
//There is no active session
session_start();
}elseif($status == PHP_SESSION_DISABLED){
//Sessions are not available
}elseif($status == PHP_SESSION_ACTIVE){
//Destroy current and start new one
session_destroy();
session_start();
}
Chciałbym uniknąć sprawdzania globalny $_SESSIONzamiast z Wołam ten session_status()sposób od PHP wdrożone tej funkcji wyraźnie do:
Pokaż stan sesji za pomocą nowej funkcji, session_status To jest dla (PHP> = 5.4.0)
Tak, możesz sprawdzić, czy sesja już działa, zaznaczając isset($_SESSION). Jednak najlepszą odpowiedzią jest po prostu nie dzwonić session_start()więcej niż jeden raz.
Powinien zostać wywołany bardzo wcześnie w skrypcie, być może nawet w pierwszej linii, a następnie nie wywoływany ponownie.
Jeśli masz go w więcej niż jednym miejscu w swoim kodzie, prosisz o uzyskanie tego rodzaju błędu. Wytnij go, aby był tylko w jednym miejscu i można go było wywołać tylko raz.
Plik sesji pozostaje zablokowany do czasu zakończenia wykonywania skryptu lub ręcznego zamknięcia sesji.
Zatem strona powinna domyślnie otwierać sesję w trybie tylko do odczytu. Ale gdy jest otwarty w trybie tylko do odczytu, musi zostać zamknięty i ponownie otwarty, aby przejść do trybu zapisu.
const SESSION_DEFAULT_COOKIE_LIFETIME = 86400;
/**
* Open _SESSION read-only
*/functionOpenSessionReadOnly() {
session_start([
'cookie_lifetime' => SESSION_DEFAULT_COOKIE_LIFETIME,
'read_and_close' => true, // READ ACCESS FAST
]);
// $_SESSION is now defined. Call WriteSessionValues() to write out values
}
/**
* _SESSION is read-only by default. Call this function to save a new value
* call this function like `WriteSessionValues(["username"=>$login_user]);`
* to set $_SESSION["username"]
*
* @param array $values_assoc_array
*/functionWriteSessionValues($values_assoc_array) {
// this is required to close the read-only session and // not get a warning on the next line.
session_abort();
// now open the session with write access
session_start([ 'cookie_lifetime' => SESSION_DEFAULT_COOKIE_LIFETIME ]);
foreach ($values_assoc_arrayas$key => $value) {
$_SESSION[ $key ] = $value;
}
session_write_close(); // Write session data and end session
OpenSessionReadOnly(); // now reopen the session in read-only mode.
}
OpenSessionReadOnly(); // start the session for this page
Następnie, kiedy idziesz napisać jakąś wartość:
WriteSessionValues(["username"=>$login_user]);
Funkcja pobiera tablicę par klucz => wartość, aby uczynić ją jeszcze bardziej wydajną.
Żadne z powyższych nie było odpowiednie, bez wywołania session_start () we wszystkich plikach php, które zależą od zmiennych $ Session, nie zostaną one uwzględnione. Powiadomienie jest tak denerwujące i szybko wypełnia Error_log. Jedynym rozwiązaniem, które mogę znaleźć, jest to ....
sprawdź stan sesji za pomocą session_status, który zwraca aktualny stan sesji, a jeśli bieżąca sesja już działa, wróć z niczym innym, jeśli sesja nie działa, rozpocznij sesję
session_start()
w jednym z moichrequire_once
załączników i to w każdym pliku, którego potrzebuję.Odpowiedzi:
Próbować
<?php if(!isset($_SESSION)) { session_start(); } ?>
źródło
Jeśli chcesz nowy, zrób to
session_destroy()
przed uruchomieniem. Aby sprawdzić, czy jest ustawiony przed uruchomieniem, zadzwońsession_status()
:$status = session_status(); if($status == PHP_SESSION_NONE){ //There is no active session session_start(); }else if($status == PHP_SESSION_DISABLED){ //Sessions are not available }else if($status == PHP_SESSION_ACTIVE){ //Destroy current and start new one session_destroy(); session_start(); }
Chciałbym uniknąć sprawdzania globalny
$_SESSION
zamiastzWołam tensession_status()
sposób od PHP wdrożone tej funkcji wyraźnie do:źródło
Tylko jeśli chcesz zniszczyć poprzednią sesję:
<?php if(!isset($_SESSION)) { session_start(); } else { session_destroy(); session_start(); } ?>
lub możesz użyć
unset($_SESSION['variable_session _data'])
aby zniszczyć określoną zmienną sesji.
źródło
Zamknięta gra
źródło
Tak, możesz sprawdzić, czy sesja już działa, zaznaczając
isset($_SESSION)
. Jednak najlepszą odpowiedzią jest po prostu nie dzwonićsession_start()
więcej niż jeden raz.Powinien zostać wywołany bardzo wcześnie w skrypcie, być może nawet w pierwszej linii, a następnie nie wywoływany ponownie.
Jeśli masz go w więcej niż jednym miejscu w swoim kodzie, prosisz o uzyskanie tego rodzaju błędu. Wytnij go, aby był tylko w jednym miejscu i można go było wywołać tylko raz.
źródło
Musisz być już wywołany początek sesji, może być wywoływany ponownie przez dołączenie?
if( ! $_SESSION) { session_start(); }
źródło
Notice: Undefined variable: _SESSION
. Użyjisset
zamiast tego.Napotkałem ten problem, próbując naprawić zachowanie blokujące $ _SESSION.
http://konrness.com/php5/how-to-prevent-blocking-php-requests/
Zatem strona powinna domyślnie otwierać sesję w trybie tylko do odczytu. Ale gdy jest otwarty w trybie tylko do odczytu, musi zostać zamknięty i ponownie otwarty, aby przejść do trybu zapisu.
const SESSION_DEFAULT_COOKIE_LIFETIME = 86400; /** * Open _SESSION read-only */ function OpenSessionReadOnly() { session_start([ 'cookie_lifetime' => SESSION_DEFAULT_COOKIE_LIFETIME, 'read_and_close' => true, // READ ACCESS FAST ]); // $_SESSION is now defined. Call WriteSessionValues() to write out values } /** * _SESSION is read-only by default. Call this function to save a new value * call this function like `WriteSessionValues(["username"=>$login_user]);` * to set $_SESSION["username"] * * @param array $values_assoc_array */ function WriteSessionValues($values_assoc_array) { // this is required to close the read-only session and // not get a warning on the next line. session_abort(); // now open the session with write access session_start([ 'cookie_lifetime' => SESSION_DEFAULT_COOKIE_LIFETIME ]); foreach ($values_assoc_array as $key => $value) { $_SESSION[ $key ] = $value; } session_write_close(); // Write session data and end session OpenSessionReadOnly(); // now reopen the session in read-only mode. } OpenSessionReadOnly(); // start the session for this page
Następnie, kiedy idziesz napisać jakąś wartość:
WriteSessionValues(["username"=>$login_user]);
Funkcja pobiera tablicę par klucz => wartość, aby uczynić ją jeszcze bardziej wydajną.
źródło
Spróbuj tego
if(!isset($_SESSION)){ session_start(); }
Sugeruję użycie ob_start (); przed uruchomieniem zmiennej sesson, powinno to ustawić bufor przeglądarki.
edycja: Dodano dodatkowy) po $ _SESSION
źródło
Żadne z powyższych nie było odpowiednie, bez wywołania session_start () we wszystkich plikach php, które zależą od zmiennych $ Session, nie zostaną one uwzględnione. Powiadomienie jest tak denerwujące i szybko wypełnia Error_log. Jedynym rozwiązaniem, które mogę znaleźć, jest to ....
Zła poprawka, ale działa.
źródło
Byłoby bardziej wydajne:
Unikanie obsługi błędów na ekranie
Najlepsza,
źródło
<?php if ( session_id() != "" ) { session_start(); }
Zasadniczo musisz sprawdzić, czy sesja została uruchomiona przed utworzeniem kolejnej; ... więcej czytania .
Z drugiej strony zdecydowałeś się zniszczyć istniejącą sesję przed utworzeniem kolejnej za pomocą
session_destroy()
.źródło
Po prostu użyj instrukcji if
if(!isset($_SESSION)) { session_start(); }
lub
sprawdź stan sesji za pomocą session_status, który zwraca aktualny stan sesji, a jeśli bieżąca sesja już działa, wróć z niczym innym, jeśli sesja nie działa, rozpocznij sesję
źródło