PDA

View Full Version : سوال: مشکل با ذخیره سشن در دیتابیس



mbf5923
دوشنبه 07 بهمن 1392, 15:10 عصر
با سلام خدمت دوستان و اساتید گرامی
یه مشکلی جدیدا برای بنده پیش اومده که بسیار عجیب و غریبه
مت توی یکی از اسکریپت هام از کلاس ذخیره سشن در دیتابیس آقای شهرکی با کمی دخل و تصرف استفاده کردم.توی صفحه لوگین اومدم و نام کاربری رو توی سشن ذخیره میکنم و وارد صفحه مخصوص کاربران میشیم.توی این صفحه چک شده که آیا سشن نام کاربری موجود هست یا نه اگه هست که هیچی و در صورت نبور کاربر رو میفرستیم صفحه لاگین.تا اینجا هیچ مشکلی نیست و در مرورگر فایرفاکس اصلا مشکلی نداریم ولی در مرورگر کروم و اینترنت اکسپلورر وقتی چنیدن بار در صفحه کاربری دکمه f5 رو فشار بدیم و اصطلاحا صفح رو پشت سرهم رفرش کنیم کاربر میره به صفحه لوگین و دیتایی که برای اون ذخیره شده بود از بین میره!!
میخواستم ببینم دوستان کسی در این زمینه تجربه ای داره بنده رو راهنمایی کنه؟
متشکرم

saidshp
دوشنبه 07 بهمن 1392, 16:17 عصر
اگه منظورت این گلاس هست http://barnamenevis.org/showthread.php?286634-%D8%B0%D8%AE%D9%8A%D8%B1%D9%87-Session-%D8%AF%D8%B1-DB-%D8%A8%D9%87-%D8%AC%D8%A7%D9%8A-%D9%81%D8%A7%D9%8A%D9%84&highlight=%DA%A9%D9%84%D8%A7%D8%B3+%D8%B0%D8%AE%DB %8C%D8%B1%D9%87+%D8%B3%D8%B4%D9%86+%D8%AF%DB%8C%D8 %AA%D8%A7%D8%A8%DB%8C%D8%B3

باید قبل از session_start این تابع رو اجرا کنی


register_shutdown_function('session_write_close');


می تونی متد __construct رو به این صورت ویرایش کنی احتمال میدم درست شه.



public function __construct($server,$user,$pass,$db,$time_out=600, $salt='')
{
date_default_timezone_set('Asia/Tehran');
if($salt=='')
{
$salt=md5('http://www.ncis.ir');
}
$this->server=$server;
$this->user=$user;
$this->pass=$pass;
$this->db=$db;
$this->time_out=$time_out;
$this->salt=$salt;
$this->calcHash();
$this->connect();


session_set_save_handler(array(&$this,'Open'),arra y(&$this,'Close'),array(&$this,'Read'),array(&$thi s,'Write'),array(&$this,'Destroy'),array(&$this,'G C'));
register_shutdown_function('session_write_close');
}

sadegh1362
دوشنبه 07 بهمن 1392, 16:22 عصر
سلام
در دو حال این مشکل به وجود میاد و اون اینه که در صفحه ای که از سشن استفاده می کنید از تایمری استفاده شده باشه که در او اسکریبت تایمر از session_start() استفاده شده باشه .
حالت دوم اینه که در پنجره مرور گر شما به طور هم زمان پروژه ای باز باشه که در کدهای خودش از تایمر برای چک کردن session ها استفاده می کنه . در کل استفاده از session خوبه اما کار کردن زیاد با اون و تکرار اجرا معمولا با این مشکلات مواجه میشه .
در آخر اینکه به نظرم یه جایی در کدهای شما و یا کلاسی که ازش استفاده می کنین session داره startچند بار می شه . به هر حال این تجربه من بود .
امید وارم کمک کنه.

mbf5923
دوشنبه 07 بهمن 1392, 17:00 عصر
از دو دوست عزیزی که راهنمایی کردن ممنون
دوست خوبم saidshp
بنده این تغییرات رو ایجاد کردم و توی اجرای اولیه هیچ مشکلی ندارم.توی مرورگر Firefox به خوبی جواب میده و هیچ مشکلی به وجود نمیاد ولی در مرورگرهای دیگه اطلاعات از بین میره در حالی که کد مربوط به سشن هنوز در کوکی مرورگر وجود داره.

saidshp
دوشنبه 07 بهمن 1392, 17:43 عصر
راستش من خودمم قبلا این مشکل برام پیش اومده بود یه سری به منوال تابع session_set_save_handler (http://php.net/manual/en/function.session-set-save-handler.php) که زدم فهمیدم مشکل از کجا بوده و بعد از اضافه کردن کد


register_shutdown_function('session_write_close');

بعد از session_set_save_handler و قبل از session_start مشکل کاملا رفع شد .
البته این کلاس هم رو کروم (تو لینوکسم ie ندارم) تست کردم حتی بدون تغییرات بالا که گفتم هم بدون مشکل کار میکنه.