Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> рейтинг новостей 
:(
    Опции темы
bagos
Дата 5.1.2011, 03:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 275
Регистрация: 17.6.2006

Репутация: нет
Всего: 1



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

Выглядеть должно так, под каждой новостью две картинки, стрелка вверх и вниз.
Первое что пришло в голову это создать еще одну таблицу: id-новости, rating
загружать для каждой новости значения из поля rating, при нажатии на стрелку вверх посылать запрос в базу update... rating=rating+1
для понижения рейтинга соответственно -1. Записей в таблице будет ровно столько сколько и в таблице новостей, т.е. по идее можно и не создавать новую таблицу, а добавить поле rating в таблицу с новостями и обновлять уже там.
Какие будут комментарии по этой идее?

Дальше встает вопрос, как запретить пользователю голосовать больше одного раза, использование БД в этом случае сильно увеличит кол-во записей.
Также, интересует возможность в реальном времени видеть как изменился рейтинг, т.е. нажал на повышение рейтинга и сразу без перегрузки страницы видно что рейтинг повысился.
Может кто сталкивался с данной задачей, прошу ваших комментариев, уважаемые формучане!


PM MAIL   Вверх
bagos
Дата 5.1.2011, 04:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 275
Регистрация: 17.6.2006

Репутация: нет
Всего: 1



или может сделать две таблицы:
1:
[tb_rating]
id
id_news - id новости
rating - сам рейтинг

2:
[tb_ip]
id
rid - id записи рейтинга
ip - с которого голосовали
how - как проголосовали
PM MAIL   Вверх
ayax2005
Дата 5.1.2011, 04:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


echo $smile
**


Профиль
Группа: Участник
Сообщений: 516
Регистрация: 17.4.2008
Где: Питер

Репутация: 2
Всего: 11



А какова цель создания новой таблицы со связью 1:1? Просто добавьте поле в таблицу новостей.

Цитата(bagos @  5.1.2011,  03:42 Найти цитируемый пост)
также, интересует возможность в реальном времени видеть как изменился рейтинг, т.е. нажал на повышение рейтинга и сразу без перегрузки страницы видно что рейтинг повысился.

курите Ajax. Если вы подразумеваете отслеживать ещё и голосования других пользователей без перезагрузки - придётся добавить и setTimeOut.

Что бы реально запретить многократное голосование придётся хранить ip пользователя в БД.


--------------------
все вопросы - из-за неверной формулировки задачи
PM MAIL ICQ   Вверх
bagos
Дата 5.1.2011, 05:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 275
Регистрация: 17.6.2006

Репутация: нет
Всего: 1



Спасибо за ответ, все таки если пока опустить все эти ajax,javascript, то хотелось бы найти оптимальное решение для системы рейтинга новостей, чтобы и по скорости быстро было и грамотно с точки зрения нагрузки бд и т.п.
PM MAIL   Вверх
bagos
Дата 5.1.2011, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 275
Регистрация: 17.6.2006

Репутация: нет
Всего: 1



на данном этапе сделал следующее:
таблица rating:
id
nid - номер новости
rank - рейтинг новости

вытаскиваю рейтинг нужной мне новости
$result_rank = mysql_query("select rank from rating where nid='$id'");
$row_rank = mysql_fetch_array($result_rank);

на странице показываю

Код

printf("<div><span id='rank_place'>Рейтинг: %s </span><a href='#' onclick=\"set_rank('%s','-1');\">[+] </a><a href='#'
 onclick=\"set_rank('%s','0')\">[-]</a></div>",$row_rank["rank"],$id,$id);



Код скрипта:
Код

<script>
function getXmlHttp(){
  var xmlhttp;
  try {
    xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  } catch (e) {
    try {
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    } catch (E) {
      xmlhttp = false;
    }
  }
  if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
    xmlhttp = new XMLHttpRequest();
  }
  return xmlhttp;
}

function set_rank($nid, $up) {
    var req = getXmlHttp()        
    var statusElem = document.getElementById('vote_status') 
    req.open('GET', 'blog_rank_func.php?nid='+$nid+'&up='+$up, true);  
    req.send(null); 
  
  
req.onreadystatechange = function() {  
        if (req.readyState == 4) { 

            if(req.status == 200) { 
                statusElem.innerHTML = 'Рейтинг: '+req.responseText+' ';
            }
            }
    }  
}

</script>



Код пхп файла:

Код

<?php
include_once("cfg/db.php"); 
if (isset($_GET['nid'])) {$nid = $_GET['nid'];}
if (isset($_GET['up'])) {$rank = $_GET['up'];}

$result_get_rank = mysql_query("select rank from rating where nid='$nid'");
$myrow_get_rank = mysql_fetch_array($result_get_rank);

if ($myrow_get_rank) {
$rank_now = $myrow_get_rank["rank"];

if ($rank == "-1") {$rank_now += 1;}
if ($rank == "0") {$rank_now -= 1;}
if ($rank = "0" or $rank = "-1") {
$result_set_rank = mysql_query ("UPDATE `rating` SET `rank` = '$rank_now' WHERE `nid` = '$nid'");
echo "$rank_now";
}
}
?>



Код работает. Опыт с пхп у меня нулевый, поэтому жду вашей критики, какие  проверки можно сделать, где что и как упростить или переделать на корню. 
Заранее спасибо, ушел читать книжки по пхп smile


Это сообщение отредактировал(а) bagos - 5.1.2011, 07:53
PM MAIL   Вверх
azesmcar
Дата 5.1.2011, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 12
Всего: 211



Цитата(bagos @  5.1.2011,  07:50 Найти цитируемый пост)
какие  проверки можно сделать

Для начала хотя бы защититься от SQL injection-а.

Цитата(bagos @  5.1.2011,  07:50 Найти цитируемый пост)
$result_get_rank = mysql_query("select rank from rating where nid='$nid'");

если вместо GET параметра nid пользователь передаст скажем что-то вот такое
Цитата

0'; drop table rating; select 'a

то твой запрос станет вот таким
Цитата

select rank from rating where nid='0'; drop table rating; select 'a'

угадай что будет smile 
PM   Вверх
bagos
Дата 5.1.2011, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 275
Регистрация: 17.6.2006

Репутация: нет
Всего: 1



Воо, благодарю, щас поправим smile

Добавлено @ 09:30
хм, может мало пробовал, но пока sql inj не срабатывают...


этого будет достаточно? $nid = intval($nid);

Это сообщение отредактировал(а) bagos - 5.1.2011, 10:56
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0447 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.