שליישיה לא זהה

oblivion13

New member
שליישיה לא זהה

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

kensaggy

New member
לא מובן...

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

oblivion13

New member
כנראה שאני די לא ברור

טוב, המטרה שלי הייתה להציג מספר מסויים של תוצות בטבלה, כך שהשאילתה, תפלוט כל פעם שורה בטבלה שתכלול מספר תאים. מטרתי הייתה להציג תוצאות שונות בתאים שונים, אך משום מה נוצר שיפכול של הנתונים, כלומר, שורה אחת בטבלה התפרסה על שורה בטבלה ולא על תא כמו שרציתי. הקוד היה משהו כזה לדוגמא :
<table> <? $query = mysql_query("SELECT * FROM name"); while (@($r = mysql_fetch_array($query))) { $name = $r["name"]; ?> <tr><td><?=$name;?></td><td><?=$name;?></td><td><?=$name;?></td></tr> <? } ?>​
כמו שכבר הוסבר ניסיתי להציג בקוד זה שלושה שמות שונים אך במקום זה הוא הציג לי את אותו שם שלוש פעמים. מה אני צריך לעשות בכדי למנוע את השיכפול?
 

shanor

New member
מממ...

על פי מה שכתבת בקוד, זה בדיוק מה שקיבלת. העיניין הוא פשוט, לקחת לולאה ואמרת: שים בNAME את הערך הראשון שבטבלה ותכתוב את הערך הזה בטבלה: NAME, NAME, NAME, ואז תעבור לסבב הבא בלולאה... הבעיה היא שאתה מוציא פלט של שלוש פעמים אותו שם בדיוק. מה שצריך לעשות הוא:
<table> <? $query = mysql_query("SELECT * FROM name"); while (@($r = mysql_fetch_array($query))) { $name = $r["name"]; ?> <tr><td><?=$name;?></td> <? } ?>​
ככה זה ירוץ לך כל עוד יש תוצאות בלולאה. עכשיו מגיעות השאלות הקשות: 1. למה אתה צריך להשתמש ב@??? האם אתה רוצה להמנע משגיאות שמתרחשות במהלך הלולאה? הסיבה שאני שואל היא כי לשים @ בלולאה אומר שיכול להיות מצב שבו יהיו לך שגיאות שאתה רוצה להמנע מהן. ברמת העקרון לא אמורות להיות שגיאות בלולאה, כך שאם יש סיכוי שתתרחש שגיאה אולי כדאי לחשוב על דרך אחרת לעשות את מה שאתה רוצה 2. כהמשך ישיר לנקודה הקודמת וגם כנקודה בפני עצמה, האם אתה בטוח שבכל מצב שהוא השאילתה תוציא לך רק שלוש שמות? כי על פי ההסבר שלך ועל פי הלולאה שבנית, אם בטבלה שלך יהיו 10 ערכים אז התוצאות שתקבל יהיו 10 תוצאות ואז יהיו לך 10 תאים בטבלה ולא 3 (אולי אם אתה רוצה להגביל את התוצאות כדי לשנות קצת את השאילתה עצמה). מקווה שעזרתי, בברכת הצלחה, שנאור.
 

oblivion13

New member
תודה

תודה על התשובה המפורט והחשיבה, אבל הבעיה שלי היא לא הוצאת והזפסת פלט מהמסד, אלה עצם כך שלאחר שהוא מוציא את המידע מהמסד אני רוצה שהוא ידפיס לי שורה בעלת שלוש תאים בעלי תוצעות שונות, 10 תאים בעלי תוצאות שונות באותה שורה זה לא בעיה, אני רוצה שלוש תוצאות שונות בפלט שיגיע בצורת שלוש תאים בשורה. אתה מציג הדפסה של תא אחד לכל תוצאה באותה שורה. המטרה אם אפשר לתת דוגמא היא להגיע לטבלה כדוגמאת זאת : http://www.allgames.co.il, בעמוד זה אפשר לראות טבלה בעלת שתי תאים בעלי תוצאות שונות, אני לא מאמין שבני אדם יושבים על הHTML ומעדכנים את זה כל יומיים? ואפשר להגיד שאני מסרב להאמין שPHP לא מאפשר דבר כזה. עדיין מצפה לקצת הארה....
 

shanor

New member
מממ...

אוקיי, נניח שהתוצאה אותה אתה מקבל מתוך השאילתא שלך מכילה 5 שורות של מידע. כל מה שצריך לעשות זה להחליט כמה תאים אתה רוצה בשורה. נניח כמו שאתה רוצה 3 תאים בכל שורה. כל מה שיש לעשות זה לשנות קצת את הלוגיקה של הלולאה. כדי להשאיר את העיניין כמה שיותר פשוט, כל מה שיש לשנות ולהוסיף זה: 1. משתנה שיספור כמה תאים יש בכל שורה. 2. תנאי שאומר אם יש 3 תאים תוסיף שורה חדשה. את זה אפשר לעשות בצורה הבאה:
$CountTD=0; while ($r=...) { if ($CountTD==3) { echo "<TR>"; $CountTD=0; } $CountTD++; echo "<TD>".$r[Name].... }​
עכשיו תוסיף רק את כל החלקים שלך בלולאה ואת כל הפלטים שאתה מוציא החוצה. כל מה שזה עושה, זה לבדוק האם הלולאה בוצעה 3 פעמים ואם כן, התנאי מוסיף TR כדי שתיתווסף שורה חדשה וממשיך להוציא תאים TD בטבלה. הערה חשובה, יש עוד הרבה מאוד דרכים טובות אחרות לעשות בדיוק את אותו הדבר. אני בחרתי בדרך הזו כדי לשמור על הפשטות של הקוד ועל ההסבר. בברכת הצלחה, שנאור.
 
למעלה