致命错误:未找到“xxx”类

时间:2013-06-11 14:38:13

标签: php mysql class session fatal-error

为什么我的应用无法找到会话处理程序?我得到这个错误:

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

编辑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/):

编辑(根据以下评论建议添加界面)。

<?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);
    }
}
?>

感谢您的帮助!

更新

我修正了一些错误...我编辑了上面的代码以反映我的更改,但是我有一些需要整理的新错误:

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

更新2

显然,

  

函数session_set_save_handler需要传递六个参数。

我在这里阅读:http://forums.phpfreaks.com/topic/18940-session-set-save-handler-problem/

更新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 个答案:

答案 0 :(得分:2)

您必须包含session.php文件才能访问其类

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

答案 1 :(得分:1)

尝试include

include 'session.php';