0

カスタム セッション ハンドラを機能させるために誰か助けてもらえますか?

一部のページではセッションをDBに書き込みますが、他のページではセッションをデータなしで書き込みます。また、print_r($_SESSION) はセッション変数を表示しなくなりました。

データベース テーブル:

id - varchar(32 - NULL No - Default None - Primary Key
access - int(10) - unsigned - NULL Yes - Default NULL
data - text - NULL Yes - Default NULL

フロントコントローラー (オーダーメイドのフレームワーク)

require_once('../application/models/sessionfn.php');

session_set_save_handler('_open','_close','_read','_write','_destroy','_clean');
session_start(); 

sessionfn.php で

function _open()
{
    $config = Configuration::getInstance();
    $host=$config->get("dbhost");
    $dbname=$config->get("db");

    $user=$config->get("dbuser");
    $pass=$config->get("dbpass");

    $dbh = new PDO("mysql:host=$host;dbname=$dbname",$user,$pass); 
}   

function _close()
{
    $dbh = null;
}

function _read($id)
{
    $config = Configuration::getInstance();
    $host=$config->get("dbhost");
    $dbname=$config->get("db");
    $user=$config->get("dbuser");
    $pass=$config->get("dbpass");

    $dbh = new PDO("mysql:host=$host;dbname=$dbname",$user,$pass);
    $sth = $dbh->prepare("SELECT data FROM sessions WHERE id = '$id'");
    $sth->execute();
}

function _write($id, $data)
{
    $config = Configuration::getInstance();
    $host=$config->get("dbhost");
    $dbname=$config->get("db");
    $user=$config->get("dbuser");
    $pass=$config->get("dbpass");

    $dbh = new PDO("mysql:host=$host;dbname=$dbname",$user,$pass);
    $access = time();
    $sth = $dbh->prepare("REPLACE INTO sessions VALUES ('$id', '$access', '$data')");
    $sth->execute();
}

function _destroy($id)
{   
    $config = Configuration::getInstance();
    $host=$config->get("dbhost");
    $dbname=$config->get("db");
    $user=$config->get("dbuser");
    $pass=$config->get("dbpass");

    $dbh = new PDO("mysql:host=$host;dbname=$dbname",$user,$pass);
    $sth = $dbh->prepare("DELETE FROM sessions WHERE id = '$id'");
    $sth->execute();
}

function _clean($max)
{
$config = Configuration::getInstance();
$host=$config->get("dbhost");
    $dbname=$config->get("db");
    $user=$config->get("dbuser");
    $pass=$config->get("dbpass");

    $dbh = new PDO("mysql:host=$host;dbname=$dbname",$user,$pass);
    $old = time() - $max;
    $sth = $dbh->prepare("DELETE FROM sessions WHERE  access < '$old'");
    $sth->execute();
}
4

1 に答える 1

0

私が実践的でない場合、コードをデバッグするのは非常に困難です。:-)

しかし、これは役立つかもしれません:あなた自身のセッションハンドラーをデバッグする方法は?

出力をファイルに書き留めることができるシステムをセットアップします。独自のセッションハンドラーを使用する場合、エラーは表示されません。

したがって、独自のカスタムログファイルに書き込むwriteToLog($ someStr)という関数をsessionfn.phpに追加します。それにタイムスタンプを追加します。既存のファイルに追加します。

これで、関数呼び出しのすべての戻り値を確認できます。

ログファイルを空にして、テストを開始するだけです。各ステップで、ログファイルを確認します。

設定するのはそれほど手間がかからず、すべての問題を確認できます。

于 2012-10-08T11:49:33.803 に答える