PHP рейтинг

Совсем недавно меня попросили подыскать какой-нибудь скрипт рейтинга с двумя кнопками + или -, thumb up/thumb down (две руки). Думая, что задача совсем уж простая я стал искать похожие скрипты в поисковиках. Среди требований к скрипту было защита по IP и легкая интеграция.
Среди решений в сети мне попадались либо слишком простые, даже без примера и защиты по IP, либо совсем сложные и навороченные. Но, хороший и удовлетворяющий всем требованиям скрипт, найти так и не удалось. Интернет наполнен кучей решений для звездного рейтинга (звездочки), но вот с двумя кнопками - увы. Да, есть потрясающее решение для WordPress, но переделывать мне его вовсе не хотелось. В итоге я нашел действительно хорошее и доброе решение рейтинга, но оно оказалось платным. Потратив 2-3 часа на поиски (Это действительно было так долго. Поисковики находят вроде бы хорошие решения судя по заголовкам, но открыв сайты понимаешь что тебя обманули.).
Так вот, потратив 2-3 часа на поиски решения я забил и решил написать свой рейтинг. За одно и помогу остальным, ведь не только мне может пригодиться такой вид рейтинга.
Времени было мало, поэтому я насобирал кучу разных скриптов рейтингов. Расковырял их, разложил на кусочки, а потом стал собирать.
Я четко был уверен:
- На выходе должен получится простой и легковесный рейтинг
- Защита по IP
- Легкая интеграция (вызвал функцию, влепил ID поста и все)
- Буду использовать jQuery. Проще и надежнее
- Легкая смена картинок от плюсиков до пальцев вверх и т.д.
После некоторого времени рейтинг был готов, получилось 8 файлов:
- base.php - коннект к базе и данные для него
- index.php - все собранное воедино как пример подключения (демка)
- rateaction.php - обработчик событий рейтинга
- rating.php - вывод самого рейтинга на страницу
- jquery.js - фреймворк jQuery
- script.js - наш скрипт с функциями для работы с рейтингом
- style.css - стили оформления
- thumb.php - картинки
Приведу листинг файла index.php (ниже можно и демку посмотреть и скрипт скачать в архиве):
<html>
<head>
<title>Рейтинг</title>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="script.js"></script>
<link rel="stylesheet" type="text/css" href='style.css'>
</head>
<body>
<?php
include "rating.php";
?>
<h1>Пост первый</h2>
<p>Содержание первого поста</p>
<?php callrating("1"); ?>
<h1>Пост второй</h2>
<p>Содержание второго поста</p>
<?php callrating("2", "thumb"); ?>
<h1>Пост третий</h2>
<p>Содержание третьего поста</p>
<?php callrating("3", "thumb", ' это нравится'); ?>
</body>
</html>
У функции callrating три параметра. Первый параметр, обязательный - id вашего поста или статьи, он уникальный должен быть для каждого материала. Второй параметр - класс картинок в CSS (по умолчанию он плюс/минус). Третий параметр для рейтинга, где можно ставить только + или "мне нравится", просто напишите текст или вставьте пробел - минус не отобразится.
Теперь приведу листинг файла rateaction.php, который обрабатывает данные поступающие к нему после нажатия на кнопки голосования:
<?php
include "base.php";
$id = (int)$_POST['idpost'];
$action = $_POST['action'];
$ip = mysql_escape_string($_SERVER['REMOTE_ADDR']);
$result = mysql_query("SELECT ip, id_post FROM rating_post_ip WHERE id_post = '".$id."' AND ip = '".$ip."'");
$count = mysql_num_rows($result);
if ($count == 0) {
$result = mysql_query("SELECT id_post, up, down FROM rating_post WHERE id_post = '".$id."'");
$row = mysql_fetch_array($result);
$nowPlus = $row['up']; $nowMinus = $row['down'];
if ($row['id_post']=='') {
mysql_query("INSERT INTO `rating_post` VALUES ( '".$id."', '0', '0');");
$nowPlus = 0; $nowMinus = 0;
}
if ($action == 'plus') {
$nowPlus = $nowPlus + 1;
$upR = mysql_query("UPDATE rating_post SET up = up+1 WHERE id_post = '".$id."'");
} else {
$nowMinus = $nowMinus + 1;
$upR = mysql_query("UPDATE rating_post SET down = down+1 WHERE id_post = '".$id."'");
}
mysql_query("INSERT INTO `rating_post_ip` VALUES ( '".$ip."', '".$id."' );");
echo ($nowPlus-$nowMinus);
} else {
echo 'Повторное голосование!';
}
?>
Собственно код совсем прост.
Картинка выглядит вот так, это CSS спрайт:
![]()
CSS код выглядит следующим образом:
body {
font: 13px/1.5 Helvetica Neue,Arial,Helvetica,'Liberation Sans',FreeSans,sans-serif;
padding: 50px;
}
.rating {
clear: both;
height: 16px;
}
.rating a, .rating div{
float: left;
}
.rating .plus, .rating .minus {
background: url("thumb.png") no-repeat 0 0 scroll transparent;
width: 16px;
height: 16px;
display: block;
margin: 0 5px 0 0;
}
.rating .minus {
background-position: -16px 0;
margin: 0 0 0 5px;
}
.thumb .plus {
background-position: 0 -16px;
}
.thumb .minus {
background-position: -16px -16px;
}
В архиве кстати есть файл dump.sql - это дамп базы mysql. И не забудьте в файле base.php прописать свои данные соединения с базой. В общем пользуйтесь сколько угодно, используйте где угодно и меняйте как угодно, надеюсь пригодится.

