לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #3  
ישן 09-06-2006, 18:56
  Depression Depression אינו מחובר  
 
חבר מתאריך: 07.08.03
הודעות: 408
בתגובה להודעה מספר 2 שנכתבה על ידי GreenBerret שמתחילה ב "הממ, קודם כל תנסה בבקשה..."

השאילת חוזרת על עצמה עד ש C_ParentID = 1 ומדפיסה את הC_ID של אותה תוצאה.
למעשה מה שקורה אצלי, זו מערכת של קטגוריות ותתי-קטגוריות עד אין סוף.

הסדר כללי למה המערכת משמשת:
אם אני רוצה להוסיף בן לקטגוריה מסויימת, אני מוסיף את הC_ID של אותה קטגוריה אל הC_ParentID של הקטגוריה החדשה.
ככה בקריאה של הקטגוריות אני בודק את כל אלו שאין להם C_ParentID (כלומר הראשיות) ומוציא את הC_ID שלהם.
אז אני ממשיך הלאה, ומחפש את התוצאות שמכילות בC_ParentID את הC_ID של הקטגוריות הראשיות וכך הלאה ופולט אותם.
ככה אני מקבל בצורת מבנה עץ את כל הקטגוריות והבנים שלהם.


מה שקורה בפונקציה הספציפית שהצגתי:
הפונקציה עושה פעולה הפוכה להסבר שכתבתי מקודם, במקום לגלות את הילדים שלה, היא מגלה את ההורים שלה וסופרת את כמות השאילותת שמתבצעות עד שנמצא תוצאה עם C_ParentID=1
ככה אני יודע מה העומק של הקטגוריה ומשתמש בזה לדברים אחרים..
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #4  
ישן 09-06-2006, 22:37
  GreenBerret GreenBerret אינו מחובר  
 
חבר מתאריך: 13.12.05
הודעות: 1,963
בתגובה להודעה מספר 3 שנכתבה על ידי Depression שמתחילה ב "השאילת חוזרת על עצמה עד ש..."

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

דרך ראשונה

  1. לתת ID (מזהה) ייחודי לכל קטגוריה (כמובן).
  2. ליצור תא בטבלה, שמכיל את ה"עץ".
  3. עץ מורכב מכל המזהים שעברת (כביכול) עד לקטגוריה הנוכחית.
  4. העץ יהיה בנוי בצורה הבאה לדוגמא: 004.006.012.130 - מכאן נובע שקטגוריה 130, העץ שלה יהיה 004.006.012
  5. מצב כזה יוצר לך אפשרות שבסידור אחד, אתה מקבל את כל הקטגוריות, וכל תת הקטגוריות בסידור היררכי ואתה רק צריך לבדוק כמה "נקודות" יש בעץ ולפי זה לבצע פעולות (הזחות, סידור במסך, וכו')
ישנן כמה בעיות עם הדרך הזו:
  • דורש תכנון מקפיד מראש ובנוי בעקרון למערכת קטגוריות מאוד מוגדרת (כדוגמא לפורומים)
  • ברוב המקרים אתה צריך לכלול עוד כמה שדות של "אבא" מקרבה ראשונה, או "אבא" ראשי וכו'.
  • קצת קשה לסדר את הפריטים לפי סדר שונה (למשל תאריך עדכון) ועדיין לקבל אותם בסדר היררכי.
  • תלוי בדרישות אולי תצטרך גם טבלה נוספת של הקטגוריות הכי ראשיות.
  • אפשר לחשוב על עוד זו פשוט דרך שמפשטת לך פחות או יותר את עניין ה"סידור" בשאילתה אחת אבל מגבילה אותך אפריורית בפיתוח.
דרך שנייה
  1. אותה טבלה כמו שאתה יצרת, עם מזהה שמצביע רק על ה"אבא".
  2. להוציא בכל פעם את כל טבלת הקטגוריות ובעזרת לולאה פשוטה, סריקה של כל התוצאות, mysql_data_seek (או כל דבר אחר שתרצה), ומשתנה שישמור את הקטגוריה שכרגע נצפית על ידי המשתמש בכדי לרוץ על העץ (אחורה) ולהוציא את המידע שאתה צריך.
דרך שלישית (צמצום תוצאות)
אם כל כוונתך היא להוציא 3 "אבות" בכל פעם אתה פשוט יכול לשרשר 3 JOINים על אותה טבלה או תת-שאילתות במקום ליצור שאילתה המתקיימת בתוך רקורסיה.



דרך רביעית (הכי חסכונית לפי דעתי)

להשתמש בAJAX, ולהוציא אך ורק את הקטגוריות שה"לקוח" מבקש לראות.

נערך לאחרונה ע"י GreenBerret בתאריך 09-06-2006 בשעה 22:53.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #5  
ישן 10-06-2006, 00:49
  Depression Depression אינו מחובר  
 
חבר מתאריך: 07.08.03
הודעות: 408
בתגובה להודעה מספר 4 שנכתבה על ידי GreenBerret שמתחילה ב "הבנתי אותך, אבל זו לא הדרך..."

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


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

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

יכל מאוד להיות שאני אוותר על הפונקציה של "חזרה למקורות" וחיפוש ילדים,
פשוט אני אצור עמוד נפרד לכל סוג מוצרים, ובטבלה של המוצרים אני אכתוב כמו שאמרת את ההורים עצמם 01,23,233 וכו'..
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #13  
ישן 10-06-2006, 17:55
  דקל דקל אינו מחובר  
 
חבר מתאריך: 20.02.03
הודעות: 2,396
בתגובה להודעה מספר 12 שנכתבה על ידי Depression שמתחילה ב "הוא נובע מכך שבכל פעם שהמשתנה..."

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

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

בברכה,
דקל
_____________________________________
"מתכנת זה אדם שפותר בעיה שעל קיומה לא ידעת, בדרך שאינך מבין"

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 21:03

הדף נוצר ב 0.05 שניות עם 12 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2024 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר