לולאת while שלא מסתיימת

לולאת while שלא מסתיימת

שלום אני מנסה להשתמש בלולאת while, ומשום מה, למרות שהתנאי מתקיים, הלולאה לא מסתיימת. אני מנסה למצוא קובץ במחיצת נושא מסויים, בתוכה, המחיצות נקראות לפי השנה, במידה והקובץ לא נמצא, יש לנסות במחיצה של שנה שעברה .... (לולאה), עד שמוצאים. הנה הקוד, אודה לעוזרים
$curr_year=DATE(Y); // yyyy $yy=substr($curr_year,2,2); chdir ('main_dir'); $found_file = false; while ($found_file = false) { $folder_name = "doch".$yy; if(is_dir($folder_name)) { echo "dir ".$folder_name." exist !<br>"; chdir ($folder_name); // 1 level up $file_name = "file_for".$yy.".htm"; if(file_exists($file_name)) { $found_file = true; // set true, no more loop needed echo "file ".$file_name." exist !<br><br>"; } else // if_file { chdir ('../'); // back 1 level echo getcwd()." cwd after back<br>"; // show me curr dir } } else // if_dir { echo "dir ".$folder_name." not exist !<br>"; } $save_year = $yy; $curr_year -= 1; // we need to check prev year $yy=substr($curr_year,2,2); } // end while​
פקודות ה- echo מראות לי שהלולאה עובדת בסדר, אבל גם כשנמצא הקובץ, והתנאי מתקיים, הלולאה ממשיכה. כל עזרה בפתרון הבעייה תתקבל בהמון תודה. שמוליק
 

יולו

New member
תנסה כך:

בשורה הזאת:
while ($found_file = false)​
לשנות ל:
while ($found_file == false)​
 
לא, לא, זו שגיאה נפוצה

זה כאילו מציבים את הערך false במשתנה founf_file$. ב- if אכן שמים שני סימני =, אבל לא כאן (גם לא בלולאת for). תודה על הנסיון לעזור. עוד רעיונות?
 

פשוש

New member
זו אכן שגיאה נפוצה...

