سوال در مورد حلقه while و گرفتن اطلاعات از دیتابیس

*Hamid*

New Member
سلام به همگی
یه نگاهی به کد زیر بندازید

کد:
while($data=mysql_fetch_array($result)){
echo $data['name'].":";
while($data2=mysql_fetch_array($result2)){

    if($data['vid']==$data2['vid'])
    {
    echo $data2['name'];
    }
}
}
این کد برای گرفتن دسته بندی های یک سایت هستش که دسته بندی های سطح اول داخل یک جدول و سطح دوم داخل جدول دیگه ای هستش.با این دستور حلقه اول به تعداد سطور تکرار میشه ولی وقتی همین حلقه میره توی سطر بعد حلقه دوم دیگه اجرا نمیشه. یعنی یه نتیجه میده شبیه این:
Category1:
subcat1
subcat2
subcat3
Category2:

Category3:

Category4:

که میبینید وقتی حلقه اول به سطرهای بعدی میره دیگه حلقه ی داخلش اجرا نمیشه
به نظر شما مشکل چیه؟
ممنون/
 
آخرین ویرایش:

*Hamid*

New Member
فکر نمیکنم ساختار جدول ها بتونه کمکی بکنه.
همونطور که اشاره کردم حلقه while اولی به تعداد سطور اجرا میشه ولی حلقه ی while درون خودش را فقط در بار اول اجرا میکنه و در سطرهای بعدی حلقه ی اول ، حلقه ی دوم اجرا نمیشه.
چیزی که خودم حدس زدم اینه که چون در سطر اول اطلاعاتی که با استفاده از mysql_fetch_array گرفته میشه از اول تا آخر خونده میشه دیگه تو حلقه های بعدی چیزی نداره تا خونده بشه.احتمالاً باید اطلاعاتی که با استفاده از mysql_fetch_array گرفته میشه رو هر بار به سطر اول برگردوند تا دوباره از اول خونده شه.درسته؟(چطوری؟)
 

ziXet

مدیر انجمن PHP/MYSQL
فکر نمیکنم ساختار جدول ها بتونه کمکی بکنه.
همونطور که اشاره کردم حلقه while اولی به تعداد سطور اجرا میشه ولی حلقه ی while درون خودش را فقط در بار اول اجرا میکنه و در سطرهای بعدی حلقه ی اول ، حلقه ی دوم اجرا نمیشه.
چیزی که خودم حدس زدم اینه که چون در سطر اول اطلاعاتی که با استفاده از mysql_fetch_array گرفته میشه از اول تا آخر خونده میشه دیگه تو حلقه های بعدی چیزی نداره تا خونده بشه.احتمالاً باید اطلاعاتی که با استفاده از mysql_fetch_array گرفته میشه رو هر بار به سطر اول برگردوند تا دوباره از اول خونده شه.درسته؟(چطوری؟)
اینم کد:

PHP:
$result = mysql_query("SELECT * FROM subcategory");
while($row = mysql_fetch_object($result)){
$query2 = "SELECT * FROM subcategory WHERE cat_id = ".$row->id;
$result2 = mysql_query($query);
$s = $row->title.":<br>".$s;
while ($row2 = mysql_fetch_object($result2)){
$s = $s.$row2->title."<br>";
}
}
echo $s;
 

I.NoBody

Active Member
کلاً ساختارت رو قبول ندارم.
ولی این مشکلتو حل میکنه :
کد:
$i=0;
while($data=mysql_fetch_array($result)){
	$record1[$i]=$data;
	$i++;
}
$i=0;
while($data=mysql_fetch_array($result)){
	$record2[$i]=$data;
	$i++;
}
for($i=0;$i<sizeof($record1);$i++){
	echo $record1[$i]['name'].":";
for($j=0;$j<sizeof($record2);$j++){

    if($record1[$i]['vid']==$record2[$j]['vid'])
    {
    echo $record2[$j]['name'];
    }
}
}

دلیلش هم اینه که توی حلقه while که شما نوشتی، دیتاسیک فقط میره جلو و توی حلق دوم، اگر یک رکورد شرطش true نباشه، دیگه یک رکورد سخته شده و حلقه شما ازش رد شده. در این حالت، فقط حلقه دوم، در اولین اجرای حلقه اول اجرا میشه و در دورهای بعدی، اصلاً اجرا نمیشه
 

ziXet

مدیر انجمن PHP/MYSQL
روش من بهترین روشه!
البته باید بین category و subcategory یک لینک دهی با id انجام شده باشه.
 

I.NoBody

Active Member
من راه حل shahkey رو نخونده بودم.
اون روش شاید بهتر به نظر بیاد، ولی تعداد کوئری هایی رو که از DB می گیریم، زیاد میشه و این مناسب نیست.
ولی اگه کمی روش فکر کنی، می تونی یه روش بهینه رو با حداکثر 2 کوئری پیاده کنی.
البته با یک کوئری هم ممکنه بشه
 

