استفاده بهینه و حرفه ای از MySQL

وضعیت
موضوع بسته شده است.

k2-4u

Well-Known Member
سلام دوستان این تاپیک رو برای روش های خوب برای ارتباط بین php و mysql
زدم . برای مثال ما همیشه دستورات کوچک SQL و بلند PHP داریم که این درست نیست
خیلی موافق میشه به وسیله دستورات SQL خیلی کار ها رو انجام داد


:tavajoh:
برای بحث و سوال به این تاپیک مراجع کنید


چرا دستورات SQL را بیشتر کنیم ؟

خب دوستان برای فرض کنید که شما می خواین یک لیست HTML درست کنید که اطلاعاتش از دیتابیس دریافت میشه
حالا شما . چند مرحله کار رو برای ساخت این لیست انجام میدین

1. یک Query ساده SELECT و یک شرط WHERE رو ارسال می کنید

2. در مرحله دوم اطلاعات رو به وسیله توابعی مانند Mysql_fetch_assoc در یک حلقه دریافت می کنید

-----------------> در پشت صحنه . اطلاعات از هسته Mysql به صورت نشانه گذاری شده به php ارسال میشه و بعد
طی چندین مرحله این اطلاعات از هم جدا سازی می شوند (Split) که این برای خودش بردازشی داره

3. اطلاعات بعد از Split شدن در یک حلقه . دریافت میشن و بعد با چندین اپراتور اتصال و ... به کد های HTML
متصل می شوند و در آخر در خروجی ظاهر می شوند --

اگر با دقت برسی کنید
اطلاعات یک بار در هسته Mysql نشانه گذاری می شوند
سپس در تابع Mysql_fetch_assoc . از هم جدا میشوند و دوباره
به وسیله HTML به هم متصل می شوند !؟
خب ؟
یک راه کم هزینه تر هم وجود داره !
اونم اینه که اطلاعات رو به وسیله کد های HTML در همون سمت MySQL نشانه گذاری کنید
و بصورت یکپارچه دریافت کنید

به مثال زیر دقت کنید


در حالت معمولی یک لیست به صورت زیر است
PHP:
$query=mysql_query('SELECT * FROM TableName WHERE(id='.$id.');');

$a='<table border="1">';
while($row=mysql_fetch_assoc($query)){
	$a.='<tr><td>'.$row['name'].'</td>'.
	'<td>'.$row['email'].'</td></tr>';
}
$a.='</table>';

echo $a;
و حالا در روش بهینه به این صورت
PHP:
$query=mysql_query('SELECT GROUP_CONCAT("<tr><td>",name,"</td><td>",email,"</td></tr>" SEPARATOR "") FROM TableName WHERE(id='.$id.');');

$out=mysql_result($query,0);

echo '<table border="1">'.$out.'</table>';
و البته این مثال بود نکات و ... مسایل زیادی هست که در ادامه در موردش صحبت میشه
 
آخرین ویرایش:

k2-4u

Well-Known Member
قسمت اول : تعریف دیتابیس و اتصال به آن

خب دوستان در این قسمت در مورد چگونگی ساخت دیتابیس و اتصال به آن صحبت می کنیم

اگر از زبان فارسی استفاده می کنید باید دیتابیس رو Unicode کنید
که درست انجام دادن این کار خیلی مهم است

در مرحله ساخت دیتابیس (برای فارسی ) Unicode رو بر روی utf8_persian_ci و Charset رو
روی utf8 تنظیم کنید . نکته بسیار مهم طریقه اتصال به دیتابیس Unicode شده و ریختن اطلاعات در
دیتابیس هست


در بسیار از مواقع دیتابیس درست Unicode میشه
ولی اطلاعات درست INSERT نمیشن . برای فهمیدن این مشکل کافی از . سطر های دیتابیس رو با
phpmyadmin نگاه کنید . در صورتی که نوشته های فارسی قابل خواندن نباشند یعنی شما درست از Unicode
استفاده نکردین . توجه داشته باشید که همین اطلاعات در هنگام واکشی کردن در یک صفحه PHP درست نشان داده میشوند


مراحل کار به صورت زیر است

1. دیتابیس را با یونیکد   utf8_persian_ci بسازید
PHP:
CREATE DATABASE  `mydb` DEFAULT CHARACTER SET utf8 COLLATE utf8_persian_ci;

2. بعد از اتصال به دیتابیس
نوع Unicode رو با یک Query مشخص کنید
PHP:
$link = mysql_connect('localhost',$user,$pass);

mysql_select_db($link,'mydb');

mysql_query('SET CHARACTER SET utf8;');

