PDA

View Full Version : گفتگو: نظر شما درمورد کلاس دیتابیس من



amin7x
چهارشنبه 16 مرداد 1392, 12:09 عصر
سلام
این کلاس دیتابیسی که نوشتم لطفا نظراتتون رو بگید.



<?php
class DataBase{
private $connectionVar;

public function __construct (){
if(!$this->connectionVar = mysql_connect('localhost', 'root', '')){
exit('Could not connect: ' . mysql_error());
}

if(!mysql_select_db('cms', $this->connectionVar)){
exit('Could not select: ' . mysql_error());
}

return mysql_query("SET NAMES 'utf8'", $this->connectionVar);
mysql_set_charset('utf8', $this->connectionVar);
}

public function Query ($Query){
return mysql_query($Query, $this->connectionVar);
}

public function Fetch ($QueryVar){
return mysql_fetch_array($QueryVar);
}

public function Escape ($StringEscape){
$StringEscape = htmlspecialchars($StringEscape);
$StringEscape = trim($StringEscape);
$StringEscape = mysql_real_escape_string($StringEscape);
return $StringEscape;
}

public function __destruct(){
$this->connectionVar = null;
}
}
?>


ممنون

spiderman200700
چهارشنبه 16 مرداد 1392, 14:01 عصر
اگر نیاز باشه در هنگام پیش اومدن مشکل در وصل شدن به هاست دیتابیس یا در هنگام انتخاب دیتابیس ، اسکریپت exit نشه چی؟ یعنی بخوای زمان وقوع این مشکلات به جای اتمام برنامه ، کار دیگه ای انجام بشه.
برای اون زمان راهی نذاشتی.

H:Shojaei
چهارشنبه 16 مرداد 1392, 15:35 عصر
سلام
خب اين كه همون توابع معمولي هستن ديگه فقط اسمشون رو ساده تر كرديد كار خاصي روشون انجام نشده كاملترش كنيد بعد بذاريد اينجا فعلا فقط تابع escape خوب و مفيده.
موفق باشيد.

amin7x
چهارشنبه 16 مرداد 1392, 17:17 عصر
اگر نیاز باشه در هنگام پیش اومدن مشکل در وصل شدن به هاست دیتابیس یا در هنگام انتخاب دیتابیس ، اسکریپت exit نشه چی؟ یعنی بخوای زمان وقوع این مشکلات به جای اتمام برنامه ، کار دیگه ای انجام بشه.
برای اون زمان راهی نذاشتی.

شما چه راه حلی پیشنهاد میکنید؟ بفرستمش به یک صفحه دیگه؟


سلام
خب اين كه همون توابع معمولي هستن ديگه فقط اسمشون رو ساده تر كرديد كار خاصي روشون انجام نشده كاملترش كنيد بعد بذاريد اينجا فعلا فقط تابع escape خوب و مفيده.
موفق باشيد.

پیشنهاد بدید ، چه چیزی اضافش کنم تا کامل تر بشه؟

colors
چهارشنبه 16 مرداد 1392, 17:44 عصر
سلام
خب اين كه همون توابع معمولي هستن ديگه فقط اسمشون رو ساده تر كرديد كار خاصي روشون انجام نشده كاملترش كنيد بعد بذاريد اينجا فعلا فقط تابع escape خوب و مفيده.
موفق باشيد.

کاملا مفیدس هم نیست. هیچ توجه ای به magic_quotes_gpc نشده که میتونه دردسر ساز بشه! البته مگه قرار همه داده ها htmlspecialchars بشن! بهتره فقط هنگام چاپ محتویات از htmlspecialchars استفاده کرد نه هنگام ذخیره! ضمنا htmlspecialchars صحیح به کار گرفته نشده! یعنی فلگ و ایناش نیستن که در زیر مثال میزنم.
پس اگه این متد رو فقط برای اسکیپ داده های کاربر و ذخیره در دیتابیس میخواید, متد زیر کاراتره:

public function Escape ($StringEscape){
$StringEscape = trim($StringEscape);
if(get_magic_quotes_gpc()){ $StringEscape = stripslashes($StringEscape); };
return mysql_real_escape_string($StringEscape);
}
و یه متدی جدا برای پاکسازی داده ها از HTML بسازید:

public function HtmlAnnul($value)
{
return htmlspecialchars($value, ENT_QUOTES, "UTF-8");
}

H:Shojaei
چهارشنبه 16 مرداد 1392, 18:11 عصر
پیشنهاد بدید ، چه چیزی اضافش کنم تا کامل تر بشه؟
شما بايد يه چيزي بنويسيد كه بشه همه جا ازش استفاده كرد تو همه ي پروژه هاتون و هيچ تغييري مگر واسه ارتقاع سطوحش نداشته باشه.
اول بگم واسه اين كار كه بازدهي كاملي داشته باشه شما ميتونيد واسه هرعملياتي كه انجام ميديد يه تابع جداگانه بنويسيد مثلا همين تابع Query رو كه نوشتيد ما به عنوان select ازش استفاده ميكنيم به اين صورت:

مثلا داده هاي رو واسه راحتي كار به تابع Query ارسال كنيد شامل نام ديتا بيس اگر چند تا ديتابيس داريد و نام جدول و فيلد هاي جدول و مقاديرشون كه كارتون كاملا پويا باشه بعد تو خود تابع Query اين كوئري رو بسازيد. مثلا فيلد فلان كه از سرس اصلي ارسال شده رو با مقدار فلان كه باز هم از سرس اصلي ارسال شده در كوئري مقداردهي ميكنيد و بعد كوئري رو اجرا ميكنيد. اين طوري راحت تر هم ميتونيد داده هايي رو كه كاربر ارسال كرده تابع escape رو در كلاس روشون اعمال كنيد.
همه ي عمليات رو واسه اين كه بازدهيشون بالا باشه ميتونيد اين طوري بنويسيد.
نميدونم توضيحم رو متوجه شديد يا نه ولي اميدوارم متوجه شده باشيد.


