2

这是我的代码:

我的根目录是: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”中。位于根目录/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 文件负责我的会话控制。位于根目录/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->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 中回显。有谁知道为什么?谢谢。

4

2 回答 2

2

session_start()必须在要设置或获取会话变量的每个 php 文件的开头调用。我看到你打电话的唯一地方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']; ?>header 的一部分起作用了。刷新并且<?php echo $session->uid; ?>也有效,因此它回响了两次。这告诉我你的类没有将 ID 分配给类变量,希望这是我想要的结果,或者你可以根据需要调整它。

它在这里工作

更新 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>
于 2013-02-19T19:28:47.180 回答
0

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

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

不正确。您不以 a 开头/,因此路径是相对的,并且考虑到您的位置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');

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

于 2013-02-19T19:28:06.297 回答