PDA

View Full Version : سوال: چاپ مقدار متغیر داخل حلقه بیرون حلقه !



moslem_f
دوشنبه 07 مرداد 1392, 01:53 صبح
سلام عرض ادب و خسته نباشید آقا ارادتمندیم نماز روز های مدیران و دوستان گرامی مورد قبول درگاه خداوند منان سوالمو زیاد سرچ کردم به نتیجه نرسیدم هم در گوگل هم در انجمن چون هر چی مطلب کلیدی سرچ زدم به جواب نرسیدم ! برای همین اومدم اینجا لنگ بندازم :لبخند: تا دوستان کمک کنن :قلب: بیشتر به توضیح می پردازم؛

با کد زیر هر چی داخل table categories هست رو select می کنم البته اونایی که active شون برابر با 1 باشه که به این شکل نوشتم

$result = mysql_query("SELECT * FROM categories WHERE active='1' ORDER BY id ASC");
و با loop زیر مقادیر بازگشتی از query را در هر بار چرخش حلقه ریختم داخل variable $option


while($item = mysql_fetch_assoc($result))
{
$option = "<option value='{$item['id']}'>{$item['title']}</option>";
}

و هنگامی که بیرون loop مقدار variable را echo کنم آخرین مقدار ذخیره شده داخل variable را echo خواهد کرد یعنی آخرین record را ! .

اما در صورتی که من تمام title های رکورد هایی که داخل table categories هست رو می خوام echo کنم نه این که title آخرین record را !

و اما اگر کدم را به شکل زیر بنویسم و بیرون loop بخوام variable option را echo کنم به شکلی که من نیاز دارم title تمام record هایی که داخل table categories قرار داره رو بیرون حلقه برام echo می کنه !


$result = mysql_query("SELECT * FROM categories WHERE active='1' ORDER BY id ASC");
$option = '';
while($item = mysql_fetch_assoc($result))
{
$option .= "<option value='{$item['id']}'>{$item['title']}</option>";
}

حالا سوال این هست که چرا با الحاق کردن variable option به شکل بالا و با echo کردن variable بیرون loop title تمام رکورد هایی که داخل table categories قرار داره رو بیرون حلقه برام echo می کنه !

و اصلا الحاق کردن string زیر


"<option value='{$item['id']}'>{$item['title']}</option>"

با variable optioon یعنی با خودش ! یعنی چی ؟ به چه علت و دلیل علمی و منطقی تمام title های record های داخل table categories رو داخل variable option میریزه که بیرون loop تمام title های record های داخل table categories رو چاپ می کنه ؟ اونم بیرون حلقه !

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

moslem_f
دوشنبه 07 مرداد 1392, 03:24 صبح
جواب سوالمو پیدا کردم میگم شاید روزی کسی به دردش بخوره ولی اگر ایرادی داشت جوابم و به قولی اشتباهی در بیاناتم بود بگید تا اشتباهم اصلاح شده باشد با تشکر.

بر اساس این لینک
http://php.net/manual/en/language.operators.string.php

این پاسخ رو به سوال خودم دادم !

خب ما وقتی میام و از =. استفاده می کنیم قبل از این باید یک بار متغیر رو تعریف کرده باشیم بعد از تعریف متغیر میتونیم به صورت بهینه و به قولی به این شکل =. ازش استفاده کنیم حالا این بهینه کردن چه کاری انجام میده که option ها رو میرزه تو متغیر ما و به قولی به هم الحاق می کنشون و بعد از echo کردن بیرون حلقه همه option ها با نام های مجزا و تفکیک شده در محل مورد نظر نمایش داده میشه




$option .= "<option value='{$item['id']}'>{$item['title']}</option>";


این طرز کد نوشتن در بالا داخل حلقه مثل این کدی که در زیر نوشتم می مونه !



$option = "<option value='1'>برنامه نویسی</option>"."<option value='1'>برنامه نویسی</option>"."<option value='1'>برنامه نویسی</option>" & & & & ...........;

و اما وقتی این variable رو به این شکل داخل تگ زیر echo کنیم



<select name="categoryid">
<?php
echo $option;
?>
select> />

انگار که این طوری نویشته باشیم هست و به این صورت به شکل پویا تمام مطالب رو از داخل دیتا بیس میرزه تو option input های ما و تمام این option ها رو پشت سر هم به هم الحاق می کنه و چون اول و آخر هر option با تگ های باز و بسته html مشخص شده بدون هیچ مشکلی تمام option ها با مقادیر کاملا پویا پشت سر هم داخل تگ select قرار خواهد گرفت !




<select name="categoryid">
<option value="52">برنامه نويسي</option><option value="53">طراحي سايت</option><option value="55">طراحي بنر</option><option value="56">اخبار فرهنگي</option>
</select>



با تشکر
ارادتمند : مسلم فلاح نیت

mohsen670
چهارشنبه 09 مرداد 1392, 00:28 صبح
روش شما کار میکنه، اما درست ترش این هست که از یک آرایه استفاده کنید. که مقدار همه‌ی option هایی که در لوپ هست رو دخبره کنه. به این شکل:


