PDA

View Full Version : مبتدی: دستورات مشترک اتصال به پایگاه داده در چند کلاس



maysam.m
دوشنبه 04 مرداد 1389, 16:02 عصر
با سلام

ما چند تا کلاس داریم که در همه ی آنها به پایگاه داده متصل میشویم. من نمیخوام که نام یوزر و پس و نام دیتابیس و هاست رو در همه ی کلاس ها قرار بدهم و در واقع میخوام یه فایل کانفیگ درست کنم.

مثلا بیاییم یه فایل درست کنیم و متغیرهایی به عنوان گلوبال در آن تعریف کنیم و آن را در تمام کلاس ها اینکلود کنیم کار صحیحیه؟

ممنون میشم راهنمایی کنید

mohmadd
دوشنبه 04 مرداد 1389, 16:26 عصر
فکر کنم بتونی از ارث بری استفاده کنی
یعنی یدونه کلاس برای mysql بنویسی.

maysam.m
دوشنبه 04 مرداد 1389, 16:39 عصر
فکر کنم بتونی از ارث بری استفاده کنی
یعنی یدونه کلاس برای mysql بنویسی.

ممنون اما
درباره پیاده سازی آن توسط درست کردن یک فایل config درست مثل اکثر cmsها نظری ندارید؟

morteza_naderloo
دوشنبه 04 مرداد 1389, 17:38 عصر
سلام

اين يك فايل كانيگ البته بايد بگم تازه كارم شايد نقص داره .؟؟؟




<?php
error_reporting(1);
//error_reporting(E_ALL | E_STRICT);
date_default_timezone_get('Asia/Tehran');
$user='root';
$pass='';
$Mydb='amlaakdidani';

function connect($user,$pass,$Mydb){
$con=mysql_connect('localhost',$user,$pass);
if ($con){
//echo "<span class='ok'>ارتباط با خدمات دهنده پايگاه داده برقرار شد .</span><br/>";

$db_select=mysql_select_db($Mydb,$con);
if($db_select){
//echo "<span class='ok'>ارتباط با پايگاه داده $Mydb برقرار شد .</span><br/>";
}else {
//echo "<span class='no'>ارتباط با پايگاه داده $Mydb برقرار نشد . ممكن است پايگاه داده مورد نظر وجود نداشته باشد .</span><br/>";
}

}else{
//echo "<span class='no'>ارتباط با خدمات دهنده پايگاه داده برقرار نشد .</span><br/>";
}

}

?>

maysam.m
دوشنبه 04 مرداد 1389, 17:55 عصر
سلام

اين يك فايل كانيگ البته بايد بگم تازه كارم شايد نقص داره .؟؟؟




<?php
error_reporting(1);
//error_reporting(E_ALL | E_STRICT);
date_default_timezone_get('Asia/Tehran');
$user='root';
$pass='';
$Mydb='amlaakdidani';

function connect($user,$pass,$Mydb){
$con=mysql_connect('localhost',$user,$pass);
if ($con){
//echo "<span class='ok'>ارتباط با خدمات دهنده پايگاه داده برقرار شد .</span><br/>";

$db_select=mysql_select_db($Mydb,$con);
if($db_select){
//echo "<span class='ok'>ارتباط با پايگاه داده $Mydb برقرار شد .</span><br/>";
}else {
//echo "<span class='no'>ارتباط با پايگاه داده $Mydb برقرار نشد . ممكن است پايگاه داده مورد نظر وجود نداشته باشد .</span><br/>";
}

}else{
//echo "<span class='no'>ارتباط با خدمات دهنده پايگاه داده برقرار نشد .</span><br/>";
}

}

?>




ما چند تا کلاس داریم و باید این فایل کانفیگ را در کلاس مورد نظرمون اینکلود کنیم؟
مثلا :




