517
צפיות
צפיות
72
תשובות
תשובות
בניית פורום
שלום לכולם!
לאחרונה(לפנ כמה ימים) החלטתי שאני צריך לבנות מערכת פרומים לאתר שבניתי(לאור ביקוש הגושלים), אבל אף פעם לא בניתי פורום ולכן אין לי ניסיון בזה כלל וכלל…
קראתי את המאמר שכתב רועי עובדיה, הבנתי אותו פחות או יותר, אבל לא הבנתי מה קורה אם רוצים לשלוח תגובה להודעה שאינה הודעה ראשית? כלומר תגובה לתגובה…?
תודה, אלברט
72 תשובות
תקרא את המאמר שלי
=>
אמרתי לך שקראתי ולא ממש הבנתי איך זה בדיוק עובד…
ואני גם לא יודע לעבוד עם מערך דו מימדי…..
את המאמר של רועי הבנתי פחות או יותר אבל ממש לא הבנתי איך אפשר לתת תגובה לתגובה?
איך אני עושה?
תודה, אלברט
היכן המאמר ההוא?
אבל שמע
זה משהו דיי קל… אתה עובד ב-getRows ואני מניח שאתה יודע איך עובדים עם getRows
וגם בקרוב המאמר החדש שלי יעלה כאן בוואבמסטר(שהילדה תשוב) שהוא מסביר על המשך הפורום
=>
א. המאמר נמצא כאן.
ב. אני לא יודע איך עובדים עם getRows אני אפילו לא יודע מה זה…..
וחוצמזה אני גם לא מבין את העיקרון של הפורום, זא, בצורה אלגוריטמית, אני לא מבין איך הפורום פועל.
ואתה לא יכול לעזור לי לגבי המאמר של רועי? איך אפשר לשלוח תגובה לתגובה?
תודה, אלברט
הקישור:
דרך אגב ניר,
השתדל להמנע מהרקורסיה הזאת. בניית פורום רקורסיבי זה אמנם קל, אבל לא ממש יעיל
בבקשה
איך אפשר להוסיף הודעה לתגובה ולא להודעה הראשית?
תודה
מה כן יעיל?
סתם בשביל שאני ידע אני גם בונה פורום בימים אלה.
=>
אתה יכול לעזור לי בבקשה?
לא יעיל בשרת
אני בונה את הרקורסיה בלקוח (על העברה ללקוח יהיה במאמר שיעלה בקורב)
ואני דיי נמנע מרקורסיה אין לי הרבה צורך בזה
=>
מישהו מוכן בבקשה להסביר לי איך אני בונה את הפורום הזה?
תודה, אלברט
כלומר:
רק אני לא יודע איך בדיוק מתבצע שליחת הודעה לתגובה ולא להודעה ראשית?
תודה רבה
לא אבל שאלתי….
שאלתי מה כן יעיל? איזה סוגים יש עוד חוץ מרקורסיבי ואיך הם מתוכננים?
הקטע ברקורסיה זה
שהפונקציה קוראת לעצמה שוב ושוב עד שמתמלא תנאי מסוים (במקרה של הפורום זה עד שאין תגובות להודעה מסוימת)
איך אני מבדיל בין הודעת אב להודעת בן ?
יש לנו עמודה בשם ParentID בפורום שלנו המעידה על ה-ID של הודעת האב
ויש לנו עמודה בשם ID שהיא מספור אוטומטי שנותנת ID להודעה מסוימת
הודעתאב זו הודעה שקיבלה parentID בלתי אפשרי שיהיה בשדה ID ז"א שאם הערך הראשון האפשרי בשדה ID הוא 1 (ע"פ המספור האוטומטי) אז עלינו לתת מספר קטן מאחד… ניקח את המספר 0
הודעת בן (תגובה)
זו הודעה שקיים לה parentID בשדה ה-ID ואז ברקורסיה עצמה אנו יכולים להדפיס אותה כתגובה
כדי לשלוח תגובה או הודעה עלינו לשלוח את ה-ID של ההודעה אליה אנו מגיבים
(הודעה חדשה=0)
אם אתה צריך עוד הסברים או שמשהו לא מובן אז דבר
יש עוד כמה
יש את הליניארי (שאני לא מתמצא בו)
יש את ה-DC שזה הפורום שבו נכנסים להודעה בעמוד חדש ורואים את כל התגובות שלה לפי סדר מהישן לחדש (לרוב כמו ה-PHPHEB ודומיו)
מישהו יכול להסביר לי על הלינארי?
ליניארי כביכול זה פורום
שהשליפה בו מסודרת אך המסד הוא טעות אחת גדולה.
הודעות ותגובות מסודרות לפי סדר הגיוני ז"א שאם להודעה יש ID כזה (מסוג טקסט) :
001
אז התגובה הראשונה שלה תהיה : 001.001
אתה יכול למצוא וד הסברים ב-faq של פורום ASP בתפוז (130) רק תכתוב שם ליניארי ותקבל שם תוצאות… (יש גם מדריך איך לבנות את הפורום)
אני אישית מעדיף את הרקורסיבי כי המסד של פורום זה בנוי נכון. פורום זה אולי לא יעיל בשרת אבל ברגע שמבצעים את הרקורסיה בלקוח הכל מסתדר לטובה
למה הוא לא יעיל בשרת?
תודה על התשובות ועל הסבלנות..
הוא לא יעיל בשרת בגלל
שלכל הודעה יש תגובות בדר"כ ובגלל שזו פונקציה שקוראת לעצמה היא שוב ושוב ושוב מתבצעת עד שכל השרשור מודפס… ואז זה עובר לעוד שרשור
בכל עמוד יש 15 שישורים למשל ונגיד שיש שרשור-פלצת ויש גם רק הודעה וכל השרשורים האחרים הם ברמת הסביר… השרשור פלצת יגזול לנו טונה משאבי שרת בגלל הרקורסיה…
עכשיו ברגע שמעבירים ללקוח את הרקורסיה יש פחות עבודה לשרת וכך העמוד עולה יתר מהר
התפיסה של חוסר הקפדה על יעילות
בלקוח מוטעית. גם ללקוח העברת מערך דו מימדי ברקורסיה יכולה להיות כבדה…
מי אמר שאני מעביר מערך דו מימדי
מהשרת ללקוח אני משתמש ב-getString ומפרק את המחרוזת למערך חד מימדי בלקוח!
אוקיי… ועל המערך אתה עושה רקורסיה
תחשוב כמה זכרון זה לוקח
אני מבין אותך נכון?=>
כלומר:
הודעת אב – 0
תגובה להודעת אב – מספר הID של ההודעה
תגובה לתגובה – מספר הID של התגובה
ככה זה עובד?
ככה זה יצא:
|id| |parentID| |body| וכו'…
|1| |0| |הודעת אב|
|2| |1| |תגובה ראשונה להודעת האב הראשונה|
|3| |1| |תגובה שניה להודעת האב הראשונה|
|4| |2| |תגובה ראשונה לתגובה להודעת האב הראשונה|
נכון? זה העיקרון?
=>
יש דרך לא לעבוד עם מערך?
כלומר, כמו המאמר של רועי? שהוא בונה שאילתה באקסס שהיא מסדרת את ההודעות לבד, ואנחנו רק שולפים את הנתונים בקוד הASP שלנו ומדפיסים את ההודעות…
הבעיה במאמר שלו, שלא הבנתי איך אנחנו שולחים תגובה לתגובה?
ניר אמר לי שמכניסים לתוך ה- parentID את ה-ID של ההודעה(התגובה).
אבל אז איך נדע לאיזה שרשור היא שייכת? ואיך השאילתה מסדרת אותה?
אני מבולבל לגמרי…
תודה, אלברט
אבל אני בניגוד לאחרים
לא עושה בלולאה שקוראת לפונקציה מעבר על כל איברי המערך אלא מדלג בכל פעם שורה (מערך חד מימדי—> נשמע מוזר נכון–>ראו מאמר שלי)
ללקוח כמו לשרת יש בעיות עם מערכים דו מימדיים (מהירות!) ולכן אני עובד על חד מימדי
ואני מודה זה לוקח זיכרון אבל בהרבה פחות זיכרון מאשר עבודה בשרת
תפנה ל-wazzap מישהו הכין לו
פורום רקורסיבי שעובד עם הרקורדסט
קלוט לאחרי שלושה ימים הפורום הזה נופל… (מבחינת מהירות)
למה אנחנו עובדים עם מערך ?
עבודה עם מערך מכניסה לנו את כל הרשומות המתבקשות במשתנה אחד ואפשר לגשת לכל נתון בנוחות…
נסה לעבוד עם getString בלי להפוך אותו לבסוף למערך ?!!! (מי שיצליח הוא מלך ) getSTring מקבל את הרשומות כמחרוזת אחת של הודעות.
זה או עבודה מהירה ונוחה! עם מערכים
או עבודה איטית ולא נוחה (ואף טיפה מסובכת) עם הרקורדסט…
אני שואל אם אפשר בכלל לא לעבוד עם
מערך?
קראת את המאמר של רועי?
הוא בנה באקסס שאילתה שמסדרת את ההודעות בעצמה, ואנחנו רק שולפים את ההודעות ומדפיסים אותן….
זה לא טוב ככה?
ותענה לי בבקשה על השאלה ששאלתי אותך למעלה
תודה, אלברט
צודק בהחלט
דראתי בזמנו את המאמר
ולא הבנתי כלום…
ולאחר שקראתי אותו שנית …
הגעתי למסקנה שהוא לא הכי יעיל…
פתית שני רקורדסטים (בעעע)
לולאה בשרת (בעעע)
וגם אם זה פורום רקורסיבי אז איפה הפונקציה הרקורסיבית
אני הייתי קורא לפורום הזה פורום עץ ולא רקורסיבי (עץ בכלליות, רקורסיביות בספציפיות)
=>
העיקרון הוא זה שהשאילתה מארגנת את ההודעות לפי ערכים כפולים שיש בשדה ה- parentID…..
עד פה הכל ס22ה, אבל מה קורה אם רוצים לשלוח הודעה לתוגבה ולא להודעה ראשית?
שולחים את ה-ID של התגובה
כ-PARENTID להודעה החדשה…
=>
ואיך השאילתה אמורה לסדר את ההודעות?
ואיך נדע לאיזה שרשור ההודעה שייכת?
ניר?
אפשר להוסיף עמודה בשם rootID
(אם היא לא קיימת) שבעצם מקבלת את ה-ID של ההודעה הראשית בשרשור ובכך מסדרים את העמוד
ובקשר לשאלתך הראשונה אני לא יודע… אני לא בונה כך…
גם אני חשבתי ככה..
אתה יכול להגיד לי מה הפורום הכי יעיל שיש?
ותסביר לי בבקשה קצת על הפונקציות שאתה משתמש בהן בקוד שלך…
תודה
לדעתי הפורום הכי יעיל הוא DC
אבל אני לא אובייקטיבי
יש כאן מאמר חדש על עקרונות לבניית פורום של "מישהו" כהן (לא זוכר את השם )
קרא אותו הוא ייתן לך כייון כללי
יש כאן מאמר שלי על הפורום הרקורסיבי
ומה שיש שם זה מה שאני עושה רק בלקוח
=>
קודם כל, תודה רבה!
שנית, אתה יכול להסביר לי מה זה פורום DC? לתת לי קישורים למאמרים(בעברית) וכו'….
ועוד דבר, אמרת שיש לך עוד מאמר על פורום רקרוסיבי, העלאת אותו כבר?
תודה, אלברט
כן יש לי
לילדה בלבן היו כמה הארות על המאמר והייתי צריך להוסיף משהו (הטראנזיקציות)
וזהו הוא צריך לעלות בקרוב מאוד
=>
אוקיי ס22ה נחכה
ותענה לי בבקשה על השאלחות הקודמות…
תודה
אם אפשר להפסיק עם החיצים האילו
בבקשה.
תודה.
אתה יכול לרכז אותן בהודעה אחת בבקשה
?!!!
אוקיי
אני כותב חיצים כי אין לי נושא להודעה….
אתה יכול להסביר לי מה זה פורום DC? לתת לי קישורים למאמרים(בעברית) וכו'….
תודה, אלברט
פורום DC זה פורום
שכל הנושאים מוצגים בו ובלחיצה על קישור מגיעים לעמוד ההודעה עצמה וכל התגובות מסודרות בסדר כרונולוגי (מהישן לחדש)
אתה מוזמן להסתכל בפורומים שסוסיתא נותנת כדי לקבל רעיונות…
זה כמו PHPBB, לא?
אבל מה הבעיה?
שאני לא יודע בכלל איך בונים פורום?
זה ממש לא מתסדר לי בראש.
כאילו איך אנחנו יכולים לסדר את ההודעות?
הבעיה שלי זה לשלוח תגובה לתגובה לתגובה וכך הלאה….
זה ממש לא מסתדר לי בראש…..
תעזור לי בבקשה
תודה.
אלברט.
טוב אני אלך לוגי…
תחשוב ככה… שתגובה זו הודעה ולהודעה יש תגובות התגובות מקבלות את ה-ID של ההודעה וכך זה ממשיך הלאה
וכך הולכ הטבלה :
| ID | | pID | | subject |
| 1 | | 0 | |ראשי |
| 2 | | 1 | |תגובה לראשי |
| 3 | | 2 | |תגובה לתגובה |
| 4 | | 2 | | תגובה שנייה לתגובה |
| 5 | | 3 | | תגובה ראשונה לתגובה המשנית |
בעצם אין הבדל בין הודעה ראשית לתוגבה ראשונה לתת תגובה
כך את החלון כהודעה אחת גדולה
ההדועה הגדולה הזו מחפשת את כל הנושאים שלה (pID =0)
הנושאים מחפשים את התת נושאים שבעצם הם נושאים המקבלים pId השווה לנושא האב וכך הלאה
שגיאה:
עשיתי הכל לפי המדריך שלך(והוספתי כל מיני דברים אחרים מעצמי, אבל העיקרון הוא אותו עיקרון)
אבל אני מקבל את השגיאה הבאה:
Microsoft VBScript runtime (0x800A001C)
Out of stack space: 'showMessage'
מה הבעיה? ומה עליי לעשות?
תודה.
אלברט.
שעושים COPY-PASTE לקוד האחרון
במדריך לא מקבלים זאת
תראה את השינויים שעשית וננסה לעזור
אני לא
עשיתי COPY PAST לקוד שלך!
הקוד שלך בסיסי מידי…
אני הוספתי כמה שדות לטבלה לכן המקום של כל שדה התשנה במערך…..
רק זה מה ששיניתי…. והוספתי עוד כמה תגים לעיצוב והזחה של ההודעות…. זה הכל…
כל השאר כמעט אותו דבר…
אתה לא מבין מה אומרת השגיאה?
מספיק להביא לך את הפונק' הרקורסיבי?
תודה.
אלברט.
תביא את השאילתא כולל הפונקציה
הרקורסיבית…
לא אמרתי שאתה עושה copy paste לקוד שלי אני רק התכוונתי שהקוד שם עוד
לניר:
השאילתה והפונק' מצורפות כקובץ טקסט, לא רציתי להעתיק לפה, כי אין מקום לרוחב….
אני מצטער שהוא טיפה ארוך… אבל הוא עדיין נורא בסיסי
והנה השגיאה שאני מקבל:
Microsoft VBScript runtime (0x800A001C)
Out of stack space: 'showMessage'
כתבתי בקוד עצמו על איזה שורה זה מצביע…
תודה מראש.
אלברט
שמע…
כנראה אתה משווה את שני שדות שלא מתאימות ולכן זה קורה…
אני מציע לך תכתוב אך ורק את השדות שאתה באמת צריך תכתוב אותם בסדר הגיוני (קודם כל מספרים ואחר כך טקסט…)
ID, parentId, subject
הדרך שבה אתה עושה Padding תיצור לך מגלשה בסופו של דבר ולא עץ מסודר
המסד שלך בנוי אחרת מהמסד שלי… הודעות אב הם עם PARENTID בערך 0 ולא עובד עמודה של TRUE/FALSE…
ה-padding לא צריך להיות קשור למסד הוא מתבצע באופן עצמאי (DIV עם PADDING שנמצא בתוך DIV עם PADDING וכך הלאה)
כדי שתראה למה אני מתכוון עם ה-padding תסתכל על ה
המצורף הילדה בזמנו עשתה לי אותו כשלי יצא מגלשה במקום עץ מסודראני לא ראיתי בקוד שהבאת את המשתנה DMY
מצטער אם הייתי ביקורתי מידי
ניר:
א. השדות שאני מנסה להשוות הם כן נכונים(ראה תמונה, וגם תבין איך המסד שלי בנוי בהזדמנות זו) אני מנסה להשוות את התא
rsArray(0,index)
שהוא ID של ההודעה לתא
rsArray(3,index)
שהוא ה- parentID…
ב. לא הבנתי את הבעיה ב- padding שאני עושה, אם אתה יכול תן לי דוגמא של נגלשה שאני אראה מה ההבדל בין מה שאתה הבאת ומה שאני עושה. חושב להדגיש שאני רוצה שיצא כמו שיש בפורום הזה….
ג. parentID בהודעות האב הוא עדיין המספר של ההודעה ואני מבחין בהודעות אב ובנים דרך שדה בולאני בשם IsMain (הרעיון היה של "ירדן שם טוב" )
ד. אתה צדקת לגבי המשתנה Dmy במסד הנתונים היא Dmy אבל בקוד היא MsgDateAdd…
ואני מודה לך על כל הביקורות באמת, כי רק ככה אני אצליח להעלות על הטעויות שלי ואתקדם….
המשכתי את השרשור כאן:
הרעיון של ירדן היה לפורום טבלאי
ולא במבנה העץ ולדעתי גם זה תכנון לא נכון
אתה לא צריך את העמודה levelID זו חשיבה לדברי אוריקס והאחרים מפורום תפוז "קווקזית" (שלא תגידו שאני גזען P-:)
הודעה ראשית מקבלת parentID עם הערך 0 וכך מבדילים בין הודעה לתגובה
(0 בחיים לא יוכל להכינס כערך של מספור אוטומטי)
זו דוגמא למגלשה:
\@
\\\\\@
\\\\\\\\\\\\\@
\\\\\\\\\\\\\\\\\\\\\\\\\\\@
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\@
(@ זה תחילת הנושא)
כדי שהדבר הזה לא יווצר אתה יכול להשתמש בדוגמא שהילדה הכינה.
וברגע שתעשה כמו שהילדה הדגימה אז שני דברים יקרו:
1. לא תיווצר מגלשה
2. ההזחה תתבצע ב-CSS בלי קשר למסד
3. תוכל להוריד את העמודה levelID
עכשיו אל תשלוף את הכל כי אתה לא צריך את כל הנתונים בדף
למשל את ה-ID של הפורום וה-ID של כל שרשור אתה לא צריך (groupID ו-forumID)
אני מציע לך תתחיל מהבסיס של הפורום ז"א תיצור פונקציה רקורסיבית פשוטה שרק מציגה את הנושא של ההודעה מוזחת (כמו במאמר שלי) וכל פעם תוסיף משהו אחד לשאילתא
עכשיו בקשר למסד שלך, לאחר ההארות שלי אתה יכול להוריד את העמודה levelID ולאחר הצצה קטנה נוספת אפשר להפוך את שדה הנושא לשדה מסוג TEXT לא חבל על המקום ?!
אוקיי, אז ככה:
עדיין לא הבנתי את ההבדל בין הסוגים השונים של הפורומים(טבלאי, עץ וכו'…) האמת, זה לא משנה (לבנתיים לפחות, עד שיהיה לי עוד קצת ניסיון בבניית פורומים )
עכשיו, הורדתי את השדות שלא צריכים אותם לבנתיים והקוד נראה עכשיו בדיוק כמו שלך….
עכשי יש בעיה אחרת:
הקוד מציג לי רק את התגובה הראשונה להודעה הראשית…..
כמולר אם יש לי טבלה ככה שבנושא כתוב:
1 – כלומר הודעה ראשי
1.1 – תגובה ראשונה להודעה הראשית
1.2
1.3
1.4
אבל הפועם הקוד מראה לי רק:
1
1.1
(עם הזחה)
מה קרה לכל התגובות האחרות?
הנה הפונק':
if not rs.eof then
rsArray = rs.getRows()
for i = 0 to uBound(rsArray,2)
if rsArray(1,i) = 0 then
call showMessage(i)
end if
next
else
Response.Write("אין הודעות בפור
ום.")
end if
function showMessage(index)
MsgSubject = rsArray(3,index)
Response.Write("<div style=""padding-right:15px"">")
Response.Write(MsgSubject)
for a = 0 to uBound(rsArray,2)
if rsArray(1,a) = rsArray(0,index) then
call showMessage(a)
end if
next
Response.Write("</div>")
end function
ומבנה הטבלה מצורף כקובץ תמונה
מה הבעיה פה?
תודה.
אלברט.
תיקון לקוד:
אין לי מושג למה זה יצא ככה….
הנה הקוד בצורה יותר נוחה לקריאה:
if not rs.eof then
rsArray = rs.getRows()
for i = 0 to uBound(rsArray,2)
if rsArray(1,i) = 0 then
call showMessage(i)
end if
next
else
Response.Write("אין הודעות בפורום")
end if
function showMessage(index)
MsgSubject = rsArray(3,index)
Response.Write("<div style=""padding-right:15px"">")
Response.Write(MsgSubject)
for a = 0 to uBound(rsArray,2)
if rsArray(1,a) = rsArray(0,index) then
call showMessage(a)
end if
next
Response.Write("</div>")
end function
בדוק שלהודעות
הנוספות נתת PARENTID של הודעה קיימת…
ותוריד את isMain לא צריך גם אותו
בדקתי.. הכל בסדר…
נתתי אותו מספר ל- ParentID שנתתי להודעה הראשונה.. נורא מוזר…
מה הבעיה?
נסה אולי לשים
CINT בלולאה של התגובות
for a = 0 to uBound(rsArray,2)
if cint(rsArray(1,a)) = cint(rsArray(0,index)) then
call showMessage(a)
end if
next
לא עזר….
מה עליי לעשות?
תראה את השאילתא
אם אתה משתמש ב-* אז רק תגיד וזהו…
אני משתמש…
חחח איך אתה כזה ישר עולה על הבעיה "אם אתה משתמש ב- * אז רק תגיד וזהו"
זאת הבעיה?
הנה השאילתה החדשה:
שיניתי את השאילתה שלי אבל עדיין הבעיה קיימת:
rs.open "SELECT MessageID,ParentID,MsgSubject FROM forumsMsg",conn
מה הבעיה ומה עושים?
תודה.
אלברט.
זו לא הייתה הבעייה פשוט רציתי לראות
אם אתה משתמש במימד המתאים בכל פעם
וטוב ששינית בפורום כזה כל טיפת זיכרון חשובה.
וגם רצוי שתרגיל את עצמך לזה, תמיד תשלוף אך ורק את הרשומות שאתה צריך
עכשיו תעשה כך:
if not rs.eof then
rsArray = rs.getRows()
for i = 0 to uBound(rsArray,2)
if rsArray(1,i) = 0 then
call showMessage(i)
end if
next
else
Response.Write("אין הודעות בפורום")
end if
function showMessage(index)
dim MsgSubject, a
MsgSubject = rsArray(2,index)
Response.Write("<div style=""padding-right:15px"">")
Response.Write(MsgSubject)
for a = 0 to uBound(rsArray,2)
if rsArray(1,a) = rsArray(0,index) then
call showMessage(a)
end if
next
Response.Write("</div>")
end function
מקווה שזה יעזור אחרת אני מציע שתתחיל מהתחלה ותלך לפי המאמר בשלבים
(עד שאני הגעתי לתוצאה הסופית לקח לי 3 פעמים –> פעמיים ראשונות עשיתי משהו לא נכון ב-SQL שהרס לי את הכל)
עכשיו זה עבוד!
אתה יכול להגיד לי איפה הייתה הבעיה?
יכול להיות שזה היה בגלל שלא
הגדרת משתנים בתוך הפונקציה ?!
ואני בסה"כ הגדרתי משתנים וסידרתי את הקריאות לאיברי המערך בהתאם לשליפה שלך
SELECT MessageID(0),ParentID(1),MsgSubject(2) FROM forumsMsg
כן זה היה בגלל
המשתנים שלא היו בתוך הפונק'…
עכשיו עוד שאלה:
איך אני יכול להציג את ההודעות הראשיות החדשות ביותר קודם ואז כל התגובות בסדר יורד מבחינת תאריך?
מישהו?
זאת השיחה הכי ארוכה שראיתי בפורום O