$result = mysql_query("SELECT * FROM categories WHERE active='1' ORDER BY id ASC");
while($item = mysql_fetch_assoc($result))
{
i++; //i=i+1
$option[i],[$item];
}
print_r($option);

moslem_f
چهارشنبه 09 مرداد 1392, 05:38 صبح
سلام عرض ادب و خسته نباشید $i رو قبلا بیرون حلقه باید تعریف کرده باشیم یا نه !

MMSHFE
چهارشنبه 09 مرداد 1392, 08:06 صبح
روش خودتون هم کاملاً درسته. عملگر =. یعنی الحال رشته جدید با رشته قبلی. یعنی دو دستور زیر با هم یکسان هستن:


$str .= 'ok';
$str = $str . 'ok';

با این کار، مقدار قبلی متغیر ازبین نمیره، بلکه با مقدار جدید، ادغام میشه و دوباره توی خود متغیر قرار میگیره. چیز عجیب و پیچیده ای نیست. مثل اینه که بگیم برو محتوای جعبه آچار رو بریز بیرون، این آچار جدید رو هم بگذار روی اونها و دوباره همه رو بریز توی جعبه آچار. اما اینکه توی آرایه بگذارین هم کاربردهای خاص خودش رو داره. مثلاً میتونید در ادامه کد، بارها ازش به شکلهای مختلف استفاده کنید (نمایش بصورت تگ Select یا استفاده از ID اونها برای نمایش CheckBox برای حذف و...) منتها باید به یک نکته دقت کنید و اون اینکه یک عادت خوب در برنامه نویسی اینه که متغیرها رو قبل از استفاده، تعریف کنید. مثلاً وقتی میگیم ;++i$ درسته PHP سخت نمیگیره و اگه i$ قبلاً تعریف نشده باشه، مقدار صفر براش میگذاره ولی در اصل یک خطای E_STRICT تولید میکنه که نشون داده نمیشه و توی اون خطا داره میگه بهتره متغیر رو قبلش تعریف کنید. درست هم میگه چون ممکنه توی یک اسکریپت بزرگ، قبلاً i$ مقدار داشته باشه و شما یادتون نباشه و اونوقت، دیگه i$ از صفر شماره گذاری اندیسهای آرایه شما رو انجام نمیده.

mohsen670
پنج شنبه 10 مرداد 1392, 01:28 صبح
نیازی به تعریفش نیست خارج از حلقه...
اگر نیاز دارید که از هر کدوم از مقادیر متغیر option بصورت جداگانه خارج از حلقه استفاده کنید، روش شما جواب نمیده...

MMSHFE
پنج شنبه 10 مرداد 1392, 08:13 صبح
دوست عزیز، لطفاً راهنمایی اشتباه نکنید. همونطور که گفتم، PHP درمورد مقداردهی اولیه متغیرها سختگیر نیست ولی یک پیغام خطای E_STRICT تولید میکنه. اینکه متغیر قبل از استفاده، مقدار داشته باشه، ایده خیلی خوبیه. دلایلش رو هم توی پست قبلیم گفتم. الآن وقتی میگین ;++i$ دقیقاً ازنظر منطقی i$ مقدار قبلیش چیه که بخواد با 1 جمع بشه؟ مطمئن هستین که قبلش i$ مقدارش صفره؟ توی یک اسکریپت بزرگ با چه درجه ای از اطمینان میتونید این حرف رو بزنید؟ اگه چند وقت دیگه PHP تصمیم گرفت خطاهای E_STRICT رو تبدیل به E_ERROR کنه و توی اصول کدنویسی سختگیرانه تر عمل کنه، میدونید چند اسکریپت باید اصلاح بشن؟ بعلاوه این کد توی زبانهای دیگه که به مقداردهی اولیه متغیرها حساس هستن (مثل #C و Java و...) کار نمیکنه. توی زبانهایی مثل ++C هم که متغیر وقتی تعریف میشه، هر مقداری که از قبل توی اون خونه از حافظه که بهش اختصاص داده میشه وجود داشته باشه میشه مقدار اولیه متغیر مگه اینکه خودتون مقداردهیش کنید. بهتره برنامه نویسی رو اصولی یاد بگیریم تا وقتی خواستیم از یک زبان به زبان دیگه سوئیچ کنیم (برحسب نیازهای پروژه)، با مشکل خاصی مواجه نشیم. ضمناً اینکه گفتین هرکدوم از مقادیر option رو بصورت جداگانه نیاز داشته باشن، متوجه نشدم. تمام کاربرد option توی تگ select هست و بعدش، مقداری که submit میشه مهمه. میشه حالتی رو تشریح کنید که به optionها بصورت جداگانه نیاز باشه؟ ضمناً تعریف یک خونه توی آرایه بصورت:

$option[$i],[$item];
چطوریه؟ شاید منظورتون این بوده:

$option[$i] = $item;
که البته اینجا هم بهتره قبل از حلقه، با دستور ;()option = array$ یک آرایه خالی ایجاد کنیم و بعد، مقادیر رو بهش اضافه کنیم.