2013-06-11 2 views
0

Почему мое приложение не может найти обработчик сеанса? Я получаю это за ошибку:Неустранимая ошибка: класс 'xxx' не найден

Fatal error: Class 'Session' not found in /Users/Eamon/Sites/index.php on line 2

EDIT 2 (переработан index.php)

Вот мой index.php:

<?php 
class Session 
{ 
private $savePath; 

function open($savePath, $sessionName) 
{ 
    $this->savePath = $savePath; 
    if (!is_dir($this->savePath)) { 
     mkdir($this->savePath, 0777); 
    } 

    return true; 
} 

function close() 
{ 
    return true; 
} 

function read($id) 
{ 
    return (string)@file_get_contents("$this->savePath/sess_$id"); 
} 

function write($id, $data) 
{ 
    return file_put_contents("$this->savePath/sess_$id", $data) === false ? false : true; 
} 

function destroy($id) 
{ 
    $file = "$this->savePath/sess_$id"; 
    if (file_exists($file)) { 
     unlink($file); 
    } 

    return true; 
} 

function gc($maxlifetime) 
{ 
    foreach (glob("$this->savePath/sess_*") as $file) { 
     if (filemtime($file) + $maxlifetime < time() && file_exists($file)) { 
      unlink($file); 
     } 
    } 

    return true; 
} 
} 

$handler = new Session(); 
session_set_save_handler(
    array($handler, 'open'), 
    array($handler, 'close'), 
    array($handler, 'read'), 
    array($handler, 'write'), 
    array($handler, 'destroy'), 
    array($handler, 'gc') 
); 

// the following prevents unexpected effects when using objects as save handlers 
register_shutdown_function('session_write_close'); 

session_start(); 
// proceed to set and retrieve values by key from $_SESSION 
// set time-out period (in seconds) 
$inactive = 600; 

// check to see if $_SESSION["timeout"] is set 
if (isset($_SESSION["timeout"])) { 
// calculate the session's "time to live" 
$sessionTTL = time() - $_SESSION["timeout"]; 
if ($sessionTTL > $inactive) { 
    session_destroy(); 
    echo "session destroyed;" 
} 
} 
?> 
<html>...<html> 

<?php 
session_destroy(); 
?> 

session.php (я в основном скопировали это отсюда: http://phpmaster.com/writing-custom-session-handlers/):

EDIT (добавлен интерфейс, как показано ниже).

<?php 
    interface SessionHandlerInterface 
    { 
     public function open($path, $name); 
     public function read($sessionId); 
     public function write($sessionId, $data); 
     public function close(); 
     public function destroy($sessionId); 
     public function gc($lifetime); 
    } 
class Session implements SessionHandlerInterface { 
    // implement interfaces here 

    function open($path, $name) { 
     $db = new PDO("mysql:host=localhost;dbname=itit", "root", "bonjour3"); 

     $sql = "INSERT INTO session SET session_id =" . $db->quote($sessionId) . ", session_data = '' ON DUPLICATE KEY UPDATE session_lastaccesstime = NOW()"; 
     $db->query($sql);  
    } 


    function read($sessionId) { 
     $db = new PDO("mysql:host=localhost;dbname=itit", "root", "bonjour3"); 

     $sql = "SELECT session_data FROM session where session_id =" . $db->quote($sessionId); 
     $result = $db->query($sql); 
     $data = $result->fetchColumn(); 
     $result->closeCursor(); 

     return $data; 
    } 


    function write($sessionId, $data) { 
     $db = new PDO("mysql:host=localhost;dbname=itit", "root", "bonjour3"); 

     $sql = "INSERT INTO session SET session_id =" . $db->quote($sessionId) . ", session_data =" . $db->quote($data) . " ON DUPLICATE KEY UPDATE session_data =" . $db->quote($data); 
     $db->query($sql) 
    } 


    function close() { 
     $sessionId = session_id(); 
     //perform some action here 
    } 


    function destroy($sessionId) { 
     $db = new PDO("mysql:host=localhost;dbname=itit", "root", "bonjour3"); 

     $sql = "DELETE FROM session WHERE session_id =" . $db->quote($sessionId); 
     $db->query($sql); 

     setcookie(session_name(), "", time() - 3600); 
    } 


    function gc($lifetime) { 
     $db = new PDO("mysql:host=localhost;dbname=itit", "root", "bonjour3"); 

     $sql = "DELETE FROM session WHERE session_lastaccesstime < DATE_SUB(NOW(), INTERVAL " . $lifetime . " SECOND)"; 
     $db->query($sql); 
    } 
} 
?> 

Спасибо за любую помощь!

UPDATE

Я исправил несколько ошибок ... Я отредактировал мой код выше, чтобы отразить мои изменения, однако у меня есть несколько новых ошибок, которые нуждаются в сортировке:

Warning: Wrong parameter count for session_set_save_handler() in /Users/Eamon/Sites/index.php on line 4 

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /Users/Eamon/Sites/index.php:1) in /Users/Eamon/Sites/index.php on line 5 

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /Users/Eamon/Sites/index.php:1) in /Users/Eamon/Sites/index.php on line 5 

