【问题标题】:don't I need to use session_start() to use session global variables?我不需要使用 session_start() 来使用会话全局变量吗?
【发布时间】:2014-05-03 21:25:12
【问题描述】:

一个新手 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().

我错过了什么?

谢谢大家!

【问题讨论】:

  • 这是您的完整代码还是还有更多内容?
  • 检查你是否有一些包含或需要已经开始会话的文件
  • 这是一个一般性的询问,尽管我有一些冗长的脚本会导致该场景。我想我找到了我的答案..(见标记的答案)。不过感谢您的帮助!

标签: php session


【解决方案1】:

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

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

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

【讨论】:

  • 啊!我认为这句话是我澄清的关键:'确保每页有一个 session_start()'!我确实包含了一些执行冗余 session_start() 调用的文件。奇怪的是,通知从来没有出现在不同的 Apache/MySQL/PHP 安装上,我担心某些东西是合法的错误..
【解决方案2】:

需要 session_start() 来读取/设置任何会话变量。

一般来说,我认为你的代码应该是这样的:

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

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

【讨论】:

    【解决方案3】:

    您可能在某个地方(php.ini、.htaccess 等)打开了 auto_start? http://www.php.net/manual/en/session.configuration.php#ini.session.auto-start

    【讨论】:

      【解决方案4】:

      这是一个触发错误的场景:

      index.php:

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

      一些页面.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['user'] 仍然会有 someuser 作为值!要手动销毁会话,请使用session_destroy();

      【讨论】:

      • 感谢您的扩展信息!我认为您的回答是相关的,而且即使关闭选项卡后会话变量也可以持续存在的知识非常有启发性......再次感谢。
      猜你喜欢
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      • 2021-05-18
      • 1970-01-01
      相关资源
      最近更新 更多