Sprawdź czy sesja PHP już się rozpoczęła
Mam plik PHP, który jest czasami wywoływany ze strony, która rozpoczęła sesję, a czasami ze strony, która nie ma rozpoczętej sesji. Dlatego kiedy mam session_start()
na tym skrypcie czasami pojawia się komunikat o błędzie "sesja już rozpoczęta". Za to wstawiłem te linijki:
if(!isset($_COOKIE["PHPSESSID"]))
{
session_start();
}
Ale tym razem dostałem wiadomość ostrzegawczą:
Notice: Undefined variable: _SESSION
Czy jest lepszy sposób na sprawdzenie czy sesja już zaczął?
Jeśli użyję @session_start
czy to sprawi, że wszystko będzie działać poprawnie i po prostu zamknąć Ostrzeżenia?
25 answers
Zalecany sposób dla wersji PHP >= 5.4.0
if (session_status() == PHP_SESSION_NONE) {
session_start();
}
Źródło: http://www.php.net/manual/en/function.session-status.php
Dla wersji PHP
if(session_id() == '') {
session_start();
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-22 13:16:02
Dla wersji PHP przed PHP 5.4.0:
if(session_id() == '') {
// session isn't started
}
Chociaż, IMHO, powinieneś naprawdę pomyśleć o refaktoryzacji kodu zarządzania sesją, jeśli nie wiesz, czy sesja jest rozpoczęta...
To powiedziawszy, moja opinia jest subiektywna i są sytuacje (których przykłady opisano w komentarzach poniżej), w których może nie być możliwe, aby wiedzieć, czy sesja została rozpoczęta.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-04 16:28:50
PHP 5.4 wprowadził session_status () , który jest bardziej niezawodny niż poleganie na session_id()
.
Rozważ następujący fragment:
session_id('test');
var_export(session_id() != ''); // true, but session is still not started!
var_export(session_status() == PHP_SESSION_ACTIVE); // false
Więc, aby sprawdzić, czy sesja jest rozpoczęta, zalecanym sposobem w PHP 5.4 jest teraz:
session_status() == PHP_SESSION_ACTIVE
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-28 09:07:36
Możesz to zrobić i to naprawdę proste.
if (!isset($_SESSION)) session_start();
Mam nadzieję, że pomoże:)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-28 14:25:54
if (version_compare(phpversion(), '5.4.0', '<')) {
if(session_id() == '') {
session_start();
}
}
else
{
if (session_status() == PHP_SESSION_NONE) {
session_start();
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-12 07:34:46
Przed PHP 5.4 nie ma wiarygodnego sposobu poznania innego niż ustawienie flagi globalnej.
Rozważmy:
var_dump($_SESSION); // null
session_start();
var_dump($_SESSION); // array
session_destroy();
var_dump($_SESSION); // array, but session isn't active.
Lub:
session_id(); // returns empty string
session_start();
session_id(); // returns session hash
session_destroy();
session_id(); // returns empty string, ok, but then
session_id('foo'); // tell php the session id to use
session_id(); // returns 'foo', but no session is active.
Więc przed PHP 5.4 powinieneś ustawić globalny boolean.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-05 10:14:07
Dla wszystkich wersji php
if ((function_exists('session_status')
&& session_status() !== PHP_SESSION_ACTIVE) || !session_id()) {
session_start();
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-12 16:23:06
Sprawdź to:
<?php
/**
* @return bool
*/
function is_session_started()
{
if ( php_sapi_name() !== 'cli' ) {
if ( version_compare(phpversion(), '5.4.0', '>=') ) {
return session_status() === PHP_SESSION_ACTIVE ? TRUE : FALSE;
} else {
return session_id() === '' ? FALSE : TRUE;
}
}
return FALSE;
}
// Example
if ( is_session_started() === FALSE ) session_start();
?>
Źródło http://php.net
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-22 10:39:44
Użyj session_id () , zwraca pusty łańcuch, jeśli nie jest ustawiony. Jest bardziej niezawodny niż sprawdzanie $_COOKIE
.
if (strlen(session_id()) < 1) {
session_start();
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-28 10:51:45
if (session_id() === "") { session_start(); }
Mam nadzieję, że to pomoże !Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-02 07:01:21
To powinno działać dla wszystkich wersji PHP. Określa wersję PHP, a następnie sprawdza, czy sesja została uruchomiona w oparciu o wersję PHP. Następnie, jeśli sesja nie jest uruchomiona, uruchamia ją.
function start_session() {
if(version_compare(phpversion(), "5.4.0") != -1){
if (session_status() == PHP_SESSION_NONE) {
session_start();
}
} else {
if(session_id() == '') {
session_start();
}
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-07 01:04:25
Jedyne co musisz zrobić to:
<?php
if(!isset($_SESSION))
{
session_start();
}
?>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-27 20:48:49
Nie jestem pewien skuteczności takiego rozwiązania, ale to z pracującego projektu Jest to również używane, jeśli chcesz zdefiniować domyślny język
/**
* Start session
* Fall back to ukrainian language
*/
function valid_session() {
if(session_id()=='') {
session_start();
$_SESSION['lang']='uk';
$_SESSION['lang_id']=3;
}
return true;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-26 23:23:42
Powinieneś zreorganizować swój kod tak, aby wywoływać session_start()
dokładnie raz na wykonanie strony.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-06 09:07:00
Na PHP 5.3 działa mi to:
if(!strlen(session_id())){
session_name('someSpecialName');
session_start();
}
Więc masz. Jeśli nie umieścisz na początku instrukcji not at if, sesja rozpocznie się w jakikolwiek sposób, nie dlaczego.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-28 06:27:57
ODPOWIEDŹ na podstawie odpowiedzi @ Meliza Ramos (patrz pierwsza odpowiedź) i http://php.net/manual/en/function.phpversion.php ,
Działania:
- define PHP_VERSION_ID if not exist
- zdefiniuj funkcję, aby sprawdzić wersję na podstawie PHP_VERSION_ID
- define function to opensession () secure
Używaj tylko openSession()
// PHP_VERSION_ID is available as of PHP 5.2.7, if our
// version is lower than that, then emulate it
if (!defined('PHP_VERSION_ID')) {
$version = explode('.', PHP_VERSION);
define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2]));
// PHP_VERSION_ID is defined as a number, where the higher the number
// is, the newer a PHP version is used. It's defined as used in the above
// expression:
//
// $version_id = $major_version * 10000 + $minor_version * 100 + $release_version;
//
// Now with PHP_VERSION_ID we can check for features this PHP version
// may have, this doesn't require to use version_compare() everytime
// you check if the current PHP version may not support a feature.
//
// For example, we may here define the PHP_VERSION_* constants thats
// not available in versions prior to 5.2.7
if (PHP_VERSION_ID < 50207) {
define('PHP_MAJOR_VERSION', $version[0]);
define('PHP_MINOR_VERSION', $version[1]);
define('PHP_RELEASE_VERSION', $version[2]);
// and so on, ...
}
}
function phpVersionAtLeast($strVersion = '0.0.0')
{
$version = explode('.', $strVersion);
$questionVer = $version[0] * 10000 + $version[1] * 100 + $version[2];
if(PHP_VERSION_ID >= $questionVer)
return true;
else
return false;
}
function openSession()
{
if(phpVersionAtLeast('5.4.0'))
{
if(session_status()==PHP_SESSION_NONE)
session_start();
}
else // under 5.4.0
{
if(session_id() == '')
session_start();
}
}
if (version_compare(PHP_VERSION, "5.4.0") >= 0) {
$sess = session_status();
if ($sess == PHP_SESSION_NONE) {
session_start();
}
} else {
if (!$_SESSION) {
session_start();
}
}
Właściwie, jest już za późno, aby wyjaśnić to tutaj i tak, jak to zostało rozwiązane. To było ... plik inc jednego z moich projektów, w którym konfigurujesz menu restauracji wybierając danie i usuwasz / dodajesz lub zmieniasz kolejność. Serwer, na którym pracowałem, nie miał rzeczywistej wersji, więc zrobiłem go bardziej elastycznym. To zależy od autorów, którzy chcą go użyć i wypróbować.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-18 10:08:22
Czy ten fragment kodu działa dla Ciebie?
if (!count($_SESSION)>0) {
session_start();
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-28 04:08:35
session_start();
if(!empty($_SESSION['user']))
{
//code;
}
else
{
header("location:index.php");
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-16 09:52:56
PHP_VERSION_ID jest dostępny od wersji PHP 5.2.7, więc najpierw sprawdź tę opcję i w razie potrzeby utwórz ją.
session_status
jest dostępny od wersji PHP 5.4, więc też musimy to sprawdzić:
if (!defined('PHP_VERSION_ID')) {
$version = explode('.', PHP_VERSION);
define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2]));
}else{
$version = PHP_VERSION_ID;
}
if($version < 50400){
if(session_id() == '') {
session_start();
}
}else{
if (session_status() !== PHP_SESSION_ACTIVE) {
session_start();
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-25 17:06:03
Bazując na mojej praktyce, przed uzyskaniem dostępu do $_SESSION[]
musisz zadzwonić session_start
za 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. A session_load
może być bardziej jasne.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-14 05:25:12
Skończyłem z podwójną kontrolą statusu. php 5.4 +
if(session_status() !== PHP_SESSION_ACTIVE){session_start();};
if(session_status() !== PHP_SESSION_ACTIVE){die('session start failed');};
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-14 18:03:36
Możesz użyć następującego rozwiązania, aby sprawdzić, czy sesja PHP już się rozpoczęła:
if(session_id()== '')
{
echo"Session isn't Start";
}
else
{
echo"Session Started";
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-09 20:46:10
To jest to, czego używam do określenia, czy sesja się rozpoczęła. Używając empty i isset w następujący sposób:
if (empty($_SESSION) && !isset($_SESSION)) {
session_start();
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-11 19:02:08
Zastąp session_start();
przez:
if (!isset($a)) {
a = False;
if ($a == TRUE) {
session_start();
$a = TRUE;
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-17 07:47:08