UPDATE 2

По-видимому,

The function session_set_save_handler requires six parameters be passed to it.

Я прочитал это здесь: http://forums.phpfreaks.com/topic/18940-session-set-save-handler-problem/

UPDATE 3

Исправлена ​​ошибка выше параметра ... просто поставить класс сеанса непосредственно в моем index.php (я изменил код выше, чтобы отразить мои изменения в index.php). В принципе ... У меня именно то, что вы видите в примере 2 здесь - http://php.net/manual/en/function.session-set-save-handler.php.

Вот новая ошибка я получаю:

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /Users/Eamon/Sites/templates/showuser.php:1) in /Users/Eamon/Sites/templates/showuser.php on line 2

Вот showuser.php:

<?php 
    session_start(); 

    $host="localhost"; // Host name 
    $uname="root"; // Mysql username 
    $password="bonjour3"; // Mysql password 
    $db_name="itit"; // Database name 
    $tbl_name="users"; // Table name 

    // Connect to server and select database. 
    $mysqli = mysqli_connect($host, $uname, $password, $db_name); 
    $stmt = $mysqli->prepare("SELECT email FROM users WHERE username = ?"); 
    $stmt->bind_param("s", $_SESSION["username"]); 
    $stmt->execute(); 
    $stmt->bind_result($em); 
    $stmt->fetch(); 
?> 

<h2>Username - Email</h2> 
<div id="userinfo"><? echo $_SESSION["username"] ?> - <? echo $em ?></div> 

<? 
    $stmt->close(); 
    mysqli_close($mysqli); 
?> 

снова ... проверить изменения, которые я сделал в index.php (Файл session.php больше не существует).

ответ

2

Вы должны включить session.php файл для того, чтобы получить доступ к его классу

<?php 
include "path_to_session.php"; 
$handler = new Session(); 
+0

@ YogeshSuthar..fixed it - но теперь я получаю 'Fatal error: Interface 'SessionHandlerInterface' не найден в xxx' Я нашел это - http://php.net/manual/en/class.sessionhandlerinterface.php. Ниже приведен комментарий, чтобы добавить его в пространство имен ... я не знаю, что это значит. – ewizard

+0

@ewizard Вы должны также включить путь к этому интерфейсу. –

+0

, поэтому мне нужно создать интерфейс в файле с именем SessionHandlerInterface.php? Или я могу это сделать откуда-то ... У меня нет этого файла в моем каталоге. – ewizard

1

Попробуйте include it.

include 'session.php'; 
+0

@SharonHaimPourthanks ... получил его сверху ответ - но я получаю новую ошибку, если вы читаете мой комментарий выше , – ewizard

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