Помогите найти ошибку

KODEAK

Полезный
Регистрация
11 Апр 2009
Сообщения
172
Реакции
16
Собственно делаю небольшую форму комментариев, накопал в функцию древовидного отображения, но почему то сервер падает при открытии страницы, помогите пожалуйста найти ошибку
PHP:
$c_sql = "SELECT
			postID,
			postParentID,
			postTID,
			postAutor,
			postMessage
		FROM
			comments
		WHERE
			postTID = " . $topicID ."
		ORDER BY
			postParentID,
			postID";


$comment = mysql_query($c_sql);

$data = mysql_fetch_array($comment);

$tree = array();
foreach ($data as $row)
{
    $tree[(int) $row['postParentID']][] = $row;
}

function treePrint($tree, $pid = 0)
{
    if (empty($tree[$pid]))
        return;
    echo '<ul>';
    foreach ($tree[$pid] as $k => $row) {
        echo '<li>';
		echo $row['postAutor'] . ' :: ';
        echo $row['postMessage'];
        if (isset($tree[$row['postID']]))
            treePrint($tree, $row['postID']);
        echo '</li>';
    }
    echo '</ul>';
}

treePrint($tree);
 
Собственно делаю небольшую форму комментариев, накопал в функцию древовидного отображения, но почему то сервер падает при открытии страницы
что значит сервер падает ?
апач падает ? вся система падает ? или просто ошибку выплевывает ?
а вообще-то дебаггер вам в руки.
 
ну как бы долю секунды выводит большое число нулей, а затем станица перестает работать, сервер не отвечает
 
большое число нулей - это как?

ну и скорее всего причина в том что приведенный выше пример рекурсивный
и на большом числе данных просто не хватает ресурсов системы ...
 
бесконечная рекурсия :)

берите отладчик и ищите почему

посмотрите что в $tree попадает (хотя бы через print_r) перед первым вызовом treePrint.

а то, что нули выводит это что-то странное - единственный вывод это:
echo $row['postAutor'] . ' :: ';
echo $row['postMessage'];
ни то, ни другое нулем быть, по контексту, не должно.
так что смотрите что там у вас в $tree попадает - там бага.
 
если вместо обработки обращения к базе установить например
PHP:
$data=array(1, 2, 3, 4);
то результатом работы скрипта будет:
• ::
• ::
• ::
• ::
и сервак при этом не "ложится" так что советую покопаться именно в обращении к БД...
 
мне кажется проблема где то в этом месте

if (isset($tree[$row['postID']]))
treePrint($tree, $row['postID']);

идёт походу зацикливание
 
Ошибки в комментариях
PHP:
$c_sql = "SELECT
            postID,
            postParentID,
            postTID,
            postAutor,
            postMessage
        FROM
            comments
        WHERE
            postTID = " . $topicID ."
        ORDER BY
            postParentID,
            postID";


$comment = mysql_query($c_sql);
//тут вытащет из базы только один комментарий
$data = mysql_fetch_array($comment);

$tree = array();
//тут цикл по данным одного коментария, а postParentID лучше не использовать как индекс массива, он не уникальный и комментарии будут накладываться один на другой
foreach ($data as $row)
{
    $tree[(int) $row['postParentID']][] = $row;
}

function treePrint($tree, $pid = 0)
{
    if (empty($tree[$pid]))
        return;
    echo '<ul>';
    foreach ($tree[$pid] as $k => $row) {
        echo '<li>';
        echo $row['postAutor'] . ' :: ';
        echo $row['postMessage'];
        //в функции нет проверки postID = postParentID поэтому будет каждый раз вызывать саму и пойдёт опять по всем элементам, пока не хватит памяти и сервер упадёт
        if (isset($tree[$row['postID']]))
            treePrint($tree, $row['postID']);
        echo '</li>';
    }
    echo '</ul>';
}

treePrint($tree);
Тут рабочий вариант
PHP:
$c_sql = "SELECT
            postID,
            postParentID,
            postTID,
            postAutor,
            postMessage
        FROM
            comments
        WHERE
            postTID = " . $topicID ."
        ORDER BY
            postParentID,
            postID";

$comment = mysql_query($c_sql);

//собираем всё в массив
$tree = array();
while($row = mysql_fetch_array($comment)){
    $tree[] = $row;
}

function treePrint($tree, $pid = 0)
{
    $html = "";
    //собираем все комментарии по заданному $pid, в массиве $row['postParentID']
    foreach ($tree as $k => $row) {
        if($row['postParentID']==$pid){
            $html .= '<li>';
            $html .= $row['postAutor'] . ' :: ';
            $html .= $row['postMessage'];
            //запускаем рекурсию, ищем для каждого дерева $row['postID'] его ветки $row['postParentID']
            $html .= treePrint($tree, $row['postID']);
            $html .= '</li>';
        }
    }
    if($html != "")$html = '<ul>'.$html.'</ul>';
    return $html;
}

echo treePrint($tree);
 
Назад
Сверху