*Hamid*

New Member
دلیلش هم اینه که توی حلقه while که شما نوشتی، دیتاسیک فقط میره جلو و توی حلق دوم، اگر یک رکورد شرطش true نباشه، دیگه یک رکورد سخته شده و حلقه شما ازش رد شده. در این حالت، فقط حلقه دوم، در اولین اجرای حلقه اول اجرا میشه و در دورهای بعدی، اصلاً اجرا نمیشه
میشه بیشتر توضیح بدید؟
راستی سخته یعنی چی؟:d
 

I.NoBody

Active Member
شما دو تا حلقه while داري.
فرض كن while اول قراره 10 دور بزنه.
شما با اين دستوري كه نوشتي، while دوم(دروني) فقط توي دور اول while اول اجرا ميشه و توي دورهاي بعدي، اصلاً وارد while دروني نميشه
 

*Hamid*

New Member
خوب چرا while درونی فقط یه بار اجرا میشه؟
مگه شرطی که داخل حلقه هستش(if)تاثیری روی اجرای حلقه داره؟
while به تعداد سطرها پیش میره دیگه؟درسته؟
 

I.NoBody

Active Member
عزیزم شما یه کم هم روی کدها تامل کن.
هم چیز که نباید تبدیل به لقمه آماده بشه.
همه اش 10 خط هم نیست.
همونطور که گفتم، این حلقه while که شما نوشتی، بازگشت نداره و فقط به جلو میره.
وقتی شما توی دور اول، حلقه while درونی رو کامل پیمایش می کنی و این حلقه بازگشت نداره، خوب مسلماً توی دور دوم به بعد، حلقه قبلاً به انتها رسیده در نتیجه اجرا نمیشه.
خیلی عامیانه گفتم.
 

*Hamid*

New Member
عزیزم شما یه کم هم روی کدها تامل کن.
هم چیز که نباید تبدیل به لقمه آماده بشه.
همه اش 10 خط هم نیست.
همونطور که گفتم، این حلقه while که شما نوشتی، بازگشت نداره و فقط به جلو میره.
وقتی شما توی دور اول، حلقه while درونی رو کامل پیمایش می کنی و این حلقه بازگشت نداره، خوب مسلماً توی دور دوم به بعد، حلقه قبلاً به انتها رسیده در نتیجه اجرا نمیشه.
خیلی عامیانه گفتم.
خوب منم توی دومین پست همین رو گفتم:
چیزی که خودم حدس زدم اینه که چون در سطر اول اطلاعاتی که با استفاده از mysql_fetch_array گرفته میشه از اول تا آخر خونده میشه دیگه تو حلقه های بعدی چیزی نداره تا خونده بشه.احتمالاً باید اطلاعاتی که با استفاده از mysql_fetch_array گرفته میشه رو هر بار به سطر اول برگردوند تا دوباره از اول خونده شه.درسته؟(چطوری؟)
حالا میخوام ببینم میشه با هر بار اجرای حلقه ی اول، حلقه ی دوم برگرده به اول تا از دوباره سطرها رو بخونه؟
 

ziXet

مدیر انجمن PHP/MYSQL
خوب منم توی دومین پست همین رو گفتم:
حالا میخوام ببینم میشه با هر بار اجرای حلقه ی اول، حلقه ی دوم برگرده به اول تا از دوباره سطرها رو بخونه؟
فکر کردن هم بد چیزی نیستا!
 

*Hamid*

New Member
خوب شما که فکر میکنی بفرمایید چطور این کار رو بکنم.
بازم میگم من کد نمیخوام من میخوام مشکل کد خودم رو حل کنم.
 

I.NoBody

Active Member
قبلاً هم گفتم. روشت جالب نیست.
اگر هم می خوای هر بار برگردی اول حلقه، باز روشی که من بهت گفتم، بهتره.
به هر حال سوال جدید شما اینه که چطور میشه هر بار از اول حلقه شروع کنی.
قبل از شروع حلقه دوم، این کد رو اضافه کن:
کد:
mysql_data_seek($result2, 0);
 

*Hamid*

New Member
قبلاً هم گفتم. روشت جالب نیست.
اگر هم می خوای هر بار برگردی اول حلقه، باز روشی که من بهت گفتم، بهتره.
به هر حال سوال جدید شما اینه که چطور میشه هر بار از اول حلقه شروع کنی.
قبل از شروع حلقه دوم، این کد رو اضافه کن:
کد:
mysql_data_seek($result2, 0);
ممنون.دنبال همین تابع میگشتم.
البته قبول دارم که روشم زیاد جالب نیست ولی بیشتر دنبال اینکه چرا کار نمیکنه بودم.
 

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

بالا