אשכול: פורום עץ
View Single Post
ישן 01-08-08, 23:51   # 2
intercooler3819
חבר וותיק
 
מיני פרופיל
תאריך הצטרפות: Jul 2008
הודעות: 1,056

intercooler3819 לא מחובר  

קלי קלות..
רקורסיה (:
אתה עושה טבלה כזאת
id | cid | title | content

עכשיו הPID מסמל את הID של התגובה שאליה מגיבה התגובה הנוכחית
כאשר הPID = 0 מדובר בנושא

אתה בהתחלה שולף מהטבלה בעזרת WHILE בכל מקום שבו PID=0
ואז בתוך הלולאת WHILE קורא לפונקציה רקורסיבית שבעבור כל הודעה שהPID אצלה שווה לID של הנושא הנוכחי תחפש הודעות שהPID שלהם שווה לID של התגובה

זה נשמע קצת מסובך
רקורסיה פשוטה

אממ אני לא יודע אם זה הכי יעיל פשוט פעם אחרונה שכתבתי כזה עץ עשיתי את זה ככה, מן הסתם אם תחשוב על דרך להריץ את זה עם לולאות זה יהיה יותר יעיל

שבת שלום

ניצן


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

קוד:
function rec_posts($pid, $padding = 0)
{
    global $DB, $STD, $greendays, $posts_array;
    
    $posts_q = $DB->query("SELECT * FROM `sk_forums_posts` WHERE `pid`='{$pid}'");
    if ($DB->numRows($posts_q) > 0)
    {
        while ($posts_f = $DB->fetchArray($posts_q))
        {
            $z5 = $DB->query("SELECT `name` FROM `sk_users` WHERE `id`='{$posts_f['poster_id']}'");
            $z6 = $DB->fetchArray($z5);
            $posts_f['poster_name'] = $z6['name'];
            if ((time()-$posts_f['post_date']) <= $greendays) $posts_f['d'] = 1;
            $posts_f['padding'] = $padding;
            $posts_f['date'] = $posts_f['post_date'];
            $posts_f['post_date'] = $STD->fast_date("forum_post_date", $posts['post_date']);
            $posts_array[$posts_f['date']] = $posts_f;
            $padding++;
            rec_posts($posts_f['id'], $padding);
        }
    }
}
והקריאה לפונקציה:
קוד:
$topics_buffer = "";
            while ($topics_f = $DB->fetchArray($topics_q))
            {
                $posts_array = Array();
                rec_posts($topics_f['id']);
                $posts_buffer = "";
                if (count($posts_array) > 0)
                {
                    ksort($posts_array);
                    
                    foreach ($posts_array as $post_date => $parray)
                    {
                        $posts_buffer .= $SKIN->post($parray);
                    }
                }
                
                $topics_f['posts_content'] = $posts_buffer;
                $z7 = $DB->query("SELECT `name` FROM `sk_users` WHERE `id`='{$topics_f['poster_id']}'");
                $z8 = $DB->fetchArray($z7);
                $topics_f['poster_name'] = $z8['name'];
                if ((time()-$topics_f['post_date']) <= $greendays) $topics_f['d'] = 1;
                $topics_f['post_date'] = $STD->fast_date("forum_post_date", $topics_f['post_date']);
                $topics_buffer .= $SKIN->topic($topics_f);
                unset($posts_buffer);
            }
            
            $num = $DB->numRows($DB->query("SELECT `id` FROM `sk_forums_posts` WHERE `pid`='0'"));
            $lnkbuf = "";
            for ($i=1; $i<=ceil($num/$perpage); $i++)
            {
                if ($INC['page'] == $i) $lnkbuf .= $SKIN->list_pagelink_current($i, $INC['id']);
                else $lnkbuf .= $SKIN->list_pagelink($i, $INC['id']);
            }
            
            $output .= $SKIN->template(Array('posts' => $topics_buffer, 'page_links' => $lnkbuf, 'fid' => $INC['id'], 'name' => $forum_info['name']));
יש כאן גם תיעוד של הטבלה:
קוד:
CREATE TABLE `sk_forums` (
  `id` INT(8) AUTO_INCREMENT,
  `posts` INT(8) NOT NULL,
  `name` TEXT NOT NULL,
  `description` TEXT,
  `rules` TEXT,
  `manager_id` INT(8),
  `perm` VARCHAR(255) NOT NULL,
  PRIMARY KEY (`id`)
) TYPE=MyISAM;

CREATE TABLE `sk_forums_posts` (
  `id` INT(8) AUTO_INCREMENT,
  `pid` INT(8) NOT NULL,
  `fid` INT(8) NOT NULL,
  `title` TEXT NOT NULL,
  `content` TEXT,
  `poster_id` INT(8) NOT NULL,
  `post_date` TEXT NOT NULL,
  PRIMARY KEY (`id`)
) TYPE=MyISAM;
אם יש עוד בעיות אתה מוזמן לשלוח הודעה
עדיפות למייל

ניצן
__________________

Last edited by intercooler3819; 01-08-08 at 23:56..
  Reply With Quote