PHP会话已经开始[重复]

Posted

技术标签:

【中文标题】PHP会话已经开始[重复]【英文标题】:PHP session has already been started [duplicate] 【发布时间】:2019-09-16 00:50:12 【问题描述】:

我的网站上有一个使用 ajax 调用 php 文件的页面。我要求用户登录以访问任一页面,并在调用 php 文件的页面上使用session_start()(假设main.php 调用bg.php)。我在bg.php 上也包含了session_start(),因为我需要访问会话变量。但是,我收到垃圾邮件的 php 通知说

A session had already been started - ignoring session_start()

所以,我尝试使用

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

但是,我一直收到错误消息,所以我尝试完全删除它,因为它说它无论如何都会被忽略。然而,随后bg.php 停止识别会话变量。我怎样才能停止收到通知?

【问题讨论】:

***.com/questions/10648984/… 【参考方案1】:

我喜欢这样处理 php 会话控制: 验证用户后,我将设置一个会话变量。 喜欢:

   $permitted_chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

   $_SESSION['loggedIn']=generate_string($permitted_chars, 20);

然后在每个页面的顶部我希望我的会话控制是:

        <?php
        session_start();
         if (empty($_SESSION['loggedIn']))
          header("Location: login.php");
          exit();
            

编辑:另外,如果您正在加载外部页面,例如 dbconnect.php 页面,您只需输入:

        <?php
        if (empty($_SESSION['loggedIn']))
         header("Location: login.php");
        exit();
        

在这些文件的顶部....

如果我真的很健壮,那么我在登录时将“登录”生成的代码存储在数据库表中,将几个标识符(如用户和密码)加载到会话变量中,然后在我的初始检查之后,我会检查会话是否有效,如

     " select count users from user_tbl where `name`=`".$_SESSION['name']."` and `pass`=`".$_SESSION['pass']."` and `key`=`".$_SESSION['loggedIn']."`"

然后

       if ($count=="0")
        header("Location: login.php");
      exit(); 
       

【讨论】:

【参考方案2】:

我建议编写一个库文件,它首先包含在所有 .php 文件中。它包含函数和启动代码,由所有/许多其他页面连接。这有助于创建清晰的结构并避免复制和粘贴常见的代码部分。

*.php

<?PHP
require_once("lib-standard.php");
# .... more code

lib-standard.php

<?PHP
session_start();
# more startup code (locale, timezone, login, check users, check rights, ...)
# common functions
# common classes

【讨论】:

【参考方案3】:

您应该使用session_status() 函数检查会话状态以避免重复会话启动。例如:

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

【讨论】:

以上是关于PHP会话已经开始[重复]的主要内容,如果未能解决你的问题,请参考以下文章

PHP中的会话已经开始错误[重复]

会话开始错误 [重复]

增加PHP中的会话超时[重复]

php检索会话变量以限制对页面的访问[重复]

由于不活动而导致会话超时[重复]

在php中登录管理面板时出现此错误[重复]