2013-02-19 5 views
2

Вот мой код:

Мой корневой каталог: корень

Файл 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». Находится в корневом каталоге/включает/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. Он находится в корневом каталоге/включает functions.php

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

Моего файл/_session.php заботится о моем управлении сеансом. Находится в корневом каталоге/включает/_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. Кто-нибудь знает почему? Благодарю.

+0

Как насчет 'session_start();'? –

+0

@dar - он находится в конструкторе класса сеанса. – Lix

+0

@oob - Вы уверены, что свойство 'uid'/key действительно имеет значение? Не могли бы вы просто повторить пустую строку? – Lix

ответ

2

session_start() должно быть вызвано в начале EVERY 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(); в любом месте, чтобы начать сеанс.

UPDATE:

Я воссоздал свою основную файловую структуру и коду в моем 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; ?> также работал так, что он повторялся дважды. Это говорит о том, что ваш класс не присваивает идентификатор переменной класса, надеюсь, это желаемый результат, поскольку он работал на моем конце, или вы можете подкрутить его по мере необходимости.

It Works Here

UPDATE 2:

Функция File (изменить в соответствии с вашим путем, но вы должны вернуть строку)

<?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> 
+0

Сессия создается в конце класса Session ('$ session = new Session'), а session_start вызывается в методе Session __construct, поэтому он вызывается каждый раз, когда вызывается $ session. – oobie11

+0

Не должно ли это работать, учитывая, что если я загружу свой index.php, он включает initiate.php, а затем header.php? Я попытался включить _session.php в мой заголовок.php, но я получаю ту же проблему :( – oobie11

+0

ОК, поэтому я попробовал просто сделать 'include ('include/_session.php')' в верхней части моего header.php , но я получаю эту ошибку: «Неустранимая ошибка: не удается переопределить класс Session в root/includes/_session.php в строке 6», когда я пытаюсь загрузить индекс.php – oobie11

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'); 

Кроме того, я не вижу ошибок в коде.

+0

Извините Я был неясен. Я использую root в этом вопросе, как место для каталога ROOT моего сайта. Im в локальной среде, когда я создаю свой сайт, поэтому мой корень - это что-то вроде/Users/myname/etc. – oobie11

Смежные вопросы