<?php
class test
{


function db_connect()
{

include 'config.php';
$handle = new mysqli("$Hostname", "$DBUser", "$DBPass", "$DBName");
if (!$handle)
{
return false;
}
return $handle;
}


// ...

?>



Config.php



<?php

$Hostname = 'localhost';
$DBUser = 'root';
$DBPass = '';
$DBName = 'test';

?>

Sajjad.Aghapour
دوشنبه 04 مرداد 1389, 19:35 عصر
سلام دوست عزیز.در OOP تکنیک Encapsulation رو فراموش نکنید و همیشه سعی کنید فیلدهای خود رو Encapsulate کنید....
شما میتونید به این صورت بنویسید:

class MySqlConnection
{
private $link;
private function Connect($host, $username, $pass)
{
$this->link = mysql_connect($host, $username, $pass);
return $this->link;
}
}

Class ContentManagement
{
private $link;
function __construct()
{
$con = new MySqlConnection();
$this-> link = $con->Connect("localhost", "test", "test");
}

function GetContent()
{
$query = '...';
mysql_query($query, $this->link);
}
}


موفق باشید/

maysam.m
دوشنبه 04 مرداد 1389, 20:47 عصر
سلام دوست عزیز.در OOP تکنیک Encapsulation رو فراموش نکنید و همیشه سعی کنید فیلدهای خود رو Encapsulate کنید....
شما میتونید به این صورت بنویسید:

class MySqlConnection
{
private $link;
private function Connect($host, $username, $pass)
{
$this->link = mysql_connect($host, $username, $pass);
return $this->link;
}
}

Class ContentManagement
{
private $link;
function __construct()
{
$con = new MySqlConnection();
$this-> link = $con->Connect("localhost", "test", "test");
}

function GetContent()
{
$query = '...';
mysql_query($query, $this->link);
}
}


موفق باشید/


با سلام

الان این کدی که شما نوشتید؛ آیا ما باید در هر کلاس به سازنده ی کلاس اطلاعات ورود را بفرستیم تا در کلاس MySqlConnection به دیتابیس متصل بشود درسته؟
حالا اگر ما 10 کلاس در فایلهای متفاوت داشته باشیم چطور؟ باید این کلاس را اینکلود کنیم و اطلاعات ورود را به آن بفرستیم تا به دیتابیس متصل شود؟


این کد را ببینید:

کلاس اصلی ما:


<?php
class content
{


function db_connect()
{

$handle = new mysqli("localhost", "root", "", "test");
if (!$handle)
{
return false;
}
return $handle;
}


//end parent class
}


class post extends content
{

function add_post()
{
$handle = parent:: db_connect();
$query = "INSERT INTO `post` VALUES ('', '$title', '$content')";
$result = $handle->query($query);
}

//end child class
}

?>



این هم کلاس دیگری در یک فایل دیگر :
class-login.php


<?php

class login
{

function db_connect()
{

$handle = new mysqli("localhost", "root", "", "test");
if (!$handle)
{
return false;
}
return $handle;
}

//......

}

?>




مشکل اینه که من باید در 2 کلاس اطلاعات ورود تکراری را وارد کنیم!


پس آیا استفاده از فایل کانفیگی که اطلاعات ورود ما را نگهداری کند و ما آنها را در کلاسهامون اینکولد میکنیم،
نمیتونه بهتر باشه؟

----
یه سوال دیگه:
اگه یک کلاس سه تا فرزند داشته باشد بدین صورت:
class1
class class2 extends class1
class class3 extends class2
class class4 extends class3

برای دسترسی از توابع کلاس اول در کلاس چهارمی باید چه کرد؟
-------

Sajjad.Aghapour
دوشنبه 04 مرداد 1389, 22:43 عصر
الان این کدی که شما نوشتید؛ آیا ما باید در هر کلاس به سازنده ی کلاس اطلاعات ورود را بفرستیم تا در کلاس MySqlConnection به دیتابیس متصل بشود درسته؟
حالا اگر ما 10 کلاس در فایلهای متفاوت داشته باشیم چطور؟ باید این کلاس را اینکلود کنیم و اطلاعات ورود را به آن بفرستیم تا به دیتابیس متصل شود؟

این کد را ببینید:



مشکل اینه که من باید در 2 کلاس اطلاعات ورود تکراری را وارد کنیم!

اول که من دلیل ارث بری رو در اونجا نفهمیدم همونطور که دلیلتون برای Multiple Inheritance رو نفهمیدم...
در کل این روش نیز روش مناسبی نیست چون Maintenace به طور قابل توجهی پایین خواهد آمد.روش های زیادی برای این کار وجود داره که البته من از ایده ASP.NET استفاده میکنم.یعنی استفاده از یک فایل Configuration برای ایجاد یک ConnectionString (شامل user, pass و ...)منسجم....



پس آیا استفاده از فایل کانفیگی که اطلاعات ورود ما را نگهداری کند و ما آنها را در کلاسهامون اینکولد میکنیم،
نمیتونه بهتر باشه؟

فکر نمیکنم این روش در کدنویسی OOP و حرفه ای جایی داشته باشه.بهتر هست خودتون رو به خوب کدنوشتن عادت بدید



یه سوال دیگه:
اگه یک کلاس سه تا فرزند داشته باشد بدین صورت:
class1
class class2 extends class1
class class3 extends class2
class class4 extends class3

برای دسترسی از توابع کلاس اول در کلاس چهارمی باید چه کرد؟

یه نکته : من نباید به این سوالتون جواب بدم.چون هر تاپیک مخصوص فقط یک سوال است.چون شاید قوانین سایت رو مطالعه نکرده اید جواب میدم و دیگر هیچ:لبخند:

پاسخ این سوال رو نمیدم.ولی در کل Nested Inheritance در جامعه برنامه نویس خیلی وقت هست که منسوخ شده.دلیلش هم همین سوال شماست...
راستش من از وضع Developer های PHP خبر ندارم.ولی مسئله ای که برای این موضوع حل شده است استفاده از Interface (http://www.tuxradar.com/practicalphp/6/17/0)و پیاده سازی آن توسط کلاس های وارث هست