הקוד:
while($var=false) { //do useful things here }​
פירושו בעברית: בצע את הקוד הנתון בתוך הסוגרים המסולסלים כל זמן שאתה יכול להציב את הערך false בתוך המשתנה $var. זו כנראה לולאה שתתבצע כאורך חיי הסקריפט כפי שהוגדר ב- php.ini . (אין לולאה אינסופית - יש לולאה שמסתיימת בברוטליות ע"י המנוע) הקוד שלך יתוקן את תכתוב שני סימני שוויון שאכן יבדקו את השוויון ולא *יבצעו אותו* ללא כל תנאי.
 
וואלה, זה עובד. לוגיקה דפוקה שלי..

הצורה הנכונה:
while ($found_file==false) { do whatever you need }​
אני הייתי בטוח שהפירוש בעברית של הלולאה הוא: בצע את הקוד הנתון בתוך הסוגריים המסולסלים כל עוד הערך של VAR$ שווה ל-false, כשהוא משתנה, סיים את הלולאה. אם כך, לצורך ההבנה שלי, איך נתאר בעברית לולאה מאוד נפוצה לשליפת נתונים ממאגר MySql?
while ($row = mysql_fetch_array($news)) { //do useful things here {​
שרפתי כמעט יום שלם בנסיונות סרק, באחד מהם אכן ניסיתי להשתמש ב ==, אבל בגלל באג בתוך הלולאה, לא הגעתי לשינוי ערך המשתנה ל-false. המון תודה, שמוליק
 

פשוש

New member
זה כבר משהו אחר לגמרי...

אתה מציב לתוך $row את התוצאה של פונקציה בשם mysql_fetch_array ואז בודק את תוכן המשתנה $row . באופן זה הלולאה תתבצע בכל פעם שהפונקציה מחזירה ערך כלשהו ומפסיקה להתבצע ברגע שהוחזר false. תוכל להסתכל על זה כך: לולאת ה- while מתבצעת בכל פעם שהתנאי שלה שונה מ- false. התנאי יכול להיות נתון ע"י כל משתנה או תוצאת חישוב או ערך המוחזר מפונקציה. התנאי:
$var==false​
יהיה תמיד שלילי. לעומת זאת התנאי
$var=false​
יהיה תמיד חיובי כי בדקת את תוצאת ההצבה (והיא הצליחה!) ולא את תוכן המשתנה $var.
 
משהו לא מסתדר לי

את זה כבר לא הבנתי. נגיד שנמצאה רשומה, מוחזר ערך כלשהו (לא false), אם הוא לא false הלולאה מתבצעת. לא נמצאה רשומה, מוחזר false והלולאה מסתיימת. כאשר העברתי ערך שהוא לא false לשדה (במקרה שלי true), זה לא היה אמור להיות מקביל למציאת רשומה והעברת ערך שונה מ-false, ולגרום ללואה להתבצע? אם אפשר עוד הסבר קטן על ההבדל בין שני התנאים שהוצגו בסוף ולמה אחד בודק הצבה ולא תוכן. משהו בלוגיקה לא נקלט לי... אולי הגיל? שוב תודה.
 

פשוש

New member
זה לא הגיל... זה המורה!

הרי לך ההסבר: ביצוע של כל אחת מהפקודות האלו:
if(condition) while(condition)​
מבצע בדיקה (הערכה) של המשתנה שנתון בתנאי. אם נתון משתנה אזי נבדק ערכו. אם נתון קבוע אזי הקבוע נבדק. כך התנאים
if($myVar) while(true)​
נבדקים ומוערכים בהתאם למשתנה/קבוע. אם נתונה פונקציה בתוך התנאי אזי מוערך הערך המוחזר מהפונקציה ולא משהו אחר. כך ביצוע של
if($var=mysql_fetch_row($result))​
מעריך את $var שמכיל את מה שמוחזר מהפונקציה. אם אתה בודק כך:
if($var=mysql_fetch_row($result)) OR if(mysql_fetch_row($result))​
תקבל את אותה התוצאה (הערך המוחזר מהפונקציה) אבל לא תוכל להשתמש בו כיוון שלא שמרת אותו לתוך משתנה. יש פונקציות שהערך המוחזר מהן אינו דרוש מעבר לאותה השורה ואז אין צורך לשמור אותו:
if(isset($myVal))​
זה מחזיר true/false ואין לך צורך בערך הזה לעומת mysql_fetch_row שמחזיר מערך עם שורה מתוך שאילתת SQL שבוודאי דרושה לך. כאשר אתה מבצע
if($var=false)​
אתה בודק את מידת ההצלחה של פונקציית ההצבה (שכנראה תמיד תצליח) ולא את הערך הנתון בתוך $var. מקווה שההסבר הזה טוב יותר.
 
זה בסדר, מה עם סימני ה- =

למה אצלי הייתי צריך לשים שניים בתנאי של ה- while ובמקרה של שליפה מהמאגר משתמשים באחד. זה הקטע שנפלתי בו. מצטער שהשרשור הזה הפך לכזה ארוך, אני מנסה להפיק ממנו את המכסימום, והוא כל כך מפורט, שגם אחרים יוכלו לנצל אותו להבנה. תודה.
 

פשוש

New member
סימני השוויון

סימן שוויון אחד מבצע הצבה של ערך (או ערך המוחזר מפונקציה) לתוך משתנה. שני סימני שוויון מחזירים 1 אם המשתנים בשני הצדדים שווים ו-0 אם לא. הקוד הבא בודק אם המשתנים שווים זה לזה:
if($a==1) print("a is 1");​
הקוד הבא מציב ערך לתוך משתנה ובודק את תוכן המשתנה:
$a=1; if($a) print("a is 1");​
והקוד הבא מבצע בדיוק את אותו הדבר תוך שימוש בהצבה ובדיקת התנאי:
if($a=1) print("same thing - a is 1");​
בלולאת while הדבר דומה לחלוטין רק שתנאי הסיום שלה אמור להיות מחושב בתוך הלולאה, כפי שזה מופיע אצלך. כאשר אתה משתמש בהצבה (סימן שוויון אחד) אתה דורס את תנאי הסיום שחושב בתוך הלולאה ע"י הצבה מחדש לתוך המשתנה:
$a=1; while($a=1) { $a=0; }​
זוהי לולאה שלא תסתיים בעצמה. בכל איטרציה יוצב הערך 1 בתוך המשתנה והבדיקה תבדוק אותו מחדש. הערך 0 המוצב במשתנה לעולם לא יביא לידי סיום הלולאה כיוון שערך אחר מוצב שוב ושוב.
 

יולו

New member
שמח שעובד לך..

בכל מקרה, אם אני לא בטוח ב 100% שמה שאני אומר יעבוד אני לא אומר
 
למעלה