PDA

View Full Version : سوال: لطفا این کوئری رو بصورت بهینه بنویسید



idocsidocs
سه شنبه 18 بهمن 1390, 19:38 عصر
همونطور که می دونید بهتره که ایندکس های یه آرایه رو بین کاراکترهای سینگل کوتیشن قرار بدیم. اما توی کوئری زیر نمی دونم چطور باید این کار رو انجام بدم.

لطفا این کوئری رو بصورت بهینه بنویسید :


SELECT * FROM `tb` WHERE (`u`='$_SESSION[id]')

MMSHFE
چهارشنبه 19 بهمن 1390, 09:01 صبح
$query = "SELECT * FROM `tb` WHERE (`u`='{$_SESSION['id']}')";
موفق باشید.

idocsidocs
چهارشنبه 19 بهمن 1390, 09:51 صبح
مهندس در مورد این کد که توی پست قبلی گذاشتید توضیح می دید؟

MMSHFE
چهارشنبه 19 بهمن 1390, 10:15 صبح
همونطور که خودتون اشاره کردین، بهتره که اندیسهای یک آرایه رو توی تک کوتیشن بگذاریم اما ازطرفی مقادیر فیلدها هم باید داخل تک کوتیشن قرار بگیرن. حالا برای اینکه تداخلی پیش نیاد، از { } برای محصورکردن عنصر آرایه استفاده میکنیم. همونطور که میدونید، توی ریاضی { } اولویت بیشتری از [ ] و به همین ترتیب، [ ] اولویت بالاتری از ( ) داره و این مسئله توی طراحی PHP هم درنظر گرفته شده. یعنی اول { } پردازش میشه که در اینجا، استفاده از یک متغیر هست. بعد [ ] پردازش میشه که در اینجا، استخراج یک عنصر از آرایه هست و نهایتاً ( ) پردازش میشه که شرط WHERE رو میسازه.
موفق باشید.

idocsidocs
چهارشنبه 19 بهمن 1390, 10:30 صبح
این کار از نظر سرعت تاثیر منفی روی اجرای کوئری نداره؟

سوال دیگه اینکه کوئری کلی رو بهتره توی سنگل کوتیشن قرار داد یا دابل کوتیشن؟

MMSHFE
چهارشنبه 19 بهمن 1390, 10:39 صبح
درمورد Query خیر چون اول رشته توسط PHP پردازش میشه و بجای اون عنصر از آرایه مقدارش قرار میگیره. حالا این وسط شما به هر شکلی Query رو بسازید، برای MySQL فرقی نداره. اما سرعت پردازش رشته های محصور در گیومه تک بیشتره هرچند اختلاف آنچنان زیادی با توجه به قدرت سیستمهای سرور امروزی وجود نداره و در حد چند هزارم ثانیه هست. ضمناً اگه متغیر زیاد دارین، بهتره از گیومه جفت استفاده کنید چون درصورت استفاده از گیومه تک مجبورین از عمل ادغام رشته ها استفاده کنید که با توجه به زیادبودن متغیرها، زمان بیشتری نسبت به پردازش یک رشته درون گیومه جفت لازم داره. بعلاوه استفاده از { } یک مزیت دیگه هم داره و اون اینه که میتونید یکسری کارکترها رو بلافاصله بعد یا قبل از متغیر مربوطه و بدون فاصله بگذارین. برای مثال، فرض کنید ورودی کاربر رو برای جستجوی نام توی متغیر name$ ذخیره کردین (مثلاً عبارت ad) و حالا میخواین تمامی کسانی که توی نامشون اون مقدار بعلاوه کلمه ali هست (مثل mohammadali و ahmadali و...) رو استخراج کنید. در این حالت، دستور زیر کار نمیکنه و خطا دریافت میکنید:

mysql_query("SELECT * FROM `tbl` WHERE (`u` LIKE '%$nameali%')");
علتش هم خیلی واضحه: اسم متغیر nameali$ فرض میشه که وجود نداره. اما دستور زیر کار میکنه:

mysql_query("SELECT * FROM `tbl` WHERE `u` LIKE '%{$name}ali%')");
موفق باشید.