1

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

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

修复了上面的参数错误……直接把session类放到我的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 文件不再存在)。

4

2 回答 2

2

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

<?php
include "path_to_session.php";
$handler = new Session();
于 2013-06-11T14:39:50.987 回答
1

试试看include

include 'session.php';
于 2013-06-11T14:39:30.660 回答