我不需要使用session_start()来使用会话全局变量吗?

时间:2014-03-25 19:41:31

标签: php session

新手php学习者。我在一本书中读到,并继续在某些论坛和教程中看到这一点:语句:session_start()是访问所有全局会话变量所必需的。然而,stackoverflow提供的多个解决方案建议使用这种块:

if(!(_isset($_SESSION['user']))){
   session_start()
}

能够访问会话变量。根据我的理解,会话变量$ _SESSION [' user']只能通过启动会话设置在以前的php文件中,而且只有"只有"调用session_start()语句后,当前页面可见。然而它产生了通知:

Notice: A session had already been started - ignoring session_start().

我错过了什么?

谢谢大家!

4 个答案:

答案 0 :(得分:3)

您的第一个代码块应该是检查会话变量是否已设置,而不是会话中存在用户变量:

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

但是,如果您确保每页只有一个session_start(),那么您可以避免"会话已经启动"通知。

答案 1 :(得分:3)

session_start()是读取/设置任何会话变量所必需的。

通常,我认为您的代码应如下所示:

session_start()
if(!(_isset($_SESSION['user']))){
   // do stuff here
}

但是,错误消息表示您已在文件的其他位置启动了会话。

答案 2 :(得分:1)

你可能在某处开启了auto_start(php.ini,.htaccess等)? http://www.php.net/manual/en/session.configuration.php#ini.session.auto-start

答案 3 :(得分:1)

以下是触发错误的方案:

的index.php:

 <?php session_start(); 
    require_once('some-page.php'); ?>

一些-page.php文件:

<?php session_start(); // this would make an error when included to index.nl ?>

some-page.php不应该有session-start,因为index.php已经启动了会话。

另请注意,转到其他页面甚至关闭标签页都不会重置会话变量!因此,如果您设置S_SESSION['user'] = 'someuser';,则关闭标签并再次转到该网站,会话仍在那里,$ _SESSION [&#39; user&#39;]仍然会有一些用户作为价值!要手动破坏会话,请使用session_destroy();