saeed-71
جمعه 24 مرداد 1393, 18:19 عصر
سلام.
چجوری مشکل حذف شدن سشن رو تو این کد ذخیره سشن با دیتابس رو بر طرف کنم؟
شما فرض کنید ما تو صفحه index.php یک سشن با یک مقدار تولید میکنیم.این سشن تو دیتابیس ذخیره میشه.
تا اینجا مشکلی نیست.
اما ما میایم تو صفحه index2.php یه سشن دیگه با یک مقدار دیگه تولید میکنیم.
مشکل ما اینجاست که سشن دومی که تو دیتابیس ذخیره میشه سشن قبلی با مقدارشو از دیتابیس حذف میکنه.
این مشکل تو بقیه صفحاتم تکرار میشه.یعنی اگر سشن جدید ساخته بشه سشن های قبلی از دیتابیس پاک میشن.
مشکل توی اون قسمت sessionWrite iهستش فک کنم.خط 159
مشکل فک کنم اینجاست
public function sessionWrite($id, $data) {
$data = $data;
$expire = time() + $this->expire;
$sql = $this->connection->prepare("INSERT INTO `{$this->sessionTable}` (`id`,`data`,`expire`) VALUES ('{$id}','{$data}','{$expire}') ON DUPLICATE KEY UPDATE `data`='{$data}',`expire`='{$expire}'");
$sql->execute();
}
اینم کل کد
<?php
class DBSessionHandler extends DB {
public $sessionTable = 'sessiondb';
public $autoCreateSessionTable = false;
public $expire = 1200; // 20 minutes
public $autoStart = true;
public $connection;
/**
* Create the session table
*/
public function createTable() {
$this->connection->exec("
CREATE TABLE `{$this->sessionTable}` (
`id` char(32) COLLATE utf8_bin NOT NULL,
`expire` int(11) DEFAULT NULL,
`data` longblob,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
");
}
/**
* Constructor
*/
public function __construct($autoStart = true) {
parent::__construct();
ini_set('session.save_handler', 'user');
$this->autoStart = $autoStart;
if($this->autoStart) {
$this->start();
}
register_shutdown_function(array($this, 'sessionClose'));
}
/**
* Deletes expired session
*/
private function _deleteExpired() {
$expire = time();
$sql = $this->connection->prepare("DELETE FROM `$this->sessionTable` WHERE (`expire`<$expire)");
$sql->execute();
}
/**
* Update the current session ID with a newly generated one.
* @param boolean $deleteOldSession Whether to delete the old associated session values or not
*/
public function regenerateId($deleteOldSession = false) {
$oldId = session_id();
if(empty($oldId)) {
return;
}
session_regenerate_id();
$newId = session_id();
if(!$deleteOldSession) {
$sql = $this->connection->prepare("UPDATE `{$this->sessionTable}` SET `id`='{$newId}' WHERE (`id`='{$oldId}')");
$sql->execute();
}
else {
$expire = time() + $this->expire;
$sql = $this->connection->prepare();
$sql->execute("INSERT INTO `{$this->sessionTable}` VALUES ('{$newId}','{$expire}','')");
}
}
/**
* Actually start the session
*/
public function start() {
session_set_save_handler(
array($this, 'sessionOpen'),
array($this, 'sessionClose'),
array($this, 'sessionRead'),
array($this, 'sessionWrite'),
array($this, 'sessionDestroy'),
array($this, 'sessionGC')
);
session_start();
if(session_id() == '') {
throw new Exception('Failed to start session.');
}
}
/**
* Ends the current session and store session data
* Do not call this method directly.
*/
public function sessionClose() {
$this->_deleteExpired();
if(session_id() !== '') {
session_write_close();
}
}
/**
* Session destroy handler
* Do not call this method directly.
* param string $id session ID
* @return boolean whether session is destroyed successfully
*/
public function sessionDestroy($id) {
$sql = $this->connection->prepare("DELETE FROM `$this->sessionTable` WHERE (`id`=$id)");
$sql->execute();
return true;
}
/**
* Session GC (garbage collector) handler
* Do not call this method directly.
* @param integer $maxLifetime The number of seconds after which data will be seen as 'garbage' and cleaned up.
* @return boolean whether session is GCed successfully.
*/
public function sessionGC($id) {
$this->_deleteExpired();
return true;
}
/**
* Session open handler
* Do not call this method directly.
* @param string @savePath session save path
* @param @sessionName session name
* @return boolean Whether session is opened successfully
*/
public function sessionOpen($savePath, $sessionName) {
return true;
}
/**
* Session read handler
* Do not call this method directly.
* @param string $id session ID
* @return string the session data
*/
public function sessionRead($id) {
$expire = time();
$data = $this->connection->prepare("SELECT `data` FROM `{$this->sessionTable}` WHERE (`id`='$id' AND `expire`>='$expire')");
$res = $data->execute();
//$data = DB::ArrayQuery("SELECT `data` FROM `{$this->sessionTable}` WHERE (`id`='{$id}' AND `expire`>='{$expire}')");
return (count($res) > 0 ? $res[0]['data'] : null);
}
/**
* Session write hanlder
* Do not call this method directly.
* @param string $id Session ID
* @param string $data session data
* @return boolean Whether session write is successful
*/
public function sessionWrite($id, $data) {
$data = $data;
$expire = time() + $this->expire;
$sql = $this->connection->prepare("INSERT INTO `{$this->sessionTable}` (`id`,`data`,`expire`) VALUES ('{$id}','{$data}','{$expire}') ON DUPLICATE KEY UPDATE `data`='{$data}',`expire`='{$expire}'");
$sql->execute();
}
}
چجوری مشکل حذف شدن سشن رو تو این کد ذخیره سشن با دیتابس رو بر طرف کنم؟
شما فرض کنید ما تو صفحه index.php یک سشن با یک مقدار تولید میکنیم.این سشن تو دیتابیس ذخیره میشه.
تا اینجا مشکلی نیست.
اما ما میایم تو صفحه index2.php یه سشن دیگه با یک مقدار دیگه تولید میکنیم.
مشکل ما اینجاست که سشن دومی که تو دیتابیس ذخیره میشه سشن قبلی با مقدارشو از دیتابیس حذف میکنه.
این مشکل تو بقیه صفحاتم تکرار میشه.یعنی اگر سشن جدید ساخته بشه سشن های قبلی از دیتابیس پاک میشن.
مشکل توی اون قسمت sessionWrite iهستش فک کنم.خط 159
مشکل فک کنم اینجاست
public function sessionWrite($id, $data) {
$data = $data;
$expire = time() + $this->expire;
$sql = $this->connection->prepare("INSERT INTO `{$this->sessionTable}` (`id`,`data`,`expire`) VALUES ('{$id}','{$data}','{$expire}') ON DUPLICATE KEY UPDATE `data`='{$data}',`expire`='{$expire}'");
$sql->execute();
}
اینم کل کد
<?php
class DBSessionHandler extends DB {
public $sessionTable = 'sessiondb';
public $autoCreateSessionTable = false;
public $expire = 1200; // 20 minutes
public $autoStart = true;
public $connection;
/**
* Create the session table
*/
public function createTable() {
$this->connection->exec("
CREATE TABLE `{$this->sessionTable}` (
`id` char(32) COLLATE utf8_bin NOT NULL,
`expire` int(11) DEFAULT NULL,
`data` longblob,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
");
}
/**
* Constructor
*/
public function __construct($autoStart = true) {
parent::__construct();
ini_set('session.save_handler', 'user');
$this->autoStart = $autoStart;
if($this->autoStart) {
$this->start();
}
register_shutdown_function(array($this, 'sessionClose'));
}
/**
* Deletes expired session
*/
private function _deleteExpired() {
$expire = time();
$sql = $this->connection->prepare("DELETE FROM `$this->sessionTable` WHERE (`expire`<$expire)");
$sql->execute();
}
/**
* Update the current session ID with a newly generated one.
* @param boolean $deleteOldSession Whether to delete the old associated session values or not
*/
public function regenerateId($deleteOldSession = false) {
$oldId = session_id();
if(empty($oldId)) {
return;
}
session_regenerate_id();
$newId = session_id();
if(!$deleteOldSession) {
$sql = $this->connection->prepare("UPDATE `{$this->sessionTable}` SET `id`='{$newId}' WHERE (`id`='{$oldId}')");
$sql->execute();
}
else {
$expire = time() + $this->expire;
$sql = $this->connection->prepare();
$sql->execute("INSERT INTO `{$this->sessionTable}` VALUES ('{$newId}','{$expire}','')");
}
}
/**
* Actually start the session
*/
public function start() {
session_set_save_handler(
array($this, 'sessionOpen'),
array($this, 'sessionClose'),
array($this, 'sessionRead'),
array($this, 'sessionWrite'),
array($this, 'sessionDestroy'),
array($this, 'sessionGC')
);
session_start();
if(session_id() == '') {
throw new Exception('Failed to start session.');
}
}
/**
* Ends the current session and store session data
* Do not call this method directly.
*/
public function sessionClose() {
$this->_deleteExpired();
if(session_id() !== '') {
session_write_close();
}
}
/**
* Session destroy handler
* Do not call this method directly.
* param string $id session ID
* @return boolean whether session is destroyed successfully
*/
public function sessionDestroy($id) {
$sql = $this->connection->prepare("DELETE FROM `$this->sessionTable` WHERE (`id`=$id)");
$sql->execute();
return true;
}
/**
* Session GC (garbage collector) handler
* Do not call this method directly.
* @param integer $maxLifetime The number of seconds after which data will be seen as 'garbage' and cleaned up.
* @return boolean whether session is GCed successfully.
*/
public function sessionGC($id) {
$this->_deleteExpired();
return true;
}
/**
* Session open handler
* Do not call this method directly.
* @param string @savePath session save path
* @param @sessionName session name
* @return boolean Whether session is opened successfully
*/
public function sessionOpen($savePath, $sessionName) {
return true;
}
/**
* Session read handler
* Do not call this method directly.
* @param string $id session ID
* @return string the session data
*/
public function sessionRead($id) {
$expire = time();
$data = $this->connection->prepare("SELECT `data` FROM `{$this->sessionTable}` WHERE (`id`='$id' AND `expire`>='$expire')");
$res = $data->execute();
//$data = DB::ArrayQuery("SELECT `data` FROM `{$this->sessionTable}` WHERE (`id`='{$id}' AND `expire`>='{$expire}')");
return (count($res) > 0 ? $res[0]['data'] : null);
}
/**
* Session write hanlder
* Do not call this method directly.
* @param string $id Session ID
* @param string $data session data
* @return boolean Whether session write is successful
*/
public function sessionWrite($id, $data) {
$data = $data;
$expire = time() + $this->expire;
$sql = $this->connection->prepare("INSERT INTO `{$this->sessionTable}` (`id`,`data`,`expire`) VALUES ('{$id}','{$data}','{$expire}') ON DUPLICATE KEY UPDATE `data`='{$data}',`expire`='{$expire}'");
$sql->execute();
}
}