У меня есть таблица с коментариями. Клиент заходит на страницу пишет комент , он сохраняется в базе данных. Проблема в том что все коменты независиом от того где были оставлены(написаны) неидентифицируются, а полностью выводятся на любой странице. Т.е. коменты на всех страницах одинаковые. Пытаюсь создать идентивикацию по страницам. Для этого в таблице 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'); помогите пожалуйста решить проблему. Сразу скажу, что по функциям разбивать не хочу, так как не хочу переписывать половину кода.
Для начала нужно понять что Вы хотите вывести из базы. Отладить запрос!Например где нить в phpMyAdmin увидеть что запрос в прямом виде даст Вам нужный ответ! Потом пытаться его вывести! Может быть в запросе дело для начала? И самое простое это print_r($name);
Может и в запросе. Я только что изучаю 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 секунды: Я хочу вывести из базы именно те коментарии, которые были оставлены с этой страницы, а не всю таблицу как это есть сейчас.
Вы наверное не поняли. Зайдите в phpMyAdmin найдите свою базу нужную таблицу и нажмите выполнить SQL запос Там пропишите свой запрос Код (Text): SELECT docid, id, parent_id, name, comment, DATE_FORMAT(date_add, '%d %M %Y %H:%i') as date_add FROM comments "; И посмотрите что Вам он выдаст.
Вероятно, 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 '"' 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
В первом запросе лишняя двойная кавычка скопировалась вконце. Во втором - уберите запятую перед FROM `comments`