(33 votes, average: 4,45 из 5)
34 Комментариев на «PHP рейтинг»
О! То что нужно, спасибо за проделанную работу!
Well-loved. Like or Dislike:
40
10
Ответить
Огромное спасибо!
Пригодилось!
Well-loved. Like or Dislike:
20
7
Ответить
Спасибо Большое!
Well-loved. Like or Dislike:
26
7
Ответить
Спасибо за скрипт! Немного переделал его для учета комментов. А можно ли для проверки что-нибудь еще использовать кроме IP? Куки как-то не очень хочется использовать…
Well-loved. Like or Dislike:
7
3
Ответить
makecode Ответил:
Сентябрь 29th, 2011 at 16:27
Что угодно, все ограничено вашей фантазией. Например, можно использовать user_agent.
Ответить
makecode Ответил:
Сентябрь 29th, 2011 at 16:29
По факту можете брать кучу параметров и брать от них хэш.
md5(ip+user_agent+salt)
Как вариант.
Ответить
Ответил:
Сентябрь 29th, 2011 at 18:49
Кстати, да, отличный вариант, спасибо! :-)
Ответить
Если бы еще контент по рейтингу становился было бы вообще класс!
Well-loved. Like or Dislike:
7
0
Ответить
makecode Ответил:
Ноябрь 7th, 2011 at 19:52
Всмысле?
Ответить
Сергей Ответил:
Ноябрь 7th, 2011 at 21:21
чем больше плюсов тем выше позиция ! например
пост первый 0голосов
пост второй 0голосов
пост третий 0голосов
а когда проголосуют то что бы становилось
пост второй 3голоса
пост первый 2голоса
пост третий 0голосов
Ответить
makecode Ответил:
Ноябрь 7th, 2011 at 21:24
Так это надо делать на уровне вывода постов, т.е. когда
SELECT … ORDER BY rating DESC
Ответить
можете подсказать как конкретно это сделать или ссылку , а то я уже целый день мучаюсь и нет успеха?
Ответить
makecode Ответил:
Ноябрь 7th, 2011 at 22:04
В таблице рейтинга хранятся голоса «+» и «-», а также id поста. Т.е. уже можно вывести id постов по рейтингу.
Базы под рукой нет, но вроде можно так
SELECT id, SUM(up-down) AS rating FROM rating_post ORDER BY rating DESC
Т.е. получим список id постов по рейтингу.
Через джойн можно объеденить запросы и вывести сами посты.
Типа так
SELECT post.id, title, content,
SUM(rating_post.up-rating_post.down) AS rating FROM post LEFT JOIN rating_post ON rating_post.id = post.id ORDER BY rating DESC
Но все зависит конкретно от вашего движка и таблицы где хранятся посты.
Ответить
Сергей Ответил:
Ноябрь 7th, 2011 at 22:21
я ничего не менял все с этого сайта таблицы и т.д. так это в базе прописать ? а что прописать в index.php ? извините за такие вопросы просто я еще учусь не много опита!
Ответить
makecode Ответил:
Ноябрь 8th, 2011 at 11:34
У Вас самописная CMS?
Ответить
Сергей Ответил:
Ноябрь 8th, 2011 at 12:54
я хочу сделать на простом php без CSM! если будет работать то тогда я уже перенесу!
Ответить
makecode Ответил:
Ноябрь 8th, 2011 at 13:27
Так у Вас посты то должны хранится где-то, приведите запрос выводящий посты. Если и базы нет и постов, то пока ничего не поделаешь. Взаимодействие то все равно должно быть.
Ответить
Пост первый
Содержание первого поста
Пост второй
Содержание первого поста
так что нужно создать таблицы title и content а тогда вывод?
Ответить
makecode Ответил:
Ноябрь 8th, 2011 at 15:04
Вам нужно сначала разобраться в основах.
Таблица одна, title и content это столбцы.
Ответить
просто не правильно выразился да столбцы!
Ответить
$query = «SELECT id_post, title, textfull FROM $table ORDER BY up»;
$res = mysql_query($query) or die(mysql_error());
while ($row = mysql_fetch_array($res)) {
echo «».$row['id_post'].»".$row['title'].»\n»;
echo «».$row['textfull'].»\n»;
вот получилось!
Ответить
Помогите, как установить? Что прописать в base.php? В БД нужно добавлять какие-то таблицы?
Ответить
Дамп загрузил, появилось 2 таблицы, но на странице с рейтингом Fatal error: Call to undefined function vhost_682_tests() in /var/www/vhost-682/data/www/**********.ru/rating/base.php on line 5
Ответить
makecode Ответил:
Декабрь 13th, 2011 at 15:32
Пропишите в файле base.php данные от своей базы данных.
Ответить
.rating a, .rating div{
float: left;
}
<div class="rating «>
<a class="rate plus" id="pid_» href=»#»>
<div id="rateresult-»>
<a class="rate minus" id="pid_» href=»#»>
Справа, слева экрана встраивается портя верстку, но никак не в нужном месте.
Ответить
Как мне данный скрипт вcтроить в CMS Joomla?
Ответить
Нет смысла отдельно считать + и -
Куда объективнее высчитывать общее среднее значение
Ответить
makecode Ответил:
Февраль 15th, 2012 at 21:40
Раскройте пожалуйста Вашу мысль, всмсыле высчитывать среднее значение? Делить, а не вычитать?
Ответить
А как сделать что б вместо ид поста был адрес страницы которой вызывается скрипт то есть адрес новости?
Хочу сделать для новостей рейтинг
Ответить
makecode Ответил:
Март 21st, 2012 at 16:25
Вместо id храните url, но зачем такие ухищрения когда можно просто и быстро передать id новости.
Ответить
Сергей Ответил:
Март 21st, 2012 at 18:20
А как просто и быстро передать ид новости?
Пример адреса новости: — aid ид новости
Ответить
makecode Ответил:
Март 21st, 2012 at 21:43
$id = (int)$_GET['aid'];
Ответить
Сергей Ответил:
Март 22nd, 2012 at 09:10
Вставлять в php файлы вместо других строк? Тогда что писать в ид когда вызываешь рейтинг?
Ответить
Сергей Ответил:
Март 22nd, 2012 at 13:51
Я добавил $id = (int)$_GET['aid']; вместо rateaction.php $id = (int)$_POST['idpost']; а ид при вызове оставил пустым не помогло
Ответить