2

session_set_save_handler() を利用します。それは正常に動作します。ただし、ユーザーのセッション データを変更する必要がある場合があります。write 関数に渡されるセッション データは、次のように内部的に作成されると単純に予想していました。

serialize($_SESSION);

しかし、そうではありません。これらは、単純な PHP のシリアル化されたデータとはわずかに異なる形式を持っています。

user|a:24:{s:2:"id";s:2:"12";s:5:"email";s:19:...CUT...;}last_activity_time|i:1310535031;logged_everywhere|b:1;

session_set_save_handler() の書き込み関数の $_SESSION データをシリアル化するために内部的に使用されるシリアル化の種類を知っている人はいますか? またはさらに良いことに、このデータを操作するために使用できるシリアル化解除およびシリアル化関数があれば?

4

2 に答える 2

3

session_decodesession_encodeのPHP-Dokumentationをご覧ください。コメントには、セッション文字列のシリアル化解除とシリアル化の完全なサンプルがあります。

于 2011-07-13T06:13:13.420 に答える
0

これは、php の内部シリアライザーに関するこの問題に関する私の 2 セントです。ユーザーのセッション外では、実際には解析できません。したがって、session_set_save_handler() を使用してセッション データをデータベースに保存し、書き込みメソッド内で $_SESSION オブジェクトにアクセスできるため、シリアル化された $_SESSION オブジェクトをデータベースに保存してから、読み取りまたは変更できます。そこに。唯一の欠点は、変更された場合、php が使用する内部セッション データの変更にはならないことです。

これにより、オブジェクトではなく、少なくとも現在のユーザーのセッション データへの解析可能なアクセスが可能になります。

function _write($id, $data)
{
    if ($data == "")
    {
        return true;
    }

    global $database_connection;
    global $table_prefix;

    $clean_data = base64_encode(serialize($_SESSION));
    $access = time();

    $id = mysql_real_escape_string($id);
    $access = mysql_real_escape_string($access);
    $data = base64_encode($data);

    $sql = "REPLACE
        INTO " . $table_prefix . "sessions
        VALUES ('$id', '$access', '$data', '$clean_data')";

    return mysql_query($sql, $database_connection);
}
于 2011-09-08T12:55:38.910 に答える