PHP oturumunun başlayıp başlamadığını kontrol edin


461

Bazen bir oturum başlatmış bir sayfadan ve bazen oturum başlatılmamış bir sayfadan çağrılan bir PHP dosyası var. Bu nedenle session_start(), bu komut dosyası üzerinde bazen "oturum zaten başlatıldı" için hata iletisi alıyorum. Bunun için şu satırları koydum:

if(!isset($_COOKIE["PHPSESSID"]))
{
  session_start();
}

ama bu sefer şu uyarı mesajını aldım:

Uyarı: Tanımsız değişken: _SESSION

Oturumun başlayıp başlamadığını kontrol etmenin daha iyi bir yolu var mı?

Eğer kullanırsam @session_startişler düzgün çalışır mı ve uyarıları kapatır mı?



Ayrıca Stackoverflow'un şu cevaplarına da bakın: stackoverflow.com/questions/1545357/…
contact-form.co_you_go

Yanıtlar:


761

PHP> = 5.4.0, PHP 7 sürümleri için önerilen yol

if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

Referans: http://www.php.net/manual/en/function.session-status.php

PHP <5.4.0 sürümleri için

if(session_id() == '') {
    session_start();
}

1
PHP <5,4 için çözüm ile ilgili bir sorun olduğunu düşünüyorum. session_id, FIRST oturumunun başlatıldığı zaman olarak ayarlanır, ancak oturum kapatıldığında silinmez. Yani, örneğin, snippet'inizden önce, şöyle bir kod session_start();session_write_close();varsa: if koşulu başarısız olur, ancak açık oturumumuz yoktur ...
Nicolò Martini

@Nicolo Martini Anladığım kadarıyla: Bir session_start()komut dosyasının en üstünde başlayan bir oturum , komut dosyası çıktığında KAPALI, VEYA session_write_closed()komut dosyası çıkmadan önce çağrılır. Yani bir oturum, verileri oturum çerezine yazıldığında ve oturumun 'session_start' olarak da adlandırılan başka bir komut dosyası tarafından erişilmesi için KAPATILIR. Bu nedenle KAPATMA, oturumun DESTROYED olduğu anlamına gelmez. Geçerli komut dosyasından çıkarak veya çağırarak bir oturumu kapatabilir ve çağırarak session_write_close()tekrar açabilirsiniz session_start(). En azından benim anlayışım.
Stefan

1
Bu hala bir seans başlatmak için iyi bir yol mu? Çünkü bağlantıda bu cevapla ilgili hiçbir şey yok
csandreas1

@ csandreas1 linkten session_status tanımını ve beklenen dönüş değerlerini göreceksiniz. Sorunuzun cevabı evet!
lovelyramos

Bazı durumlarda bu başarısızlık yaşadım - Eğer (! İsset ($ _ SESSION)) başarı ile eğer kullandım
Scott

161

PHP 5.4.0'dan önceki PHP sürümleri için:

if(session_id() == '') {
    // session isn't started
}

Yine de, IMHO, bir oturumun başlatılıp başlatılmadığını bilmiyorsanız, oturum yönetimi kodunuzu yeniden düzenlemeyi düşünmelisiniz ...

Bununla birlikte, görüşüm özneldir ve oturumun başlatılıp başlatılmadığını bilmenin mümkün olmayabileceği durumlar (örnekleri aşağıdaki yorumlarda açıklanmaktadır).


37
Oturumunuzun başlatılıp başlatılmadığını bilmek hiç de fena değil. Tembel yükleme yapıyorsanız (oturuma yalnızca ilk ihtiyaç duyulduğunda başlar), cevabınızdaki test mükemmel olur.
drewm

1
Ayrıca bazı ortamlarda apache oturum otomatik başlatma
ayarına


3
Oturumun ayarlanmış olup olmadığını bilmiyorsanız oturum yönetimini yeniden düzenleme hakkındaki yorum gerçekten alakalı değildir. Örneğin, gelişmiş özellikleri bir WordPress temasına kodlarsanız, bir eklentinin oturumları kontrol etmeden kullanmaya başlayıp başlamadığını asla bilemezsiniz. Kodlama dünyası her zaman siyah ve beyaz değildir: P
Jimbo Jonny

Mmm, gerçekten iyi noktalar. Yorumlarımın çok öznel olduğuna inanıyorum - cevabımı bunu yansıtacak şekilde değiştireceğim.
Alex

71

PHP 5.4 , güvenmekten daha güvenilir olan session_status () 'i tanıttı session_id().

Aşağıdaki snippet'i düşünün:

session_id('test');
var_export(session_id() != ''); // true, but session is still not started!
var_export(session_status() == PHP_SESSION_ACTIVE); // false

Bu nedenle, bir oturumun başlatılıp başlatılmadığını denetlemek için PHP 5.4'te önerilen yol şu şekildedir:

session_status() == PHP_SESSION_ACTIVE

