Создать ответ 
Построение дерева иерархии или дерева комментариев
Автор Сообщение
Winston Не на форуме
Старшина
*

Сообщений: 55
У нас с: Jan 2013
Сообщение: #81
RE: Построение дерева иерархии или дерева комментариев
(11.08.2013 16:26:41)Admin писал(а):  На нашем сайте, например, $_POST["ocenka"] содержит 0 для минусов и 1 для плюсов.

Я знаю и при нажатии на хороший комментарий прибавляется 1, а если нажать плохой, то отнимается. А я же хочу сделать, чтоб они всегда увеличивались.

И выводилось, например, 5 хороших, 2 плохих.

Для этого я использую в инпуте значение из бд

PHP код:
<input type="hidden" name="plus" value="'.$comments[plus].'">
<
input type="hidden" name="plus" value="'.$comments[minus].'"

И при нажатии передаю в БД значение с увиличением на 1

И делаю так plus=(plus+1)

Мне ж все равно нужно в POST получить значение из инпута.

Чтоб обновить поле plus на 1. Было 5 хороших комментов а стало 6. Как то вот так.
11.08.2013 17:12:51
Найти все сообщения Цитировать это сообщение
Admin Не на форуме
Верховный
Главнокомандующий
(Administrator)
*

Сообщений: 2,431
У нас с: Aug 2011
Сообщение: #82
RE: Построение дерева иерархии или дерева комментариев
На данный момент на нашем сайте реализовано именно так как Вы описываете.
Мы тоже храним общее количество плюсов и минусов в базе для каждого комментария, просто на экран выводим разницу этих значений.
Если Вы наведете курсор мышки на какую-нибудь оценку комментариев, то Вы увидите примерно следующее: "Плюсов - 4, минусов - 2".

Что я Вам предлагаю, так это

<input type="hidden" name="ocenka" value="1"> - для того чтобы поставить плюс
<input type="hidden" name="ocenka" value="0"> - для того чтобы поставить минус

