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

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

助けてくれてありがとう!

アップデート

いくつかのエラーを修正しました...変更を反映するために上記のコードを編集しましたが、整理する必要がある新しいエラーがいくつかあります。

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 には、6 つのパラメーターを渡す必要があります。

私はここでこれを読みます: 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 ファイルはもう存在しません)。

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 に答える