3
Mevcut olduğunda session_status ve daha eski yöntemler kullanılmadığında kullanılan bir kod snippet'i burada mükemmel görünecektir BTW, ipucu ipucu :)
Jimbo Jonny

1
Güncelleme için teşekkürler Benjamin. PHP 5.4'ten itibaren yeni bir yöntemin kullanılabileceğini bilmek güzel.
Logan

1
Bu, bunu kontrol etmenin çok daha iyi bir yoludur, özellikle de kullanıcı siteye göz atmanın ortasında çerezleri temizlediğinde başlatılan bir oturumunuz olup olmadığını her zaman bilmezsiniz ... Ben her zaman 2 yaşında kod yazıyorum, kullanıcıların ne yapacağını asla bilemem ;-) Kendime gelince, tüm komut dosyalarında ayar değişkenleri ve diğer bilgiler için çağrılan küçük bir Config.php dosyası var, bu yüzden bu dosyaya eklemek her zaman oturumun başlatılmasını sağlar gerekli
Andy Braham

35

bunu yapabilirsiniz ve bu gerçekten kolaydır.

if (!isset($_SESSION)) session_start();

Umarım yardımcı olur :)


6
@zloctb: Yapacağım hiçbir durum düşünemiyorum $_SESSION=array();, bu yüzden bu cevap iyi görünüyor.
halfer

5
@halfer Ryan'ın cevabına bakınız. Eğer session_destroy()çağrılmışsa $_SESSION, yine de ayarlanabilir. Ayrıca, birim testlerinde $_SESSIONdoğrudan ayarlayabilirsiniz . Ama bunu en iyi duruma getirdim, çünkü en pratik durumlar için bu cevap yeterince iyi olmalı (PHP 5.3 artık görülmeyene kadar ...)
Darren Cook

22
if (version_compare(phpversion(), '5.4.0', '<')) {
     if(session_id() == '') {
        session_start();
     }
 }
 else
 {
    if (session_status() == PHP_SESSION_NONE) {
        session_start();
    }
 }

21

PHP 5.4'ten önce, genel bir bayrak belirlemekten başka güvenilir bir yol yoktur.

Düşünmek:

var_dump($_SESSION); // null
session_start();
var_dump($_SESSION); // array
session_destroy();
var_dump($_SESSION); // array, but session isn't active.

Veya:

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.

Yani, PHP 5.4'ten önce küresel bir boole ayarlamanız gerekir.


12

Tüm php sürümü için

if ((function_exists('session_status') 
  && session_status() !== PHP_SESSION_ACTIVE) || !session_id()) {
  session_start();
}

1
Benzer şekilde, bir de yapabilirdiif ((defined('PHP_SESSION_ACTIVE') && session_status() !== PHP_SESSION_ACTIVE) || !session_id())
Anthony Hatzopoulos

9

Şuna göz at :

<?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();
?>

Kaynak http://php.net




5

Bu, tüm PHP sürümleri için çalışmalıdır. PHP sürümünü belirler, ardından oturumun PHP sürümüne göre başlatılıp başlatılmadığını kontrol eder. Ardından oturum başlatılmazsa oturum başlar.

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();
    }
  }
}

4

Yapmanız gereken tek şey:

<?php
if(!isset($_SESSION))
{
session_start();
}
?>

Yıllar boyunca kullandığım bu. Bunu kullanmamayı öneren var mı? Tabii ki oturumun bazen başlatılıp başlatılmadığını kontrol etmek iyidir - bazı ortamlarda apache oturum otomatik başlatma, tembel yükleme (yalnızca ilk ihtiyaç duyulduğunda oturumu başlatma) veya basitçe bazen sadece hızlı bir saldırıya ihtiyaç duyar
K Kilian Lindberg

SADECE AYNI YANIT (@miyuru)

2

Böyle bir çözümün verimliliği hakkında emin değilim, ama bu çalışma projesinden. Bu, varsayılan dili tanımlamanız gerektiğinde de kullanılır

   /**
    * Start session
    * Fall back to ukrainian language
    */
   function valid_session() {
    if(session_id()=='') {
        session_start();
        $_SESSION['lang']='uk';
        $_SESSION['lang_id']=3;
    }
    return true;
  }

2

@ bir işlev çağrısından önce, işlev çağrısı sırasında bildirilebilecek hataları bastırır.

@Öncesi eklemesession_start hata iletileri baskı önlemek için PHP söyler.

Örneğin:

session_start()Tarayıcıya bir şey yazdırdıktan sonra kullanmak hataya neden olur, böylece PHP "başlıklar gönderilemez: başlangıç ​​(satır 12)",@session_start() , ancak bu durumda hata mesajı yazdırılmaz. ekran.

Dosyaları eklemeden veya yeni sayfaya yönlendirmeden önce exit() işlevi , aksi takdirde bir hata verecektir.

Bu kod her durumda kullanılabilir:


    <?php 
        if (session_status() !== PHP_SESSION_ACTIVE || session_id() === ""){
            session_start(); 
        }
    ?>