Далее обрабатываем $_POST["ocenka"].
PHP код:
<?php
if (is_numeric($_POST["comment_id"]) and ($_POST["ocenka"]=='0' or $_POST["ocenka"]=='1')) {
 
$res=mysql_query("SELECT count(id) FROM ocenka_comment WHERE comment_id='".$_POST["comment_id"]."' and ip='".$ip_short."'");
 
$number=mysql_fetch_array($res);
 if (
$number[0]==0) {
  
$res=mysql_query("insert into ocenka_comment (date,comment_id,ip,ocenka) values ('".$time."','".$_POST["comment_id"]."','".$ip_short."','".$_POST["ocenka"]."')");
  if (
$_POST["ocenka"]==0$res=mysql_query("UPDATE comment SET minus=(minus+1) WHERE id='".$_POST["comment_id"]."'");
  else 
$res=mysql_query("UPDATE comment SET plus=(plus+1) WHERE id='".$_POST["comment_id"]."'");
 }
 elseif (
$number["ocenka"]!=$_POST["ocenka"]) {
  
$res=mysql_query("UPDATE ocenka_comment SET date='".$time."',ocenka='".$_POST["ocenka"]."' WHERE comment_id='".$_POST["comment_id"]."' and ip='".$ip_short."'");
  if (
$_POST["ocenka"]==0$res=mysql_query("UPDATE comment SET minus=(minus+1),plus=(plus-1) WHERE id='".$_POST["comment_id"]."'");
  else 
$res=mysql_query("UPDATE comment SET plus=(plus+1), minus=(minus-1) WHERE id='".$_POST["comment_id"]."'");
 }
}
?>

Итого, мы проверяем, что $_POST["comment_id"]) содержит число, а $_POST["ocenka"] ноль или единицу.

Если условие выполнено, следовательно поставлена оценка и мы ищем, ставились ли ранее оценки с данного IP данному комментарию.

Если нет, то увеличиваем значение плюсов или минусов на единицу в зависимости от содержимого $_POST["ocenka"].

Если да, то проверяем, прошлая оценка равна нынешней. Если нет, то обновляем оценку.

Думаю, так гораздо проще.

P.S. Где-нибудь могут быть неточности, т.к. сами перешли на mysqli и используем немного другие переменные, нежели в приведенном коде.
11.08.2013 18:03:35
Найти все сообщения Цитировать это сообщение
Winston Не на форуме
Старшина
*

Сообщений: 55
У нас с: Jan 2013
Сообщение: #83
RE: Построение дерева иерархии или дерева комментариев
Да работает. Но при обновлении страницы, оценки будут меняться.

Если нажать на плюс, то хорошая оценка будет прибавляться, а плохая отниматься. Поэтому я и делал редирект
PHP код:
elseif ($number["0"]!=0){
  
header("Location: $_SESSION[full_url]#last"); 
Лучше конечно без редиректа, а чтоб просто не нажималось на оценку.
Но пока об этом не думал

У себя сейчас сделал так

PHP код:
if (is_numeric($_POST["comment_id"]) and ($_POST["ocenka"]=='0')) {
 
$res=mysql_query("SELECT count(id) FROM ocenka_comment WHERE comment_id='".$_POST["comment_id"]."' and ip='".$ip_short."'");
 
$number=mysql_fetch_array($res);
 if (
$number[0]==0) {
  
$res=mysql_query("insert into ocenka_comment (comment_id,ip) values ('".$_POST["comment_id"]."','".$ip_short."')");
  
$res=mysql_query("UPDATE comment SET minus=(minus+1) WHERE id='".$_POST["comment_id"]."'");
 }
 }
 elseif (
$number["0"]!=0){
 
header("Location: $_SESSION[full_url]#last");


И так же для plus

Чтоб если нажата оценка, то она только прибавляется.

А в таблицу ocenka_comment заношу только comment_id и ip

Таким образом, у меня показывает не общее кол-во оценок.

А хороших 5 плохих 2. Так же как у вас при наведении, только у меня сразу на экран, а общее кол-во я убрал.

Единственно после оценивания, как при вашем варианте так и при моем, пропадают статьи которые выводятся после комментов, по теме данной категории.

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

Цитата:Единственно после оценивания, как при вашем варианте так и при моем, пропадают статьи которые выводятся после комментов, по теме данной категории.

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

С этим разобрался. Проблема была в одинаковых переменных $res

Осталось, сделать постраничный вывод, с вашим разобраться пока так и не получилось, свой прикрутить еще сложней наверное будет.

И отделить html от пхп. И цитирование сделать, и пока хватит.
(Последний раз сообщение было отредактировано 12.08.2013 в 05:41:45, отредактировал пользователь Winston.)
12.08.2013 05:09:12
Найти все сообщения Цитировать это сообщение
Winston Не на форуме
Старшина
*

Сообщений: 55
У нас с: Jan 2013
Сообщение: #84
RE: Построение дерева иерархии или дерева комментариев
Как сделать, чтобы форма ответа была четко под комментарием на который хотят ответить? Какие координаты не задам, ее не видно. То может появится где нужно, а если отвечать на другой коммент она опять куда то уезжает.

Из за этого я и хотел без js а чтоб что то типа такого

PHP код:
//тут комментарий
<button style="margin-top:5px;" type="submit" name="click">Ответить</button>
<? if( 
$_SERVER['REQUEST_METHOD'] == 'POST' ) { if(isset($_POST["click"])){?>
 <div id="hint" style="position:relative; clear:both; margin-top:5px;"> 

Но что-то пока так не получается.
12.08.2013 08:31:53
Найти все сообщения Цитировать это сообщение
Winston Не на форуме
Старшина
*

Сообщений: 55
У нас с: Jan 2013
Сообщение: #85
RE: Построение дерева иерархии или дерева комментариев
Так ну с выводом формы ответов разобрался.
12.08.2013 12:00:57
Найти все сообщения Цитировать это сообщение
Admin Не на форуме
Верховный
Главнокомандующий
(Administrator)
*

Сообщений: 2,431
У нас с: Aug 2011
Сообщение: #86
RE: Построение дерева иерархии или дерева комментариев
У нас форма ответа на комментарий позиционируется и анимируется при помощи jQuery а не на голом JS. Вроде не глючит и работает во всех браузерах.
12.08.2013 20:04:35
Найти все сообщения Цитировать это сообщение
Winston Не на форуме
Старшина
*

Сообщений: 55
У нас с: Jan 2013
Сообщение: #87
RE: Построение дерева иерархии или дерева комментариев
Цитата:Конечно можно. Ведь когда отвечаем на комментарий, не проблема записывать в базу id этого самого комментария. А при выводе ответа на комментарий достаточно лишь добавить всего один SELECT по id, вывод которого оформить в виде цитаты.

Что то не получается цитирование сделать. Какой id нужна записать?

Ведь при ответе записываются значения в parent_id и first_id

Я так понимаю нужно добавить запрос где parent_id=id? или как то по другому?

И где запрос делать после функции или в самой функции parent?
13.08.2013 04:53:15
Найти все сообщения Цитировать это сообщение
Admin Не на форуме
Верховный
Главнокомандующий
(Administrator)
*

Сообщений: 2,431
У нас с: Aug 2011
Сообщение: #88
RE: Построение дерева иерархии или дерева комментариев
parent_id - родительский комментарий.
first_id - самый первый родительский комментарий, с которого начинается ветка.

Когда, например, мы отвечаем на комментарий с номером 37 (id=37), в базе добавится новая запись с id=44, parent_id=37 и first_id=37. Все цифры взяты условно, но parent_id не может быть больше либо равен id, т.к. нельзя ответить на самого себя и на будущий комментарий!

Так вот цитатой как раз будет являться комментарий с id=parent_id=37, после чего идет ответ - комментарий с id=44.

Запрос нужно делать в самой функции parent.
13.08.2013 18:26:03
Найти все сообщения Цитировать это сообщение
Winston Не на форуме
Старшина
*

Сообщений: 55
У нас с: Jan 2013
Сообщение: #89
RE: Построение дерева иерархии или дерева комментариев
Цитата:Когда, например, мы отвечаем на комментарий с номером 37 (id=37), в базе добавится новая запись с id=44, parent_id=37 и first_id=37.

Да так оно и получается. Но почему-то ничего не выводится.

Я делаю такой вот запрос

PHP код:
function parents($parent=0) {

 global 
$tags;
 
 for (
$i=0;$i<=count($tags[$parent])-1;$i++) {
       
if (
$tags[$parent][$i][2]=='Admin'$tags[$parent][$i][2]='<font color="#c00">Admin</font>';
if (
$tags[$parent][$i][6]==0$tags[$parent][$i][6]=$tags[$parent][$i][0];
$result mysql_query("SELECT * FROM comment WHERE `theme`='".$_SESSION[full_url]."' and `moderation`='1' and` id`='parent_id' ORDER BY id DESC"$db);
$comments=mysql_fetch_array($result); 

И над комментом вывожу цитату

PHP код:
<div class="quote">
<?=
wordwrap(nl2br($comments['message']), 70"\n"1);?> </div>
<?=wordwrap(nl2br($tags[$parent][$i][1]), 70"\n"1);?>

Но цитату не выводит. Переменные менял и очищал, не помогло. Делал просто запрос

PHP код:
"SELECT * FROM comment "$db 

Все равно ничего не выводится. Если пропускать этот запрос через цикл, тоже результата нет.
14.08.2013 03:12:34
Найти все сообщения Цитировать это сообщение
Admin Не на форуме
Верховный
Главнокомандующий
(Administrator)
*

Сообщений: 2,431
У нас с: Aug 2011
Сообщение: #90
RE: Построение дерева иерархии или дерева комментариев
У меня все работает.

Собственно сам запрос к базе:

PHP код:
$result mysql_query("SELECT message FROM comment WHERE id='".$parent."'"$db);
$comments=mysql_fetch_array($result); 

Как Вы могли заметить, мы ищем только по одному условию - id=$parent, т.к. у одного комментария не может быть больше одного родительского, поэтому остальные условия для выборки можно опустить.

И вывод непосредственно перед самим комментарием полученной цитаты:
PHP код:
echo wordwrap(nl2br($comments['message']), 70"\n"1); 


Для того чтобы не выдавало ошибку, в самом начале функции parents() замените строчку:
PHP код:
global $tags

на такую:
PHP код:
global $tags,$db
14.08.2013 18:58:16
Найти все сообщения Цитировать это сообщение
Создать ответ 


Переход:


Пользователи просматривают эту тему: 1 Гость(ей)


LiveInternet
© Copyright 2011-2024 by UsefulScript.ru