PDA

View Full Version : چجوری مشکل حذف شدن سشن رو تو این کد ذخیره سشن با دیتابس رو بر طرف کنم؟



saeed-71
جمعه 24 مرداد 1393, 17: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();
}

}

saeed-71
سه شنبه 28 مرداد 1393, 15:20 عصر
کسی نمیدونه؟

mostafa272
سه شنبه 28 مرداد 1393, 18:29 عصر
اگر به دوتا سشن متفاوت نیاز داری چرا اونا رو دو موجودیت جدا در نظر نمی گیری و هر کدوم رو تو جدول خودش ثبت نمیکنی(حالا به فرض که از نظر طراحی پایگاه داده درست نباشه ولی برنامه ات نیاز داشته باشه)! می تونی یه صفت جدید به عنوان زمان ایجاد سشن برای موجودیت سشن(جدول سشن ها) تعریف کنی و از روی مقایسه زمان بین شون فرق بذاری یا مثلا یک صفت به عنوان برچسب سشن تعریف کنی یا هر روش دیگه ای که باهاش بتونی اونا رو تفکیک کنی.

saeed-71
پنج شنبه 30 مرداد 1393, 20:46 عصر
یعنی واقعا کسی نمیتونه کمکی کنه؟واقعا نیازش دارم