1

PHP 5.3'te bu benim için çalışıyor:

if(!strlen(session_id())){
    session_name('someSpecialName');
    session_start();
} 

sonra var. Eğer oturum başlamıyorsa if deyimi koymazsanız, ben neden yapmıyorum herhangi bir şekilde başlayacak.


1

@Meliza Ramos Yanıt (ilk yanıta bakın) ve http://php.net/manual/en/function.phpversion.php üzerinde BASED yanıtı ,

HAREKETLER:

  • yoksa PHP_VERSION_ID tanımlayın
  • PHP_VERSION_ID'ye göre sürümü kontrol etme işlevi tanımlama
  • openSession () secure işlevini tanımla

sadece openSession () kullan

    // 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();
        }
    }

1
if (version_compare(PHP_VERSION, "5.4.0") >= 0) {
    $sess = session_status();
    if ($sess == PHP_SESSION_NONE) {
        session_start();
    }
} else {
    if (!$_SESSION) {
        session_start();
    }
}

Aslında, burada çözüldüğü gibi açıklamak için artık çok geç. Bu, bir yemek seçerek ve kaldır / eklemek veya siparişi değiştirerek bir restoran için bir menü yapılandırdığınız projelerimden birinin .inc dosyasıydı. Ben çalışıyordum sunucu daha esnek hale gerçek sürümü yoktu. Kullanmak ve denemek isteyen yazarlara kalmış.


1

Bu kod snippet'i sizin için çalışıyor mu?

if (!count($_SESSION)>0) {
    session_start();
}

0

Kodunuzu, session_start()sayfa yürütme başına tam olarak bir kez çağıracak şekilde yeniden düzenlemelisiniz .


4
bazı durumlarda sayfa yürütme başına tam olarak bir kez çağrı yapmak istenmeyebilir.
Timo Huovinen

Oturumu yeniden oluşturmak için öldürüyorsanız, emin olun, ancak bu özel bir durumdur. Genel olarak, uygulamanın en başında bir kez çalıştırılan ve session_start () işlevinin gittiği kod olmalıdır.
SamT

1
örneğin, bir uygulama oturumları bir dosyada depolar ve aynı anda 2 yavaş veri isteği yüklemesi gerekir, bu isteklerin hiçbiri oturum gerektirmez, ancak session_start oturum dosyasını kilitlediğinden biri diğerini engeller.
Timo Huovinen

Kesinlikle. @YuriKolovsky haklı. Alex'in sorusu uygun, çünkü bu davalar olabilir ve nadir değildir.
Paulo Coghi - Monica'yı

14
-1, Çoğu web sitesi CMS güdümlüdür ve genellikle farklı taraflarca yazılmış, birbirlerinin kodlarının oturumlara başlayıp başlamadığını bilmeyen tema ve eklentiler gibi şeylere sahiptir. Bunun bir kod organizasyonu sorunu olduğu anlamına gelmek yanlış bir sorundur.
Jimbo Jonny

0
session_start();
if(!empty($_SESSION['user']))
{     
  //code;
}
else
{
    header("location:index.php");
}

0

PHP_VERSION_ID , PHP 5.2.7'den itibaren kullanılabilir, bu yüzden önce bunu kontrol edin ve gerekirse oluşturun. session_statusPHP 5.4'ten itibaren kullanılabilir, bu yüzden bunu da kontrol etmeliyiz:

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();
    }
}

0

Uygulamama göre, erişmeden önce komut dosyasını kullanmak için her seferinde $_SESSION[]aramanız gerekir session_start. Kılavuz için aşağıdaki bağlantıya bakın.

http://php.net/manual/en/function.session-start.php

Benim için en azından session_startbir isim olarak kafa karıştırıcı. A session_loaddaha açık olabilir.


0

Ben durumu çift kontrol ile sona erdi. php 5.4+

if(session_status() !== PHP_SESSION_ACTIVE){session_start();};
if(session_status() !== PHP_SESSION_ACTIVE){die('session start failed');};

0

Bir PHP oturumunun başlayıp başlamadığını kontrol etmek için aşağıdaki çözümü kullanabilirsiniz:

if(session_id()== '')
{
   echo"Session isn't Start";
}
else
{
    echo"Session Started";
}

Geçerli cevap daha ayrıntılıdır.
Clément Prévost

0

Bir oturumun başlayıp başlamadığını belirlemek için kullandığım budur. Empty ve isset kullanarak aşağıdaki gibi:

if (empty($_SESSION)  && !isset($_SESSION))  {
    session_start();
}

-3

Şununla değiştir session_start();:

if (!isset($a)) {
    a = False;
    if ($a == TRUE) {
        session_start();
        $a = TRUE;
    }
}

kod hataları içerir ve yalnızca aynı dosya birden çok kez eklenirse çalışır, ancak bir kapatma içinde olmazsa çalışır.
BananaAcid
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.