PDA

View Full Version : سوال: مشکل با ارث بری



idocsidocs
یک شنبه 20 شهریور 1390, 22:30 عصر
من یه کلاس والد نوشتم که یه اتصال به دیتابیس ایجاد می کنه، من می خوام این کلاس رو به عنوان کلاس والد توی یه فایل مجزا قرار بدم.

هرجا لازم بود که به دیتابیس وصل بشم، می خوام این کلاس رو اینکلود کنم.

بقیه کلاسهای مربوط به دیتابیس رو توی فایلهای جداگانه قرار می دم و می خوام هرکدوم از این کلاسها از کلاس والد ارث بری کنن.

مشکلی که دارم اینه که چطور می تونم از طریق کلاسهای فرزند، به لینک اتصال ایجاد شده در کلاس والد دسترسی پیدا کنم؟

وقتی از $this استفاده می کنم با این ارور مواجه می شم:

Fatal error: Call to a member function real_escape_string() on a non-object in C:\xampp\htdocs\admin\model\my.php on line 43

Mr.Moghadam
یک شنبه 20 شهریور 1390, 22:40 عصر
parent::connection

idocsidocs
یک شنبه 20 شهریور 1390, 23:09 عصر
parent::connection

$safe_id=parent::$mydb->real_escape_string($id);
من به شکل بالا استفاده می کنم اما این ارور رو می ده:

Fatal error: Access to undeclared static property: model::$mydb in C:\xampp\htdocs\admin\model\sessions.php on line 43
مشکل چیه؟

Mr.Moghadam
دوشنبه 21 شهریور 1390, 01:03 صبح
کلاست رو بذار

idocsidocs
دوشنبه 21 شهریور 1390, 01:49 صبح
کلاست رو بذار



کلاس والد که یه اتصال به دیتابیس ایجاد می کنه تا بقیه مدلها این اتصال رو به ارث ببرن

class model
{
protected $mydb;
function __construct()
{
$this->mydb= new mysqli(IHOST,IUSER,IPASS,IDATABASE) or die ("error");
$this->mydb->set_charset('UTF8');
}
}

اینم کلاس مربوط به ذخیره سسشن توی دیتابیس، تنها کلاسی که نتونستم توی با فریم ورک شما ازش استفاده کنم همین کلاس هست:

<?PHP
class mysessions extends model
{
private $time_out; //Time out for session
private $salt; //Salt, an uniq string
private $browser_hash; //Browser hash

function __construct($time_out=1200,$salt='')
{
date_default_timezone_set('Asia/Tehran');
if($salt=='')
{
$salt=md5('the-string-query');
}

$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'));
}


public function Open($save_path, $session_name)
{
//Initialize your need here.
//In my case, I need nothing.
return true;
}

public function Close()
{
//Just deinitialize your resources
return true;
}

public function Write($id,$data)
{
$safe_id=$this->mydb->real_escape_string($id);
$safe_data=$this->mydb->real_escape_string($data);
$hash=$this->mydb->real_escape_string($this->browser_hash);
$now=date("Y-m-d H:i:s");
$query="INSERT INTO `ses_sessions` (`id`,`data`,`modified`,`hash`) VALUES ('$safe_id','$safe_data','$now','$hash') ON DUPLICATE KEY UPDATE `data`='$safe_data', `modified`='$now',`hash`='$hash'";
try
{
$this->mydb->query($query);
}
catch(Exception $e)
{
return false;
}
return true;
}

public function Read($id)
{
$query='SELECT * FROM `ses_sessions` WHERE (`id`=\''.$this->mydb->real_escape_string($id).'\')';
try
{
$result=$this->mydb->query($query);
}
catch(Exception $e)
{
return '';
}
//Is there any???
if ($result->num_rows!=1)
{
return '';
}
$data=$result->fetch_assoc();
//Now its time to validate...
$time=strtotime($data['modified']);
$hash=$data['hash'];
//Check for time out and browser data
if(time()-$time > $this->time_out || strcasecmp($this->browser_hash,$hash)!=0)
{
return '';
}
//Anything is ok, return data
return $data['data'];
}

public function Destroy($id)
{
$safe_id=$this->mydb->real_escape_string($id);
$query="DELETE FROM `ses_sessions` WHERE (`id`='$safe_id')";
try
{
$this->mydb->query($query);
}
catch(Exception $e)
{
return false;
}
$this->GC($this->time_out);
return true;
}

public function GC($maxlifetime)
{
//You can use your timeout instead of this.
$date=time()-$maxlifetime;
$date_str=date("Y-m-d H:i:s",$date);
$query="DELETE FROM `ses_sessions` WHERE (`modified`<'$date')";
try
{
$this->mydb->query($query);
}
catch(Exception $e)
{
return false;
}
return true;
}

public function calcHash()
{
$ip=isset($_SERVER['HTTP_CLIENT_IP'])?$_SERVER['HTTP_CLIENT_IP']:"Unknown";
$ip.=isset($_SERVER['HTTP_X_FORWARDED_FOR'])?$_SERVER['HTTP_X_FORWARDED_FOR']:"Unknown";
$ip.=isset($_SERVER['REMOTE_ADDR'])?$_SERVER['REMOTE_ADDR']:"Unknown";
$agent=isset($_SERVER['HTTP_USER_AGENT'])?$_SERVER['HTTP_USER_AGENT']:'NoUserAgent';
$browser_data=$this->salt.$_ip.$_agent;
$this->browser_hash=md5($browser_data);
}
}
?>

البته الان از کلمه کلیدی this استفاده کردم که با این کلمه هم می شه از والد ارث بری داشت. بنظرتون مشکل چیه؟
وقتی از این کلاس به این صورت استفاده می کنم خطای زیر رو می گیرم درصورتیکه باید خصوصیت mydb به ارث برده بشه.

Fatal error: Call to a member function real_escape_string() on a non-object in C:\xampp\htdocs\admin\model\mysessions.php on line 57

Mr.Moghadam
دوشنبه 21 شهریور 1390, 07:55 صبح
توی تابع سازنده کلاس mysessions باید تابع سازنده کلاس مدل رو فراخوانی کنی به صورت زیر :


function __construct($time_out=1200,$salt='')
{
parent::__construct ;
date_default_timezone_set('Asia/Tehran');
if($salt=='')
{
$salt=md5('the-string-query');
}

$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'));
}

idocsidocs
دوشنبه 21 شهریور 1390, 10:15 صبح
توی تابع سازنده کلاس mysessions باید تابع سازنده کلاس مدل رو فراخوانی کنی به صورت زیر : آقا یک دنیا ممنون، واقعا این مشکل دیروز واقعا وقت من رو گرفت.

الان مشکل حل شده.

من توی سازنده بقیه مدلهای فرزند هم همین کار رو کردم و سازنده کلاس والد رو فراخوانی کردم.
یه سوال: همونطور که می دونید تعداد کنکشن های زیاد به دیتابیس باعث ایجاد فشار فشار روی سرور می شه، از اونجا که ممکنه توی هر کنترلر چندین مدل فرزند وجود داشته باشه، آیا استفاده از این روش باعث نمی شه که هر مدل یه اتصال به دیتابیس ایجاد کنه؟

Mr.Moghadam
دوشنبه 21 شهریور 1390, 13:17 عصر
نه فکر نمیکنم مشکلی پیش نمیاد اما اگر خیلی نگران این موصوعی توی مخرب (destruct)کلاست کانشکشن دیتابیس رو close کنی.

idocsidocs
دوشنبه 21 شهریور 1390, 13:48 عصر
نه فکر نمیکنم مشکلی پیش نمیاد اما اگر خیلی نگران این موصوعی توی مخرب (destruct)کلاست کانشکشن دیتابیس رو close کنی.

ایا راهی هست که بجای فراخوانی سازنده کلاس والد، فقط خصلت کلاس والد رو به ارث ببریم و ازش استفاده کنیم؟

Keramatifar
دوشنبه 21 شهریور 1390, 16:59 عصر
دوست عزیز
پیشهاد می کنم اگر داری بصورت Object Oriented برنامه می نویسی، برای اتصال به دیتابیس از PDO استفاده کنی
به هر صورت زمانیکه می خوای کانکشن به دیتابیس بزنی، چک کن فقط در صورتیکه کانکشنی وجود ندارد، یکی ایجاد کنی و اگر وجود داشت از همان کانکشن جاری استفاده کنی
مثالی از یک ساخت کانکشن با PDO :


// Class providing generic data access functionality
class DatabaseHandler
{
// Hold an instance of the PDO class
private static $_mHandler;

// Private constructor to prevent direct creation of object
private function __construct()
{
}

// Return an initialized database handler
private static function GetHandler()
{
// Create a database connection only if one doesn’t already exist
if (!isset(self::$_mHandler))
{
// Execute code catching potential exceptions
try
{
// Create a new PDO class instance
self::$_mHandler =
new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD,
array(PDO::ATTR_PERSISTENT => DB_PERSISTENCY));

// Configure PDO to throw exceptions
self::$_mHandler->setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION);
self::$_mHandler->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
}
catch (PDOException $e)
{
// Close the database handler and trigger an error
self::Close();
trigger_error($e->getMessage(), E_USER_ERROR);
}
}

// Return the database handler
return self::$_mHandler;
}

// Clear the PDO class instance
public static function Close()
{
self::$_mHandler = null;
}
{

idocsidocs
سه شنبه 22 شهریور 1390, 20:30 عصر
تو فکر هستم که از pdo استفاده کنم اما هنوز pdo رو یاد نگرفتم.

Mr.Moghadam
چهارشنبه 23 شهریور 1390, 00:32 صبح
معرفی افزونه PDO برای دستیابی بهتر به دیتابیس (http://boplo.ir/php/what-is-pdo/)

idocsidocs
چهارشنبه 23 شهریور 1390, 01:32 صبح
معرفی افزونه PDO برای دستیابی بهتر به دیتابیس (http://boplo.ir/php/what-is-pdo/) این مطلب رو به همراه چند مطلب دیگه قبلا خوندم ولی وقت نکردم که روش کار کنم تا بتونم ازش استفاده کنم.

softmedia
پنج شنبه 05 آبان 1390, 19:34 عصر
سلام دوستان
خواهشن به من سریع کمک کنید آبروم رفت
سایتمو که باز می کنم این ارور رو میده:
Fatal error: Call to a member function mark() on a non-object in /home/aikidosh/public_html/index.php on line 25
صفحه ادمینشم کلا سفید میاد بالا
اینم مشخصات فایل ایندکسم:
خط 24 و 25
// Mark afterLoad in the profiler.
JDEBUG ? $_PROFILER->mark('afterLoad') : null;


لطفا یکی کمک کنه

Mr.Moghadam
پنج شنبه 05 آبان 1390, 23:30 عصر
سلام دوستان
خواهشن به من سریع کمک کنید آبروم رفت
سایتمو که باز می کنم این ارور رو میده:
Fatal error: Call to a member function mark() on a non-object in /home/aikidosh/public_html/index.php on line 25
صفحه ادمینشم کلا سفید میاد بالا
اینم مشخصات فایل ایندکسم:
خط 24 و 25
// Mark afterLoad in the profiler.
JDEBUG ? $_PROFILER->mark('afterLoad') : null;


لطفا یکی کمک کنه

کلاست رو بزار