با سلام. آقای شهرکی من هنوز نتونستم کاری کنم که با بستن مرورگر سشن ها از پایگاه حذف بشن . میشه کمک کنید .
کسی این کد رو استفاده کرده ؟ میشه راهنمایی کنید ......
با سلام. آقای شهرکی من هنوز نتونستم کاری کنم که با بستن مرورگر سشن ها از پایگاه حذف بشن . میشه کمک کنید .
کسی این کد رو استفاده کرده ؟ میشه راهنمایی کنید ......
درود
به نظرتون چطوره یه تابعی چیزی بنویسیم که مثلا هر روز یا ... جدول سشن هارو چک کنه و هر رکوردی که modifiedش از تاریخ و ساعت فعلی یکی دوساعت جلوتر بود ( بستگی به مدت زمانی که برای expire شدن سشن در نظر میگیریم ) بیادو اون رکورد رو حذف کنه. اینجوری مرورگرهای که با این کلاس برای حذف سشن سازگار نیستن، دیگه مشکلی نخواهند داشت.
چون مطمئنا رکوردی که تو پایگاه داده از مدت زمان آخرین ویرایشش چند ساعتی گذشته باشه، یعنی اینکه رکورد بی مصرف شده و دیگه به درد نمیخوره. نظرتون چیه؟
اگه از نظر آقای شهرکی اشکالی نداره، کلاسو ویرایش کنم و این قابلیتو بهش اضافه کنم؟
//Copyright محمد مصطفي شهركي @ http://www.barnamenevis.ir
خوب اینکار رو میشه با هر بار لود شدن پیج به سادگی انجامش داد
سلام
من وقتی صفحه index رو اجرا می کنم با این خطا مواجه میشم:
Parse error: parse error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in D:\Xamp 1.6.1\xampp\htdocs\mywebsite\sssh.class.php on line 7
من از php ورژن 4 استفاده می کنم ممکنه مشکل از این باشه؟
من یکم سرچ کردم، کلمه pubic رو از اول توابع حذف کردم و به جای private از var استفاده کردم و سازنده رو به صورت function MySessionHandler تعریف کردم حالا ارور به صورت زیر میاد:
Parse error: parse error, unexpected '{' in D:\Xamp 1.6.1\xampp\htdocs\mywebsite\sssh.class.php on line 37
آخرین ویرایش به وسیله mahsa.norozy : دوشنبه 13 آذر 1391 در 15:13 عصر
ذخیره سشن در سیستم های بزرگ باعث نمیشه که سرعت پایین بیاد؟
پس معلوم میشه دوست عزیز هنوز کارای بزرگ دیتابیسی انجام ندادی .نه عزیز.
اگه شما مدیریت بر اطلاعات سشن در دیتابیس رو کنار سشن در فایل بزارید و با هم مقایسه گنید ، اونوقت متوجه میشید که استفاده از دیتابیس هرچه سیستم بزرگتر باشه دارای سرعت بالاتری هست .
معمولا بهتر است برای سیستم های بزرگ فایل سرور رو از دیتابیس جدا میکنند و عملیات پردازش سمت دیتابیس رو تا آنجایی که میتونن میارن پتیین . و باید بگم سرعت select و update به میزار رکورد ها در دیتابیس خیلی بستگی داره هرچه رکورد ها زیاد تر باشه سرعت اجرای این دستورات پایین تر میاد . پس کار اشتباهی است که بخوام برای سیستم های بزرگ از ذخیره سشن در دیتابیس استفاده کنیم .
بزرگ از نظر شما یعنی چی؟ یعنی چند رکورد در جدول رو حداقل معیار برای بزرگی جدول میدونید؟ بد نیست بدونید ساختار MyISAM به نحوی هست که عملاً تا حدود چند میلیارد رکورد، افت محسوس سرعت نخواهیم داشت (اگه از مواردی مثل Limit با Offset و... استفاده نشه و دیتابیس هم به خوبی نرمالسازی شده باشه). بعلاوه سیستم کاری سشن به نحوی هست که رکوردهای بلا استفاده (سشنهای منقضی شده) حذف میشن. حداقل میشه با کمی تغییر، چنین قابلیتی رو اضافه کرد. بنابراین، چنین مسئله ای محل ایراد نیست. همچنین اگه آسیبهایی مثل Session Hijacking و... رو بررسی کرده باشین، خواهید دید که ارزش داره کمی افت سرعت (که اونهم با روشهایی که گفتم قابل رفعه) رو فدای امنیت بیشتر کنیم. تجربه هم نشون داده سایتها بیشتر بخاطر ناامنی مشتریهاشون رو از دست دادن تا افت سرعت در حد چند صدم ثانیه.
من با این کلاس توی ie مشکل دارم سشن هارو بعد از بستن مرورگر وب پاک نمی کنه
IE توی نسخه های قبلیش درست کار میکرد که این هم بخاطر آپدیتهای فوق العاده مایکروسافت، بهم ریخت! بهرحال باید یکسری تغییرات توی کد ایجاد بشه که سشنهایی که تاریخ انقضای اونها گذشته، از دیتابیس حذف بشن.
مایکروسافت مایکروسافت ننگ به نیرنگ توIE توی نسخه های قبلیش درست کار میکرد که این هم بخاطر آپدیتهای فوق العاده مایکروسافت، بهم ریخت!
خون برنامه های ما میچکد از چنگ تو !
جناب شهرکی
یعنی امکانش هست یک مرورگر بری روی کد های php تاثیر بزاره ؟!
یعنی ممکنه ما یک برنامه بنویسیم که توی یک سری مرورگر ها درست کار بده توی بقیه نداره ؟
ببینید، یکسری کدهای سمت سرور هست که وابسته به هدرهایی هست که توسط مرورگر باید ارسال بشه تا کار کنه و اگه مرورگر اونها رو نفرسته یا درست ارسال نکنه، کدها هم طبیعتاً به درستی کار نمیکنن. البته اینجور کدها خیلی کم هستن (مثل بخش مدیریت سشن و...) ولی بهرحال وجود دارن. برای اینکه مطمئن بشین کلاس درسته و مشکل از مرورگر هست، بدون استفاده از این کلاس با سشن کار کنید و پوشه tmp مسیر Wamp رو چک کنید. خواهید دید که فایل سشن که ساخته میشه، با بسته شدن مرورگر از بین نمیره. معمولاً توی سرورها روی این پوشه Quota میگذارن تا اگه سایزش از یه حد خاصی بیشتر شد، بطور خودکار پاک بشه یا اینکه یک برنامه دائماً درحال اجراست که سایز این پوشه رو چک میکنه و اگه از حد خاصی بیشتر شد، به ترتیب از فایلهای قدیمیتر به جدید، شروع میکنه به حذف کردن تا فضای خالی کافی ایجاد بشه و سایز پوشه هم از حد مجاز بیشتر نشه. اما چون با این کلاس، محل ذخیره سازی سشن رو به دیتابیس منتقل میکنیم، طبیعتاً باید اینکار هم دستی انجام بشه یعنی خودمون براش اسکریپت بنویسیم.
خب پس می شه اینکارو با حذف اطلاعات کل اون جدول در آخر هر شب این مشکل رو حل کرد
هم میشه همه جدول رو حذف کرد، هم فقط رکوردهایی که از زمان آخرین فعالیتشون بیش از زمان مشخصی گذشته.
استاد میشه درباره این query توضیح بدین (تا قسمت insert رو متوجه میشم از on به بعد):
$query="INSERT INTO `sessions` (`id`,`data`,`modified`,`hash`) VALUES ('$safe_id','$safe_data','$now','$hash') ON DUPLICATE KEY UPDATE `data`='$safe_data', `modified`='$now',`hash`='$hash'";
میگه اگه رکوردی که میخواد ثبت بشه، کلید تکراری داشته باشه (فیلد `id`)، دستور UPDATE رو اجرا کنه.
وقتی که کاربر موقع لاگین تیک "مرا بخاطر بسپارید" رو زده باشه و بصورت دستی سسشنها رو از دیتابیس حذف می کنم، کاربر از سایت خارج نمی شه و بدون مشکل به کار ادامه می دهمیگه اگه رکوردی که میخواد ثبت بشه، کلید تکراری داشته باشه (فیلد `id`)، دستور UPDATE رو اجرا کنه.
آیا این موضوع یه حفره امنیتی هست؟
اگر تیک "مرا بخاطر بسپارید" رو نزده باشه و سسشن ها رو بصورت دستی حذف می کنم کاربر از سایت خارج می شه
این مسئله بخاطر اینه که درصورت فعال کردن اون گزینه، برای کاربر کوکی میسازین و داره با استفاده از کوکی لاگین میکنه. ارتباطی به مدیریت سشن نداره.
ممنون ، بابت کلاس ، نظرتون در مورد این 2 تا چیه :
حالت اول :
بعد از این که login کامل انجام شد ، من 3 تا Session درست می کنم ، اولی username را در خودش نگه می داره ، دومی user_id و سومی یک hash هست که این هش توی ه دتابیس ذخیره میشه ، بعد وجود Session های کاربر چک میشه ، و Session سوم هم با دتیابیس تطبیق داده میشه. برای rememberme هم کوکی با همین حالت درست می کنیم یعنی یه کوکی به نام ایمیل درست می کنیم ، یه کوکی هش درتس می کنیم که در دیتابیس هم ذخیره میشه .
حالت دوم :
قسمت Session مثل بالا است ، ولی تو قسمت Cookie ، میام یه Cookie از user_agent یا ip درست می کنیم ، و کوکی Hash را هم در دیتابیس ذخیره نمی کنیم .
به نظر شما از لحاظ امنیت و سرعت کدوم بهتر هستش ؟ در ضمن من برای حالت زمان cookie از setcookie استفاده می کنم ، این روش مطمین هست ؟
آخرین ویرایش به وسیله redhat2 : سه شنبه 25 تیر 1392 در 20:44 عصر
سؤالتون ارتباطی به این تاپیک نداره. لطفاً تاپیک جداگانه ایجاد کنید.
متأسفانه فرصت نکردم تو این مدت روی نسخه جدید کار کنم. اگه خدا بخواد بعد از نشست سوم نهاد تو شیراز روش وقت میگذارم.
با سلام
من در برنامه هام این شکلی استفاده می کنم
من یک کلاسی دارم که در تعدادی متد نوشتم که به ضمیمه آمده است.
سپس در یک کلاس دیگه من اونو گلوبال مینامم و در هر صفحه ام اولین کلاسی است که اینکلود می شه میام و یک مت دارم بعنوان چک کردن اینکه کاربر ورود کرده یا نه به این صورت:
<?php
class customer {
public static function is_customer_loged_in() {
if (isFile::check(class_path . 'class.enc.inc.php')) {
include_once (class_path . 'class.enc.inc.php');
} else {
return false;
}
;
$sess = new the_session;
$enc = new Encryption;
$sess->ses_free_olds();
$ses_id = $sess->ses_id();
$customer_id = $enc->unProtect($sess->ses_read('customer_loged_id'));
$customer_login = $enc->unProtect($sess->ses_read('customer_loged_as'));
db::load_db();
$sql = "SELECT `ID` FROM `customers` WHERE `customer_login` = '{$customer_login}' AND `ID` = {$customer_id} LIMIT 1";
$found = db::recordCount($sql);
$keep_me = @mysql_fetch_array(mysql_query("SELECT `KeepMe` FROM `sessions` WHERE `RndKey`= '$ses_id';"));
if ($keep_me['KeepMe'] == 1 && isset($customer_id) && !empty($customer_id) &&
isset($customer_login) && !empty($customer_login) && $found > 0) {
return true;
}
if (isset($customer_id) && !empty($customer_id) && isset($customer_login) && !
empty($customer_login) && $found > 0) {
return true;
} else {
return false;
}
}
}
فقط همین.
--
در این متد یک $sess->ses_free_olds(); داریم که کارش اینه که جلسات منقضی رو حذف می کنه و اگر در موردی که کاربر «مرا بخاطر بسپار» را اگر تیک زده باشه دیگه وارد بررسی ماهوی نمی شه و دایرکت میکنه به صفحه اصلی
سوالی در این باره بود در خدمت هستم
موفق باشید
دوستان یه سوال ...
به جای این همه کار نمی شه از دستورات زیر موقع لوگین استفاده کرد :
می یایم می گیم اگر سیشن دزدیده شد و طرف خواست استفاده کنه چون آی پیش عوض شد سیشن منقضی بشه .if (isset($_SESSION['admin_last_ip']) === false)
{
$_SESSION['admin_last_ip'] = $_SERVER['REMOTE_ADDR'];
}
if ($_SESSION['admin_last_ip'] !== $_SERVER['REMOTE_ADDR'])
{
session_unset();
session_destroy();
}
سلام
من از این کلاس میخوام با pdo استفاده کنم ولی توی _constuct نمیتونه اتصال و پیدا کنه!
private function connect()
{
$db = database::getInstance();
}
public function __construct($time_out = 1800, $salt = '') {
$db = database::getInstance();
date_default_timezone_set('Asia/Tehran');
if ($salt == '') {
$salt = md5('123456789');
}
//$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'), array(&$this, 'Close'), array(&$this, 'Read'), array(&$this, 'Write'), array(&$this, 'Destroy'), array(&$this, 'GC'));
}
حتما باید توی تمام متد ها این instance ایجاد بشه تا کار کنه!
موقع اجرای کوئری این ارور میاد
Fatal error: Call to a member function query() on a non-object
اگر مثلا تو متد read یا write این خط اولش نوشته بشه دیگه ارور نمیده!!!
$db = database::getInstance();
فقط واسه استفاده بقیه دوستان
چندتا تغییر تووی کدها دادم که دوتا شون روی همین کلاس فعلی قابل استفاده است
یکی کوئری مربوط به تابع cg
DELETE FROM mysessions WHERE MINUTE(TIMEDIFF(NOW(),modified))>=:date
گه من date رو برحسب دقیقه تنظیم کردم
دومی تابع write یک شرط ساده اضافه کردم
if(isset($data) && !empty($data))
واسه جلوگیری از ساخت سشن خالی و اجرای کوئری write وقتیه که کاربر وارد سایت نشده البته این یکی بستگی به برنامه شما و نحوه استفاده از این کلاس
چندتا تغییر دیگه هم هست ولی بیشتر جنبه شخصی و نحوه نوشتن کلاس داره
داخل کلاس از ()self::getInstance استفاده کنید. برای اینکه بهتر بشه راهنمایی کنیم، کد کامل کلاستون رو بگذارین.
سینگلتون هست کلاس اتصال به دیتابیس
این کد کاملش هست
class Config {
public $driver = 'sqlsrv';
public $dbhost = '127.0.0.1';
public $dbuser = 'test';
public $dbpass = '123456';
public $dbname = 'db';
}
class database {
private static $instance;
private $stmt;
private $error = array();
private $sentinel = 1;
private $affectedRows = 0;
private $countRows = 0;
private function __construct() {
$config = new Config();
try {
$this->instance = new PDO($config->driver.":Server=".$config->dbhost.';Database='.$config->dbname, $config->dbuser, $config->dbpass);
return $this->instance;
} catch (Exception $e) {
echo "can not connect.";
}
}
public static function getInstance() {
if (!self::$instance instanceof self) {
self::$instance = new self;
}
return self::$instance;
}
public function query($sql,$params = null) {
$this->stmt = $this->instance->prepare($sql);
$this->stmt->execute($params);
$this->checkQuery();
}
public function loadResult(){
$singleResult = $this->stmt->fetch(PDO::FETCH_NUM);
return $singleResult[0];
}
public function loadColumn(){
$columnList = array();
while($row = $this->stmt->fetch(PDO::FETCH_NUM)){
$columnList[] = $row[0];
}
$this->countRows = count($columnList);
return $columnList;
}
public function loadObject($class_name = "stdClass"){
$object = $this->stmt->fetchObject($class_name);
return $object;
}
public function loadObjectList($class_name = "stdClass"){
$objectList = array();
while($object = $this->stmt->fetchObject($class_name)){
$objectList[] = $object;
}
$this->countRows = count($objectList);
return $objectList;
}
public function loadAssocRow(){
$assocRow = $this->stmt->fetch(PDO::FETCH_ASSOC);
return $assocRow;
}
public function loadAssocList(){
$assocList = array();
while($row = $this->stmt->fetch(PDO::FETCH_ASSOC)){
$assocList[] = $row;
}
$this->countRows = count($assocList);
return $assocList;
}
public function loadIndexedRow(){
$indexedRow = $this->stmt->fetch(PDO::FETCH_NUM);
return $indexedRow;
}
public function loadIndexedList(){
$indexedList = array();
while($row = $this->stmt->fetch(PDO::FETCH_NUM)){
$indexedList[] = $row;
}
$this->countRows = count($indexedList);
return $indexedList;
}
public function loadJsonObject(){
$jsonObject = json_encode($this->stmt->fetch(PDO::FETCH_ASSOC));
return $jsonObject;
}
public function loadJsonObjectList(){
$index = 1;
$jsonObjectList = "";
while($row = $this->loadAssocList()){
$jsonObjectList .= json_encode($row);
if($index <= (count($this->loadAssocList())-1)){
$jsonObjectList .= ",";
}
}
return $jsonObjectList;
}
public function loadXmlDocument($file = null, $root = 'query',$elementName = 'entry'){
$xml = new DOMDocument('1.0','utf-8');
$table = $xml->createElement($root);
foreach ($this->loadAssocList() as $entry){
$element = $xml->createElement($elementName);
foreach ($entry as $node => $value) {
if ($this->valideXmlValue($value)) {
$field = $xml->createElement($node,$value);
$element->appendChild($field);
} else {
$field = $xml->createElement($node);
$cdata = $xml->createCDATASection($value);
$field->appendChild($cdata);
$element->appendChild($field);
}
}
$table->appendChild($element);
}
$xml->appendChild($table);
if ($file != null) {
return file_put_contents($file, $xml->saveXML());
} else {
return $xml->saveXML();
}
}
public function loadCSVFile($file = null){
if($file == null){
$file = date('Ymd-His');
}
$writer = fopen($file.'.csv', 'w');
$temp = $this->loadIndexedList();
foreach ($temp as $row){
fputcsv($writer, $row);
}
return fclose($writer);
}
public function startTransaction(){
$this->instance->beginTransaction();
$this->sentinel = 1;
$this->affectedRows = 0;
}
public function endTransaction(){
if ($this->sentinel == 1) {
$this->instance->commit();
} else {
$this->instance->rollBack();
}
return $this->sentinel;
}
public function getAffectedRows(){
return $this->affectedRows;
}
public function getCountRows(){
return $this->countRows;
}
public function getError(){
$e = array();
$e['ref'] = $this->error[0];
$e['code'] = $this->error[1];
$e['desc'] = $this->error[2];
return $e;
}
private function checkQuery(){
$this->error = $this->stmt->errorInfo();
if ($this->error[0] != 00000) {
$this->sentinel = 0;
}
// simpre que se realiza un SELECT esto pone $sentinel a 1
$this->affectedRows = $this->stmt->rowCount();
if ($this->affectedRows == 0){
$this->sentinel = 0;
}
}
private function valideXmlValue($value){
$chars = array('<','>','&');
foreach($chars as $ilegal) {
$state = strpos($value, $ilegal);
if($state !== FALSE){
return FALSE;
}
}
return TRUE;
}
}
اینو تست کنید:
<?php
class Config {
public $driver = 'sqlsrv';
public $dbhost = '127.0.0.1';
public $dbuser = 'test';
public $dbpass = '123456';
public $dbname = 'db';
}
class database {
private static $instance;
private $stmt;
private $error = array();
private $sentinel = 1;
private $affectedRows = 0;
private $countRows = 0;
private function __construct() {
if(!self::$instance) {
try {
$config = new Config();
self::$instance = new PDO($config->driver.":Server=".$config->dbhost.';Database='.$config->dbname, $config->dbuser, $config->dbpass);
}
catch (Exception $e) {
throw new Exception('Cannot connect.');
}
}
return self::$instance;
}
public static function getInstance() {
return $this->__construct();
}
public function query($sql,$params = null) {
$this->stmt = self::$instance->prepare($sql);
$this->stmt->execute($params);
$this->checkQuery();
}
public function loadResult() {
$singleResult = $this->stmt->fetch(PDO::FETCH_NUM);
return $singleResult[0];
}
public function loadColumn() {
$columnList = array();
while($row = $this->stmt->fetch(PDO::FETCH_NUM)){
$columnList[] = $row[0];
}
$this->countRows = count($columnList);
return $columnList;
}
public function loadObject($class_name = 'stdClass'){
$object = $this->stmt->fetchObject($class_name);
return $object;
}
public function loadObjectList($class_name = 'stdClass'){
$objectList = array();
while($object = $this->stmt->fetchObject($class_name)){
$objectList[] = $object;
}
$this->countRows = count($objectList);
return $objectList;
}
public function loadAssocRow(){
$assocRow = $this->stmt->fetch(PDO::FETCH_ASSOC);
return $assocRow;
}
public function loadAssocList(){
$assocList = array();
while($row = $this->stmt->fetch(PDO::FETCH_ASSOC)){
$assocList[] = $row;
}
$this->countRows = count($assocList);
return $assocList;
}
public function loadIndexedRow(){
$indexedRow = $this->stmt->fetch(PDO::FETCH_NUM);
return $indexedRow;
}
public function loadIndexedList(){
$indexedList = array();
while($row = $this->stmt->fetch(PDO::FETCH_NUM)){
$indexedList[] = $row;
}
$this->countRows = count($indexedList);
return $indexedList;
}
public function loadJsonObject(){
$jsonObject = json_encode($this->stmt->fetch(PDO::FETCH_ASSOC));
return $jsonObject;
}
public function loadJsonObjectList(){
$index = 1;
$jsonObjectList = '';
while($row = $this->loadAssocList()){
$jsonObjectList .= json_encode($row);
if($index <= (count($this->loadAssocList())-1)){
$jsonObjectList .= ',';
}
}
return $jsonObjectList;
}
public function loadXmlDocument($file = null, $root = 'query',$elementName = 'entry'){
$xml = new DOMDocument('1.0','utf-8');
$table = $xml->createElement($root);
foreach ($this->loadAssocList() as $entry){
$element = $xml->createElement($elementName);
foreach ($entry as $node => $value) {
if ($this->valideXmlValue($value)) {
$field = $xml->createElement($node,$value);
$element->appendChild($field);
} else {
$field = $xml->createElement($node);
$cdata = $xml->createCDATASection($value);
$field->appendChild($cdata);
$element->appendChild($field);
}
}
$table->appendChild($element);
}
$xml->appendChild($table);
if ($file != null) {
return file_put_contents($file, $xml->saveXML());
} else {
return $xml->saveXML();
}
}
public function loadCSVFile($file = null){
if($file == null){
$file = date('Ymd-His');
}
$writer = fopen($file.'.csv', 'w');
$temp = $this->loadIndexedList();
foreach ($temp as $row){
fputcsv($writer, $row);
}
return fclose($writer);
}
public function startTransaction(){
self::$instance->beginTransaction();
$this->sentinel = 1;
$this->affectedRows = 0;
}
public function endTransaction(){
if ($this->sentinel == 1) {
self::$instance->commit();
} else {
self::$instance->rollBack();
}
return $this->sentinel;
}
public function getAffectedRows(){
return $this->affectedRows;
}
public function getCountRows(){
return $this->countRows;
}
public function getError(){
$e = array();
$e['ref'] = $this->error[0];
$e['code'] = $this->error[1];
$e['desc'] = $this->error[2];
return $e;
}
private function checkQuery(){
$this->error = $this->stmt->errorInfo();
if ($this->error[0] != 00000) {
$this->sentinel = 0;
}
// simpre que se realiza un SELECT esto pone $sentinel a 1
$this->affectedRows = $this->stmt->rowCount();
if ($this->affectedRows == 0){
$this->sentinel = 0;
}
}
private function valideXmlValue($value){
$chars = array('<','>','&');
foreach($chars as $ilegal) {
$state = strpos($value, $ilegal);
if($state !== FALSE){
return FALSE;
}
}
return TRUE;
}
}
کلاً وقتی static میگذارین با this$ دسترسی پیدا نکنید و از ::self استفاده کنید.
الان به این خط اشکال میگیره!
Fatal error: Using $this when not in object context
public static function getInstance() {
return $this->__construct();
}
خوب این کد رو بجاش بگذارین:
public static function getInstance() {
return new self;
}
باز هم ارور میده!
الان دیگه کلا با همه چیز مشکل داره!
Fatal error: Uncaught exception 'Exception' with message 'Cannot connect.' in \db.php:24 Stack trace: #0 \db.php(30): database->__construct() #1 sssh.class.php(121): database::getInstance() #2 sssh.class.php(136): MySessionHandler->connect() #3 index.php(4): MySessionHandler->__construct() #4 {main} thrown in db.php on line 24
خوب اطلاعات اتصال رو تنظیم کنید. الان میگه نمیتونم وصل بشم.
درست کردم اطلاعات و الان این ارور و نمایش میده!
Fatal error: Call to a member function query() on a non-object
مربوط به این کد هست
public function Read($id) {
//$db = database::getInstance();
$sql = "SELECT * FROM sessions WHERE id = '$id' ";
//$params = array(':id' => $id);
//$query = 'SELECT * FROM `sessions` WHERE (`id`=\'' . mysql_real_escape_string($id) . '\')';
try {
$db->query($sql);
//$result = mysql_query($query);
} catch(Exception $e) {
return '';
}
/**if (mysql_num_rows($result) != 1) {
* return '';
**}
**/
$count = $db->getCountRows();
if($count == 0){
//return '';
var_dump($count);
echo $sql;
}
//$data = mysql_fetch_assoc($result);
$data = $db->loadResult();
$time = strtotime($data['modified']);
$hash = $data['hash'];
if (time() - $time > $this -> time_out || strcasecmp($this -> browser_hash, $hash) != 0) {
return '';
}
return $data['data'];
}
سلام.استاد ممکنه بگین چقدر sessionها قابل اعتماد هستن؟؟مثلا اگه فلان session set شده بود panel مدیریت رو نشون بده یا مشخصات کاربر رو تو فلان session set کن که فلان جا مقادیرشو صدا بزنیم یا مدیریت نمایش پیغام های خطا(مثلا اگه session کد captcha set شده بود فلان پیغام رو نمایش بده)آیا ریسک نیست کار هایی از این قبیل رو با session انجام بدیم(هرچند در بانک ذخیره شن)؟؟؟ممکنه مثلا یبار Session set نشه و یه بخش سایت از کار بیوفته؟؟؟
امکان نداره سشن ست نشه. مثل اینه که بگین آیا احتمال داره فلان متغیر توی رم ساخته نشه؟ حتی اگه 0.1 درصد هم چنین اتفاقی بیفته فوقش طرف لاگین نمیشه و دوباره تلاش میکنه تا لاگین کنه.