За последние 24 часа нас посетили 201784 программиста и 2096 роботов. Сейчас ищут 1670 программистов ...

помогите с идентификацией комментариев по статьям

Тема в разделе "PHP для новичков", создана пользователем Guliver, 26 июн 2013.

  1. Guliver

    Guliver Новичок

    С нами с:
    26 июн 2013
    Сообщения:
    72
    Симпатии:
    0
    У меня есть таблица с коментариями. Клиент заходит на страницу пишет комент , он сохраняется в базе данных. Проблема в том что все коменты независиом от того где были оставлены(написаны) неидентифицируются, а полностью выводятся на любой странице. Т.е. коменты на всех страницах одинаковые.
    Пытаюсь создать идентивикацию по страницам. Для этого в таблице MySQL создал дополнительное поле docid, В поле `docid` записывается идентификатор страницы(статьи), про которую написали данный комментарий. И когда составляется вывод всех комментариев на страницу статьи, делается проверка, если docid равно идентификатору этой страницы, то тогда этот комментарий записывается в массив $data, иначе пропускается. Такова основная идея.
    Проблема в том, что ничего с выводом идентифицированных коментариев не получается. Полностью они выводятся пожалуйста, как здесь http://armandbosu.ru/akcent-136.php# Код в этом случае простой и понятно не позволит идентифицировать коментарии. Код вывода коментариев на этой странице: <?php echo $comments; ?>

    На другой странице http://armandbosu.ru/akcent-106.php# я пытаюсь уже вывести коментарии по значению docid
    Код <?php
    require_once 'db.php';
    $docid = 'идентификатор страницы' ;

    $sql="select id from comments where (comments.name='$docid')";


    $query = mysql_query($sql);
    while($row = mysql_fetch_assoc($query))
    { $i=1;
    $name[$i] = $row;
    $i++;
    }
    foreach($name as $id) {
    echo $comments[$id];
    }
    ?>

    НИЧЕГО НЕ ВЫВОДИТСЯ

    Далее приведу скрипт, который отвечает за обработку коментариев

    <?php



    require_once 'db.php';

    $sql = "
    SELECT docid, id, parent_id, name, comment,
    DATE_FORMAT(date_add, '%d %M %Y %H:%i') as date_add
    FROM comments
    ";


    $query = mysql_query($sql);
    if (!$query) {
    die('Invalid query: ' . mysql_error());
    }


    while($row = mysql_fetch_assoc($query))
    {
    $data[$row[id]] = $row;
    }


    if($data) {
    /*Функция для создания дерева комментариев */

    function mapTree($dataset) {
    $tree = array(); // Создаем новый массив
    /*
    Проходим в цикле по массиву $dataset, который был передан в качестве аргумента.
    в $id будет попадать уникальный id комментария,
    &$node - обратите внимание, работаем со значением по ссылке!
    */
    foreach ($dataset as $id=>&$node) {
    if (!$node['parent_id']) { // не имеет родителя, т.е. корневой элемент
    $tree[$id] = &$node;
    } else {
    /*
    Иначе это чей-то потомок
    этого потомка переносим в родительский элемент,
    при этом у родителя внутри элемента создастся массив childs, в котором и будут вложены его потомки
    */
    $dataset[$node['parent_id']]['childs'][$id] = &$node; //

    }
    }

    return $tree;
    }



    function commentsToTemplate($comment)
    {
    /* $comment - массив комментария - имя, дата, коммент, потомки (если есть) */

    /* Включаем буферизацию вывода, чтобы шаблон не вывелся в месте вызова функции.
    */
    ob_start();

    // Подключаем шаблон comment_template.php, который просто таки ждет наш массив $comment ))
    include 'comment_template.php';

    $comments_string = ob_get_contents(); // Получаем содержимое буфера в виде строки
    ob_end_clean(); // очищаем буфер

    return $comments_string;
    // Можно применить более короткую запись - return ob_get_clean(); вместо $comments_string = ob_get_contents(); ob_end_clean(); return $comments_string;
    }
    function commentsString($data)
    {
    foreach($data as $w)
    { $string .= commentsToTemplate($w); }

    return $string;
    }


    $data = mapTree($data);
    $comments = commentsString($data);
    $data = null;
    }
    $sql = "SELECT * FROM comments";
    $res = mysql_query($sql);
    $rows = mysql_num_rows($res);

    ?>


    и мою таблицу из базы данных:


    --
    -- Структура таблицы `comments`
    --

    CREATE TABLE `comments` (
    `id` int(5) NOT NULL AUTO_INCREMENT,
    `parent_id` int(5) NOT NULL,
    `docid` int(5) NOT NULL,
    `comment` text NOT NULL,
    `name` varchar(10) NOT NULL,
    `date_add` datetime NOT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ;

    --
    -- Дамп данных таблицы `comments`
    --

    INSERT INTO `comments` (`id`, `parent_id`, `docid`, `comment`, `name`, `date_add`) VALUES
    (1, 0, 0, 'ghhhhh', 'ggg', '2013-06-26 10:41:32'),
    (2, 0, 1, 'h ymm', 'hhhh', '2013-06-26 10:43:59'),
    (3, 0, 10, 'рпапп', 'пппп', '2013-06-26 11:41:20'),
    (4, 0, 10, 'gghjgjg', 'ggg', '2013-06-26 11:42:44'),
    (5, 0, 0, 'y6yyy', 'uuuuuuuu', '2013-06-26 11:43:24'),
    (6, 0, 0, 'kk', 'kkk', '2013-06-26 11:46:51'),
    (7, 0, 1, 'еееееее', 'еееееееее', '2013-06-26 12:09:50'),
    (8, 7, 1, 'нннннннннннннннннннннннн', 'ннннннннн', '2013-06-26 12:10:06');


    помогите пожалуйста решить проблему. Сразу скажу, что по функциям разбивать не хочу, так как не хочу переписывать половину кода.
     
  2. etalcom

    etalcom Активный пользователь

    С нами с:
    14 мар 2012
    Сообщения:
    86
    Симпатии:
    0
    Адрес:
    Вологда
    Для начала нужно понять что Вы хотите вывести из базы.
    Отладить запрос!Например где нить в phpMyAdmin увидеть что запрос в прямом виде даст Вам нужный ответ!
    Потом пытаться его вывести!
    Может быть в запросе дело для начала?
    И самое простое это print_r($name);
     
  3. Guliver

    Guliver Новичок

    С нами с:
    26 июн 2013
    Сообщения:
    72
    Симпатии:
    0
    Может и в запросе. Я только что изучаю php. Сейчас запрос имеет такой вид $sql = "
    SELECT docid, id, parent_id, name, comment,
    DATE_FORMAT(date_add, '%d %M %Y %H:%i') as date_add
    FROM comments
    ";

    Добавлено спустя 1 минуту 32 секунды:
    Я хочу вывести из базы именно те коментарии, которые были оставлены с этой страницы, а не всю таблицу как это есть сейчас.
     
  4. etalcom

    etalcom Активный пользователь

    С нами с:
    14 мар 2012
    Сообщения:
    86
    Симпатии:
    0
    Адрес:
    Вологда
    Вы выполните этот запрос на прямую. Он выведет Вам то что нужно или нет?
     
  5. Guliver

    Guliver Новичок

    С нами с:
    26 июн 2013
    Сообщения:
    72
    Симпатии:
    0
    Вообще по функциям не хочу выводить. Хотя так тоже пробовал, ничего не выводит кроме id.
     
  6. etalcom

    etalcom Активный пользователь

    С нами с:
    14 мар 2012
    Сообщения:
    86
    Симпатии:
    0
    Адрес:
    Вологда
    Вы наверное не поняли. Зайдите в phpMyAdmin найдите свою базу нужную таблицу и нажмите выполнить SQL запос
    Там пропишите свой запрос
    Код (Text):
    1.  
    2. SELECT docid, id, parent_id, name, comment,
    3. DATE_FORMAT(date_add, '%d %M %Y %H:%i') as date_add
    4. FROM comments
    5. ";
    И посмотрите что Вам он выдаст.
     
  7. Guliver

    Guliver Новичок

    С нами с:
    26 июн 2013
    Сообщения:
    72
    Симпатии:
    0
    Вероятно, SQL-запрос содержит ошибку. При наличии таковой, ниже будет выведена ошибка MySQL-сервера, облегчающая диагностику проблемы.
    ERROR: Незакрытая кавычка @ 111
    STR: "
    SQL: SELECT docid, id, parent_id, name, comment,
    DATE_FORMAT(date_add, '%d %M %Y %H:%i') as date_add
    FROM comments
    ";


    SQL-запрос:

    SELECT docid, id, parent_id, name, comment, DATE_FORMAT(date_add, '%d %M %Y %H:%i') as date_add FROM comments ";

    Ответ MySQL:
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '&quot;' at line 4

    Добавлено спустя 5 минут 6 секунд:
    Ошибка

    SQL-запрос:

    SELECT docid, id, parent_id, name,
    COMMENT ,
    FROM `comments`
    LIMIT 0 , 50

    Ответ MySQL:
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM `comments`
    LIMIT 0, 50' at line 1
     
  8. Doglexx

    Doglexx Активный пользователь

    С нами с:
    20 май 2008
    Сообщения:
    25
    Симпатии:
    0
    В первом запросе лишняя двойная кавычка скопировалась вконце.
    Во втором - уберите запятую перед FROM `comments`
     
  9. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.823
    Симпатии:
    1.333
    Адрес:
    Лень
    как понять можно?
     
  10. Guliver

    Guliver Новичок

    С нами с:
    26 июн 2013
    Сообщения:
    72
    Симпатии:
    0
    Спасибоогромное всем за помощь. Решение оказалось куда проще. Тема закрыта.