如何在包含的文件中访问$ _SESSION?

时间:2013-02-19 19:10:38

标签: php session include

这是我的代码:

我的根目录是: root

位于root / index.php

的index.php文件
<?php 
require_once('root/includes/initialize.php');
<?php template('header.php', 'TITLE');?>;
?>

<div id="main">
//SOME CONTENT
</div>

我的initialize.php文件获取了我的所有核心包含文件,并将它们放入一个“require_once”。位于root / includes / initialize.php

<?php
//Define Path
defined('LIB_PATH') ? null : define('LIB_PATH', 'root/includes/');

//Core Functions
require_once(LIB_PATH.'functions.php');

//Core Objects
require_once(LIB_PATH.'_database.php');
require_once(LIB_PATH.'_session.php');

//Classes
require_once(LIB_PATH.'_user.php');
?>

更新**

我的functions.php文件包含一个简单的模板功能,可以抓取模板文件,例如我的header.php。它位于root / includes / functions.php

<?php
//Templating
function template($path="", $pageTitle=NULL) {
    if ($pageTitle != NULL) {
        $_POST['page_title'] = $pageTitle;
    }
    include(root/public/templates/'.$path);
}
?>

我的_session.php文件负责我的会话控制。位于root / includes / _session.php

<?php

/**
* Class for Sessions
*/
class Session
{
    public $logged_in = FALSE;
    public $uid;

    function __construct() {
        session_start();
        $this->check_login();
    }

    public function check_login() {
        if (isset($_SESSION['uid'])) {
            $this->uid = $_SESSION['uid'];
            $this->logged_in = TRUE;
        } else {
            unset($this->uid);
            $this->logged_in = FALSE;
        }
    }

    public function logged_in() {
        return $this->logged_in;
    }

    public function login($user) {
        if ($user) {
            $this->uid = $_SESSION['uid'] = $user;
            $this->logged_in = TRUE;
        }
    }

    public function logout() {
        unset($_SESSION['uid']);
        session_unset();
        session_destroy();
        redirect(WEB_ROOT);
    }
}

$session = new Session();

?>

更新**

我的header.php占据了我网站中所有网页的顶部。位于root / public / templates / header.php中。这是我遇到问题的文件,我无法弄清楚为什么我无法在此文件中回显$ session-&gt; uid或$ _SESSION ['uid']。

<html>
<head>
    <!--CSS-->
    <link rel="stylesheet" type="text/css" href="root/public/css/style.css">

    <title>MY SITE</title>
</head>
<body>
    <div id="header">
        <div id="logo">
            <a href="root"><?php echo $_POST['page_title'];?></a>
        </div>
        <?php echo $session->uid;?> //DOESN'T WORK
    </div>

我能够在我的index.php文件和我网站上的其他文件中回应一切,但不包含在header.php中。谁知道为什么?感谢。

2 个答案:

答案 0 :(得分:2)

必须在每个要设置或获取会话变量的php文件的开头调用<session_start()。我看到你调用session_start()的唯一地方是在一个文件中。

http://www.php.net/manual/en/session.examples.basic.php

<?php
session_start();
if (!isset($_SESSION['count'])) {
  $_SESSION['count'] = 0;
} else {
  $_SESSION['count']++;
}
?> 

另请注意。我正在查看您的课程Session,我没有看到任何地方也$mySession = new Session();开始会话。

更新:

我在IDE中重新创建了基本的文件结构和代码,并通过在课程中添加此行来使其工作。

public function check_login() {
    if (isset($_SESSION['uid'])) {
        $this->uid = $_SESSION['uid'];
        $this->logged_in = TRUE;
    }
    else {
        unset($this->uid);
        $this->logged_in = FALSE;
        $_SESSION['uid'] = session_id();

        /*Add this next line */
        $this->uid = $_SESSION['uid'];
    }
}

我第一次运行index.php只是标题工作的<?php echo $_SESSION['uid']; ?>部分。刷新,<?php echo $session->uid; ?>也起作用,所以它回应了两次。这告诉我你的班级没有将ID分配给一个类变量,希望这是我想要的结果,或者你可以根据需要调整它。

It Works Here

更新2:

功能文件(编辑以匹配您的路径,但您需要返回一个字符串)

<?php

//Templating
function template($path = "", $pageTitle = NULL) {
    if ($pageTitle != NULL) {
        $_POST['page_title'] = $pageTitle;
    }
    return "$path";
}
?>

然后在Index.php文件中添加以下方式:

<?php
require_once('initialize.php');
include(template('header.php', 'TITLE'));
//include('header.php');
?>

<div id="main">
    //SOME CONTENT
</div>
</body>
</html>

_session.php文件:

<?php

/**
 * Class for Sessions
 */
class Session
{

    public $logged_in = FALSE;
    public $uid;

    function __construct() {
        session_start();
        $this->check_login();
    }

    public function check_login() {
        if (isset($_SESSION['uid'])) {
            $this->uid = $_SESSION['uid'];
            $this->logged_in = TRUE;
        }
        else {
            unset($this->uid);
            $this->logged_in = FALSE;

            $_SESSION['uid'] = session_id();
            $this->uid = $_SESSION['uid'];
        }
    }

    public function logged_in() {
        return $this->logged_in;
    }

    public function login($user) {
        if ($user) {
            $this->uid = $_SESSION['uid'] = $user;
            $this->logged_in = TRUE;
        }
    }

    public function logout() {
        unset($_SESSION['uid']);
        session_unset();
        session_destroy();
        redirect(WEB_ROOT);
    }

}

$session = new Session();
?>

并且header.php

<html>
    <head>
        <!--CSS-->
        <link rel="stylesheet" type="text/css" href="style.css">

        <title>MY SITE</title>
    </head>
    <body>
        <div id="header">
            <div id="logo">
                <a href="root"><?php echo $_POST['page_title'];?></a>
            </div>
            <?php echo $session->uid; ?> //WORKS NOW
            <?php echo $_SESSION['uid']; ?> //WORKS NOW
        </div>

答案 1 :(得分:0)

这个问题很模糊。我的猜测是,自index.php文件位于root/index.php,然后是您的包含路径:

require_once('root/includes/initialize.php');
include('root/public/templates/header.php');

不正确。您不是以/开头,因此路径是相对的,并且考虑到index.php的位置,您包括root/root/includes/initialize.php。如果是这种情况,您应该很容易发现您网页上缺少<title>MY SITE</title><a href="root">TITLE</a>。不是吗?

如果这是问题,我建议您定义某种HOME常量,例如

define ('HOME', dirname(__FILE__));
// or define ('HOME', __DIR__); depending on your PHP version

这样你就可以包含与常量相关的所有内容

require_once(HOME . '/includes/initialize.php');

除此之外,我没有在您的代码中看到任何错误。