PHP - 会话已经开始 - 忽略session_start(但不是那样做)

时间:2014-11-05 17:43:33

标签: php session cookies

有没有人对这里发生的事情有解释?

我有一个主页,我打电话给session_start()。 然后我有一个PHP脚本,使用Ajax调用。 如果我没有在那里放session_start(),它将无效。 但是,如果我这样做,它可以正常工作,但显示:

  

注意:会话已经启动 - 忽略第2行的C:\ xampp \ htdocs \ dsb \ php \ ds_acc.php中的session_start()

我可能在某个地方犯了一个错误,但这不是一个悖论吗?虽然说,它忽略了session_start(),脚本在删除时会中断。 感谢您的投入。

这里的代码,对不起,如果它有点混淆:

的index.php:

<?php
  session_start();
  require_once("php/ds_acc.php");
?>

ds_acc.php:

<?php
session_start();

require_once("db_login.php");
require_once("permission.php");

if(check_permission("user"))
{   
    if(isset($_REQUEST["action"]))
    {
        switch($_REQUEST["action"])
        {
            case "add":
            add_user();
            break;
        }
    }
}else
{
    echo "error: session invalid";
}

function add_user()
{
}
?>

permission.php:

<?php
require_once("db_login.php");
/* Returns true if permission is granted, otherwise false. */

function check_permission($required_level)
{
    if(!isset($_SESSION["id"]))
    {
        /* Not logged in */
        return false;
    }

    /* reload banned */
    $con = get_con();
    $stmt = $con->prepare("SELECT banned FROM users WHERE id = ?");
    $stmt->bind_param("i", $_SESSION["id"]);
    $stmt->execute();
    $stmt->bind_result($banned);
    $stmt->fetch();
    $stmt->close();
    $con->close();

    if($banned == 1)
    {
        $_SESSION = array();
        session_destroy();
        return false;
    }


    if($_SESSION["permission"] == "admin")
    {
        return true;
    }

    switch($required_level)
    {
        case "user":
            return true;
        case "mod":
            return ($_SESSION["permission"] == "mod");
        default:
            return false;
    }
}
?>

在复制时,我现在意识到它可能与我连接,包括ds_acc.php文件以使用它的功能,同时还使用它来通过Ajax发布数据。我应该在单独的文件中这样做。

(好吧,nvm,stackoverflow显然不喜欢php启动标签) 顺便说一下,在我发布代码之前,我花了很多时间来格式化代码,因为我的一个文件中的第一个<?仅用于3个空格._.

3 个答案:

答案 0 :(得分:1)

错误是,我在我的索引页面中包含了php文件,然后还使用ajax调用它。 因此它将在页面上显示重复的会话错误,而如果通过Ajax调用则需要session_start。

解决方案: 创建一个单独的文件,我在其中放入了ds_account.php中的所有函数。 在ds_acc.php和主页面中包含新文件。

答案 1 :(得分:1)

检查会话是否已启动第1步:

ds_acc.php:

<?php
if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

require_once("db_login.php");
require_once("permission.php");

答案 2 :(得分:0)

session_start();

只能执行一次。只需在index.php上写一次,然后将其从index.php中包含的其余php文件中删除。