کاملا مفیدس هم نیست.
[/PHP]
شما پيشكسوت و استاد ما هستيد و البته حرفتون كاملا متينه.
ولي من ايني كه گفتم مفيده روش كار داخل تابع رو نگفتم در كل از ديد كلي از لحاظ تعريف تابع گفتم كه مثلا واسه كنترل داده چون چند تا تابع در اين رابطه داريم يه جا باشن خوبه.
و در كل اين تابع از همه بهتر بود تو اين كلاس.

lordofphp
چهارشنبه 16 مرداد 1392, 19:02 عصر
سلام
خوبی؟
بهتره یواش یواش سمت استفاده از PDO و mysqli بشی !!

spiderman200700
چهارشنبه 16 مرداد 1392, 22:26 عصر
شما چه راه حلی پیشنهاد میکنید؟ بفرستمش به یک صفحه دیگه؟

پیشنهاد بدید ، چه چیزی اضافش کنم تا کامل تر بشه؟

مثلا میتونی به جای این :

if(!$this->connectionVar = mysql_connect('localhost', 'root', '')){ exit('Could not connect: ' . mysql_error()); }

اینو بنویسی:

if(!$this->connectionVar = mysql_connect('localhost', 'root', '')){
throw new Exception("Error on coonect to Database host");
}

بعد توی جایی که از کلاست Object میسازی ، میتونی با یه try catch خطا رو کنترول کنی و نذاری اسکریپت exit بشه. مثلا اینتوری:

try {
new DataBase();
} catch (Exception $x) {
// your code for handling Error
echo $x->getMessage();
}

s_salavati2002
پنج شنبه 17 مرداد 1392, 03:31 صبح
دوست عزیزم؛
بستگی داره بخوای چیکار بکنی؟
اگر بخوای برای محصولاتت استفاده کنی ، پیشنهاد می کنم از کلاس های آماده و یا از یک فریمورک کامل استفاده کن،
اما اگر برای یادگیری می خوای به نظرم برای شروعت خوبه، اینکه بیای برای خودت یک لایه میانی درست کنی و به مرور بهبود بدی
در ادامه کارت شاید بخوای یک فکری هم برای ساخت داینامیک کوئری هات بکنی
پیشنهاد من اینه کوئری رو از دید کاربر مخفی کنی
مثلا برای select و Where clause و... هر کدوم متدی داشته باشی

mehdi2123
پنج شنبه 17 مرداد 1392, 06:41 صبح
سلام
- بهتر بود در نام متغیر اتصال از پسوند Var استفاده نمیکردید.

- نام توابع بهتر بود با حروف کوچک شروع بشه و همینطور نام پارامترها.

- نام کلاس با چیزی که شما در کلاس تعریف کردید هماهنگ نیست . منظورم اینه که شما از واژه ای عام استفاده کردید و کلاس شما تنها قادر به اتصال به یک نوع بانک هست . و اینکه چرا شما Database را دو حرفی در نظر گرفتید و به صورت DataBase نوشتید .

- هر تابع تنها باید یه کار انجام بده (به طور کلی).

- سازنده کلاس جایی برای مقدار دادن اولیه به کلاس هستش و آماده کردن اون نه اینکه (در این کلاس)به دیتابیس وصل بشه که کار سازنده در این کلاس نیست و کوئری انجام بده که باید در تابع دیگری با توجه به منظوری که شما کلاس را نوشتید هستش charset تعیین کنه که باید تابع جدا براش نوشته میشد و ... و اینکه کلاس را مینویسند که استفاده مجدد در جاهای دیگه ازش بشه کلاس شما اصلاً این قابلیت را نداره اسم دیتابیس و هاست و یوزر و ... تمام به صورت ثابت هست .

- سازنده کلاس نمونه ای از خود کلاس را برمیگردونه چرا شما سعی دارید resource برگردونید که البته این اتفاق نمی افته در اینجا شما کلاً برنامه نویسی شی گرا را ....

- هر جایی از return استفاده کنند و خط return اجرا بشه کد بعد از آن اجرا نمیشه که شما بعد از این خط charset تعیین کردید.

- در کلاستون شما دوتا تابع Query و Fetch دارید که هیچ کارخاصی نسبت به توابع خود php انجام نمیدند فقط در اولی دیگه نیاز به ست کردن resource نیست بهتر بود تدابیری برای راحت کردن کسی که از این کلاس استفاده میکنه می اندشید که مثلاً مقادیری که قراره در کوئری استفاده بشه از لحاظ امنیتی و استرلیزه شدن و .. . با ارسال به تابعی که کارش اینه انجام بگیره و لااقل باری را از دوش کاربر کلاستون برداره که اصلاً با نوع پارامترتون هم مشخصه که شما کوئری تما م و کمال و نه به صورت پارامتری برای این تابع میفرستید که این درست نیست . و تابع Fetch هم همینطور کاربر کلاس را در یک نوع خروجی محدود میکنه. و اینکه کاربر کلاس باید همون رفتار توابع php را با این توابع کلاس داشته باشه یعنی خروجی حاصل از تابع کوئری را به عنوان پارامتر به تابع Fetch بده پس چه سودی داره استفاده از این کلاس .

- نکاتی را دوستان فرمودند در رابطه با پرتاب کردن Exception به جای فراخوانی تابع exit و استفاده از mysqli و PDo که من هم نظرم همینه .