سپس بعد از INSERT چندین مقدار در دیتابیس
به وسیله phpmyadmin سطر ها را نگاه کنید
متوجه می شوید که تمامی جملات فارسی سطر ها قابل خواندن است
اگر به صورت تحقیق حجم دیتابیس را در 2 حالت اتصال اندازه گیری کنید متوجه
تفاوت آن خواهید شد .
و نکته مهم این است که اگر اتصال را درست انجام ندهید در هنگام استفاده از توابعی مانند CONCAT
دچار مشکل خواهید شد
 

k2-4u

Well-Known Member
ساخت Select Box

خب دوستان یکی از چیز های که در وبسایت های خیلی استفاده میشه
همین select box ها هستند که .خیلی وقت ها از دیتابیس خونده میشن . حالا
یک راه خیلی خوب برای ساخت select box

PHP:
$query = mysql_query(<<<'EOT'
	SELECT GROUP_CONCAT('\r\n<option ',IF(id=9,'selected="selected"',''),' value="' , id , '">' , name , '</option>'  SEPARATOR '')
	as aa FROM `stu3631_class`
EOT
);

$result = mysql_result($query,0);

echo '<select name="name">' . $result. "\r\n</select>";

توضیح :

برای گذاشتن کد های SQL در تابع mysql_query از دستور EOT استفاده شده که دیگه نیازی به Scape کردن
کارکتر های مثل ' نباشه . در هنگام استفاده از EOT نکات زیر رو رعایت کنید

1. بعد از شروع EOT بدون هیچ کارکتری یک خط بروید .
2. در پایان قبل از EOT هیچ کارکتری نگذارید و اونو در خط جدید قرار بدین

-----------------------
تابع GROUP_CONCAT . برای متصل کردن همه سطر های دریافت شده . به هم
قابل استفاده است . این تابع می تواند به مقدار نامحدود ورودی بگیرد
شما می توانید نام ستون ها یا مقادیر رشته ای را به ورودی این تابه بدهید
برای مثال SQL زیر
کد:
SELECT GROUP_CONCAT("<p>",name,"<p />" SEPARATOR "<br />") FROM  Tb1;
باعث تولید کدی مانند
HTML:
<p>ali</p>
<br />
<p>reza</p>
<br />
<p>mohsen</p>
میشود . مقدار جلوی SEPARATOR . کارکتر جدا کننده بین سطر ها را مشخص می کند . برای مثال
کد:
SELECT GROUP_CONCAT(name SEPARATOR "|") FROM  Tb1;
خروجی
HTML:
ali|reza|amir|korosh
را می دهد
------------------------------
در کد بالا تکه کد های HTML یک select box
به صورت جدا گانه به تابع GROUP_CONCAT داده شده است .
مقدار value هر option این select box برابر سطری با نام id
و نوشته های option ها براب سطری با نام name است
مقدار SEPARATOR نیز برابر خالی است . اگر این سویچ را تعریف نکنید . به صورت
پیشفر کارکتر "کاما" در نظر گرفته میشود
-------------------------
تابع IF :

اگر دقت کرده باشید یکی از ورودی های تابع GROUP_CONCAT در کد بالا تابع IF است
کد:
IF(id=9,'selected="selected"','')
این تابع مانند دستور IF است .
آرگومان اول : شرط مورد نظر . که می توانید از نام سطر ها و عملگر های منطقی و .. استفاده کنید
http://dev.mysql.com/doc/refman/5.0/en/non-typed-operators.html

آرگومان دوم : در صورتی که شرط درست باشد . خروجی داده میشود
آرگومان سوم : در صورتی که شرط اشتباه باشد . خروجی داده میشود

در کد بالا نقش این IF مشخص کردن این است که
کدام یک از عناصر Select box به صورت پیشفرض انتخاب شده باشد .
که همان طور که میبینید در صورتی که مقدار ستون id برابر 6 باشد همان
سطر به صورت پیشفرض انتخاب میشود
---------------------

در آخر خروجی تابع Mysql_query به تابع mysql_result فرستاده میشود
و از آنجا که Query فقط یک جواب دارد . آرگومان آخر تابع mysql_result
صفر در نظر گرفته شده است .
خروجی تابع mysql_result بعد از اتصال به
کد شروع و پایان Select box در خروجی ظاهر می شود
------------------



نکات مهم :

1 - در صورتی که سطرهای ستون شما . تغییر نمی کنند .
مانند نام شهر , کشور و ... می توانید Type آن را . ARCHIVE یا myisampack
بگذارید که در سرعت و حجم بسیار موثر است

2 - درست یونیکد کردن دیتابیس بسیار مهم است (که قبلا توضیح دادم )

3 - این روش برای سطر های بیش از 200 تا توصیه نمیشود
 
وضعیت
موضوع بسته شده است.

جدیدترین ارسال ها

بالا