PHPファイルがあります。これは、セッションを開始したページとセッションを開始していないページから呼び出されることがあります。したがって、このスクリプトにsession_start()
があると、 "session already started"というエラーメッセージが表示されることがあります。そのために私はこれらの行を入れました:
if(!isset($_COOKIE["PHPSESSID"]))
{
session_start();
}
しかし今回は私はこの警告メッセージを得ました:
Notice:未定義の変数:_SESSION
セッションがすでに開始されているかどうかを確認するためのより良い方法はありますか?
私が@session_start
を使うなら、それは物事がきちんと動くようにして、ただ警告を黙らせるでしょうか?
PHP> = 5.4.0、PHP 7 のバージョンに推奨される方法
if (session_status() == PHP_SESSION_NONE) {
session_start();
}
参照: http://www.php.net/manual/en/function.session-status.php
PHP <5.4.0 のバージョン
if(session_id() == '') {
session_start();
}
PHP 5.4.0より前のPHPのバージョンの場合:
if(session_id() == '') {
// session isn't started
}
ただし、私見、セッションが開始されたかどうかわからない場合は、セッション管理コードをリファクタリングすることを実際に検討する必要があります。
とは言っても、私の意見は主観的なものであり、セッションが開始されたかどうかを知ることが不可能な場合がある状況(その例は以下のコメントで説明されています)があります。
PHP 5.4では session_status() が導入されました。これはsession_id()
に頼るよりも信頼性があります。
次のコードを見てください。
session_id('test');
var_export(session_id() != ''); // true, but session is still not started!
var_export(session_status() == PHP_SESSION_ACTIVE); // false
そのため、セッションが開始されたかどうかを確認するために、PHP 5.4で推奨される方法は次のとおりです。
session_status() == PHP_SESSION_ACTIVE
あなたはこれを行うことができます、そしてそれは本当に簡単です。
if (!isset($_SESSION)) session_start();
それが役に立てば幸い :)
PHP 5.4より前では、グローバルフラグを設定する以外に信頼できる方法を知ることはありません。
検討してください:
var_dump($_SESSION); // null
session_start();
var_dump($_SESSION); // array
session_destroy();
var_dump($_SESSION); // array, but session isn't active.
または
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.
したがって、PHP 5.4より前のバージョンでは、グローバルブール値を設定する必要があります。
if (version_compare(phpversion(), '5.4.0', '<')) {
if(session_id() == '') {
session_start();
}
}
else
{
if (session_status() == PHP_SESSION_NONE) {
session_start();
}
}
すべてのphpバージョン
if ((function_exists('session_status')
&& session_status() !== PHP_SESSION_ACTIVE) || !session_id()) {
session_start();
}
これをチェックして :
<?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();
?>
session_id() を使用します。設定されていない場合は空の文字列を返します。 $_COOKIE
をチェックするよりも信頼性があります。
if (strlen(session_id()) < 1) {
session_start();
}
これはすべてのPHPバージョンで機能するはずです。それはPHPバージョンを決定してから、セッションがPHPバージョンに基づいて開始されているかどうかを確認します。その後、セッションが開始されていない場合は開始します。
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();
}
}
}
if (session_id() === "") { session_start(); }
それが役に立てば幸い !
あなたがする必要がある唯一のことは:
<?php
if(!isset($_SESSION))
{
session_start();
}
?>
そのようなソリューションの効率についてはよくわかりませんが、これは作業中のプロジェクトからのものですこれはデフォルトの言語を定義する必要がある場合にも使用されます。
/**
* Start session
* Fall back to ukrainian language
*/
function valid_session() {
if(session_id()=='') {
session_start();
$_SESSION['lang']='uk';
$_SESSION['lang_id']=3;
}
return true;
}
@
は、関数呼び出しの前に、関数呼び出し中に報告される可能性のあるエラーを抑制します。
@
の前にsession_start
を追加すると、PHPにエラーメッセージを出力しないように指示します。
例えば:
ブラウザに何かを印刷した後にsession_start()
を使用するとエラーが発生するため、PHPには「header cannot be sent:started at(line 12)」のようなメッセージが表示されますが、この場合は@session_start()
が失敗しますしかし、エラーメッセージは画面に印刷されません。
ファイルを含める前、または新しいページにリダイレクトする前に、exit()
関数を使用してください。そうしないと、エラーが発生します。
このコードはすべての場合に使用できます。
<?php
if (session_status() !== PHP_SESSION_ACTIVE || session_id() === ""){
session_start();
}
?>
ページの実行ごとに1回だけ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();
}
}
実のところ、解決されたのでここで説明するには今や手遅れです。これは私のプロジェクトの1つの.incファイルで、料理を選択してレストランのメニューを構成し、順序を削除/追加または変更します。私が働いていたサーバーは実際のバージョンを持っていなかったので私はそれをもっと柔軟にしました。作成者が使用して試してみたいかどうかは、ユーザー次第です。
このコードスニペットは役に立ちますか?
if (!count($_SESSION)>0) {
session_start();
}
PHP 5.3ではこれは私のために働きます:
if(!strlen(session_id())){
session_name('someSpecialName');
session_start();
}
それであなたは持っています。もしあなたがnot at if文を始めないのであれば、セッション開始はどうしても始められないでしょう。
レスポンスは@ Meliza Ramosレスポンス(最初のレスポンスを参照)および http://php.net/manual/en/function.phpversion.phpに基づいています 、
行動:
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();
}
}
次の解決策を使用して、PHPセッションがすでに開始されているかどうかを確認できます。
if(session_id()== '')
{
echo"Session isn't Start";
}
else
{
echo"Session Started";
}
session_start();
if(!empty($_SESSION['user']))
{
//code;
}
else
{
header("location:index.php");
}
これは私がセッションが開始したかどうかを判断するために使用するものです。次のようにemptyとissetを使用します。
if (empty($_SESSION) && !isset($_SESSION)) {
session_start();
}
私はステータスの二重チェックで終わった。 PHP 5.4以降
if(session_status() !== PHP_SESSION_ACTIVE){session_start();};
if(session_status() !== PHP_SESSION_ACTIVE){die('session start failed');};
私の習慣によれば、$_SESSION[]
にアクセスする前に、毎回session_start
を呼び出してスクリプトを使用する必要があります。マニュアルについては、下記のリンクを参照してください。
http://php.net/manual/en/function.session-start.php
私にとって少なくともsession_start
は名前として混乱します。 session_load
はより明確になります。
PHP_VERSION_ID はPHP 5.2.7以降で利用可能ですので、まずこれをチェックし、必要ならば作成してください。 session_status
はPHP 5.4以降で利用可能ですので、これもチェックする必要があります。
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();
}
}