我正在尝试设置一个到目前为止有效的自定义会话安全处理程序。但我不想以PHP会话格式存储数据,而是以纯JSON格式存储。如何更改读写函数以将php会话数据解码/解码为json。
function write($sessionId, $data) {
$db = new PDO("mysql:host=myhost;dbname=mydb", "myuser", "mypassword");
$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 read($sessionId) {
$db = new PDO("mysql:host=myhost;dbname=mydb", "myuser", "mypassword");
$sql = "SELECT session_data FROM session where session_id =" . $db->quote($sessionId);
$result = $db->query($sql);
$data = $result->fetchColumn();
$result->closeCursor();
return $data;
}
这些功能来自tutorial。作者说:
PHP将序列化的数据传递给write函数,并期望它从read函数序列化,但这并不意味着你必须以这种方式存储它。您可以在写回调中立即反序列化数据,然后根据数据执行某些操作或按照您的意愿存储它。
我曾尝试过以下我认为可以完成这项工作的功能吗?
修改
如果我没有尝试对数据进行json_encode,则会按以下格式写入db:
auth|b:1;LAST_ACTIVITY|i:1407480463;
答案 0 :(得分:2)
传递给write函数的会话数据不可重新排序....有一些方法可以手动执行反序列化,但它们会在某个时刻失败,具体取决于会话数据的复杂程度。所以,这是我的解决方案。
步骤1.在表格中创建一个新字段,并将其命名为" json"您将必须存储json数据和php序列化格式。您可以随意使用json数据,但传递给write函数的$ data必须完全按照传入的方式返回。并且没有(简单)方法正确地执行此操作。所以,只需查看$ _SESSION并对其进行编码即可。然后将$ data和json编码版本存储在表中。您的读操作只需要返回传递给写函数的$数据。
function write($sessionId, $data) {
$db = new PDO("mysql:host=myhost;dbname=mydb", "myuser", "mypassword");
// Convert current $_SESSION to json because it hasn't been destroyed yet.
$json = json_encode($_SESSION);
$quotedSessId = $db->quote($sessionId);
$quotedData = $db->quote($data);
$quotedJson = $db->quote($json);
$sql = "INSERT INTO session SET session_id = $quotedSessionId, session_data = $quotedData, json = $quotedJson ON DUPLICATE KEY UPDATE session_data = $quotedData, json = $quotedJson";
$db->query($sql);
}
function read($sessionId) {
$db = new PDO("mysql:host=myhost;dbname=mydb", "myuser", "mypassword");
$sql = "SELECT session_data FROM session where session_id =" . $db->quote($sessionId);
$result = $db->query($sql);
$result->closeCursor();
return $data;
}