4

session_set_save_handlerの設定に問題があります。php.iniをsession.handler=userに構成しました

この簡単なテストは失敗しています:

//Define custom session handler
if(session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write",     "sess_destroy", "sess_gc")){
die('set fine');
}else{
die('Couldn\'t set session handler');

これが私のセッションクラスです。

//Constructor
function __construct(){

//Define custom session handler
if(session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc")){
    die('set fine');
}else{
    die('Couldn\'t set session handler');
}

//Start session
session_start();
}


//Custom session functions
function sess_open($sess_path, $sess_name) {

return true;
}

function sess_close() {

return true;
}

function sess_read($sess_id) {

//Query for session record in
$results = $db->QuerySingleRow("SELECT data FROM sessions WHERE session_id = '$sess_id'");

//Check that record is returned
if ($results != false)
{
    //Session found, pull out data field value
    $sess_data = $results->data;

    //Grab current time
    $CurrentTime = time();

    //Update session record with current timestamp
    $db->Query("UPDATE sessions SET last_updated = $CurrentTime WHERE session_id = '$sess_id'");

    //Return 
    return $sess_data;
}
else
{
    //No session found

    //Grab current timestamp
    $CurrentTime = time();

    //Insert new session to DB
    $db->Query("INSERT INTO sessions (session_id, last_updated) VALUES ('$sess_id', $CurrentTime)");

    //Return blank per nature of session_set_save_handler read()
    return '';
}
}

function sess_write($sess_id, $data) {

//Grab current timestamp
$CurrentTime = time();

//Update session record to hold new data and update last_updated field
$db->Query("UPDATE sessions SET data = '$data', last_updated = $CurrentTime WHERE session_id = '$sess_id'");

return true;
}

function sess_destroy($sess_id) {

//Delete session from DB
$db->Query("DELETE FROM sessions WHERE session_id = '$sess_id'");

return true;
}

function sess_gc($sess_maxlifetime) {

//Get current timestamp
$CurrentTime = time();

//Delete from session based on garbage collection
$db->Query("DELETE FROM sessions WHERE last_updated < $CurrentTime");

return true;
}


}

私が考えることができる唯一のことは、$ dbが私のMySQLDBクラスのオブジェクトであると想定していることですが、クラスを含めてからそのインスタンスを作成することはできません。

DBクラスの車輪の再発明をしたくなかったので、ここでJeff Williamsから入手しました:http ://www.phpclasses.org/package/3698-PHP-MySQL-database-access-wrapper.html

クラス本体の外にそれを含めようとしましたが、ページはレンダリングされず、空白の白いページだけでエラーは発生しません。

<?php
include 'mysql.class.php';
$db = new MySQL(true);

class session
{

//Constructor
function __construct(){
....
4

2 に答える 2

2

セッション保存ハンドラーの設定は失敗します:

session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc")

登録するこれらのコールバックは存在しないため、次のようになります。

var_dump(is_callable("sess_open")); # FALSE

これは、オブジェクトメソッドをコールバックとして適切に登録する必要があるためです。オブジェクトメソッドのコールバックは、2つの要素を持つ配列の形式で記述されます。最初の要素はオブジェクトで、2番目の要素はメソッド名の文字列です。あなたのものに似ているPHPネットからの例:

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

ご覧のとおり、各メソッドは$handler常に最初の要素を持つ単一の配列として記述されています。

$thisクラス内から、同じオブジェクトを参照するために使用できます。ただし、自分で完全に作成する前に、session_set_save_handler()PHPのマニュアルページで情報、例、ユーザーからのメモを確認してください。ケースに合わせて整理する方法はいくつかあります。

于 2012-12-20T01:23:35.293 に答える
1

コンストラクター内で関数を使用する場合は、次の$thisように渡す必要があります。

session_set_save_handler(
    array($this, 'sess_open'),
    array($this, 'sess_close'),
    array($this, 'sess_read'), 
    array($this, 'sess_write'),
    array($this, 'sess_destroy'),
    array($this, 'sess_gc')
);

そして、クラスをインスタンス化します

new SessionClass;

疑問があるときはいつでも、ドキュメントを見ることができます。コメントも必ずお読みください。彼らは通常非常に役に立ちます。

于 2012-12-20T01:31:15.860 に答える