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

Тема в разделе "PHP", создана пользователем KODEAK, 27 июл 2011.

Модераторы: latteo
  1. KODEAK

    KODEAK

    Регистр.:
    11 апр 2009
    Сообщения:
    160
    Симпатии:
    15
    Собственно делаю небольшую форму комментариев, накопал в функцию древовидного отображения, но почему то сервер падает при открытии страницы, помогите пожалуйста найти ошибку
    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);
     
  2. DrakonHaSh

    DrakonHaSh

    Регистр.:
    29 июн 2010
    Сообщения:
    358
    Симпатии:
    122
    что значит сервер падает ?
    апач падает ? вся система падает ? или просто ошибку выплевывает ?
    а вообще-то дебаггер вам в руки.
     
  3. KODEAK

    KODEAK

    Регистр.:
    11 апр 2009
    Сообщения:
    160
    Симпатии:
    15
    ну как бы долю секунды выводит большое число нулей, а затем станица перестает работать, сервер не отвечает
     
  4. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    363
    Симпатии:
    117
    большое число нулей - это как?

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

    DrakonHaSh

    Регистр.:
    29 июн 2010
    Сообщения:
    358
    Симпатии:
    122
    бесконечная рекурсия :)

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

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

    а то, что нули выводит это что-то странное - единственный вывод это:
    echo $row['postAutor'] . ' :: ';
    echo $row['postMessage'];
    ни то, ни другое нулем быть, по контексту, не должно.
    так что смотрите что там у вас в $tree попадает - там бага.
     
  6. dino

    dino

    Регистр.:
    28 май 2009
    Сообщения:
    550
    Симпатии:
    204
    если вместо обработки обращения к базе установить например
    PHP:
    $data=array(1234);
    то результатом работы скрипта будет:
    и сервак при этом не "ложится" так что советую покопаться именно в обращении к БД...
     
  7. satyra

    satyra Постоялец

    Регистр.:
    21 окт 2007
    Сообщения:
    73
    Симпатии:
    7
    мне кажется проблема где то в этом месте

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

    идёт походу зацикливание
     
  8. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    Ошибки в комментариях
    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);
     
    KODEAK нравится это.