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 прописать свои данные соединения с базой. В общем пользуйтесь сколько угодно, используйте где угодно и меняйте как угодно, надеюсь пригодится.

Демо-версия | Скачать

Понравился пост? Подпишитесь на RSS ленту или Twitter.
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (33 votes, average: 4,45 из 5)
Loading ... Loading ...

Возможно Вам, будет интересно

34 Комментариев на «PHP рейтинг»

  • Santa
    13 Июль, 2011, 9:33

    О! То что нужно, спасибо за проделанную работу!

    Well-loved. Like or Dislike: Thumb up 40 Thumb down 10

    Ответить

  • Егор!
    13 Июль, 2011, 23:21

    Огромное спасибо!
    Пригодилось!

    Well-loved. Like or Dislike: Thumb up 20 Thumb down 7

    Ответить

  • 9 Август, 2011, 23:02

    Спасибо Большое!

    Well-loved. Like or Dislike: Thumb up 26 Thumb down 7

    Ответить

  • 29 Сентябрь, 2011, 12:08

    Спасибо за скрипт! Немного переделал его для учета комментов. А можно ли для проверки что-нибудь еще использовать кроме IP? Куки как-то не очень хочется использовать…

    Well-loved. Like or Dislike: Thumb up 7 Thumb down 3

    Ответить

    makecode Ответил:

    Что угодно, все ограничено вашей фантазией. Например, можно использовать user_agent.

    Thumb up 3 Thumb down 3

    Ответить

    makecode Ответил:

    По факту можете брать кучу параметров и брать от них хэш.

    md5(ip+user_agent+salt)

    Как вариант.

    Thumb up 3 Thumb down 1

    Ответить

    Pashij Ответил:

    Кстати, да, отличный вариант, спасибо! :-)

    Thumb up 2 Thumb down 3

    Ответить

  • Сергей
    7 Ноябрь, 2011, 19:28

    Если бы еще контент по рейтингу становился было бы вообще класс!

    Well-loved. Like or Dislike: Thumb up 7 Thumb down 0

    Ответить

    makecode Ответил:

    Всмысле?

    Thumb up 1 Thumb down 0

    Ответить

    Сергей Ответил:

    чем больше плюсов тем выше позиция ! например
    пост первый 0голосов
    пост второй 0голосов
    пост третий 0голосов

    а когда проголосуют то что бы становилось
    пост второй 3голоса
    пост первый 2голоса
    пост третий 0голосов

    Thumb up 0 Thumb down 1

    Ответить

    makecode Ответил:

    Так это надо делать на уровне вывода постов, т.е. когда
    SELECT … ORDER BY rating DESC

    Thumb up 1 Thumb down 1

    Ответить

  • Сергей
    7 Ноябрь, 2011, 21:56

    можете подсказать как конкретно это сделать или ссылку , а то я уже целый день мучаюсь и нет успеха?

    Thumb up 1 Thumb down 0

    Ответить

    makecode Ответил:

    В таблице рейтинга хранятся голоса «+» и «-», а также 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

    Но все зависит конкретно от вашего движка и таблицы где хранятся посты.

    Thumb up 0 Thumb down 0

    Ответить

    Сергей Ответил:

    я ничего не менял все с этого сайта таблицы и т.д. так это в базе прописать ? а что прописать в index.php ? извините за такие вопросы просто я еще учусь не много опита!

    Thumb up 0 Thumb down 0

    Ответить

    makecode Ответил:

    У Вас самописная CMS?

    Thumb up 0 Thumb down 0

    Ответить

    Сергей Ответил:

    я хочу сделать на простом php без CSM! если будет работать то тогда я уже перенесу!

    Thumb up 0 Thumb down 0

    Ответить

    makecode Ответил:

    Так у Вас посты то должны хранится где-то, приведите запрос выводящий посты. Если и базы нет и постов, то пока ничего не поделаешь. Взаимодействие то все равно должно быть.

    Thumb up 0 Thumb down 0

    Ответить

  • Сергей
    8 Ноябрь, 2011, 14:18

    Пост первый
    Содержание первого поста

    Пост второй
    Содержание первого поста

    так что нужно создать таблицы title и content а тогда вывод?

    Thumb up 1 Thumb down 0

    Ответить

    makecode Ответил:

    Вам нужно сначала разобраться в основах.
    Таблица одна, title и content это столбцы.

    Thumb up 1 Thumb down 0

    Ответить

  • Сергей
    8 Ноябрь, 2011, 15:07

    просто не правильно выразился да столбцы!

    Thumb up 0 Thumb down 0

    Ответить

  • Сергей
    8 Ноябрь, 2011, 16:30

    $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»;

    вот получилось!

    Thumb up 0 Thumb down 0

    Ответить

  • Женя
    12 Декабрь, 2011, 16:54

    Помогите, как установить? Что прописать в base.php? В БД нужно добавлять какие-то таблицы?

    Thumb up 1 Thumb down 1

    Ответить

  • Женя
    12 Декабрь, 2011, 16:57

    Дамп загрузил, появилось 2 таблицы, но на странице с рейтингом Fatal error: Call to undefined function vhost_682_tests() in /var/www/vhost-682/data/www/**********.ru/rating/base.php on line 5

    Thumb up 1 Thumb down 0

    Ответить

    makecode Ответил:

    Пропишите в файле base.php данные от своей базы данных.

    Thumb up 0 Thumb down 1

    Ответить

  • туплю
    4 Январь, 2012, 5:04

    .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=»#»>

    Справа, слева экрана встраивается портя верстку, но никак не в нужном месте.

    Thumb up 0 Thumb down 0

    Ответить

  • 2 Февраль, 2012, 15:40

    Как мне данный скрипт вcтроить в CMS Joomla?

    Thumb up 1 Thumb down 0

    Ответить

  • Mons
    15 Февраль, 2012, 20:40

    Нет смысла отдельно считать + и -
    Куда объективнее высчитывать общее среднее значение

    Thumb up 0 Thumb down 0

    Ответить

    makecode Ответил:

    Раскройте пожалуйста Вашу мысль, всмсыле высчитывать среднее значение? Делить, а не вычитать?

    Thumb up 0 Thumb down 0

    Ответить

  • Сергей
    21 Март, 2012, 14:28

    А как сделать что б вместо ид поста был адрес страницы которой вызывается скрипт то есть адрес новости?
    Хочу сделать для новостей рейтинг

    Thumb up 0 Thumb down 0

    Ответить

    makecode Ответил:

    Вместо id храните url, но зачем такие ухищрения когда можно просто и быстро передать id новости.

    Thumb up 0 Thumb down 0

    Ответить

    Сергей Ответил:

    А как просто и быстро передать ид новости?
    Пример адреса новости: http://ххххххх/portal.php?mod=view&aid=3 — aid ид новости

    Thumb up 0 Thumb down 0

    Ответить

    makecode Ответил:

    $id = (int)$_GET['aid'];

    Thumb up 0 Thumb down 0

    Ответить

    Сергей Ответил:

    Вставлять в php файлы вместо других строк? Тогда что писать в ид когда вызываешь рейтинг?

    Thumb up 0 Thumb down 0

    Ответить

    Сергей Ответил:

    Я добавил $id = (int)$_GET['aid']; вместо rateaction.php $id = (int)$_POST['idpost']; а ид при вызове оставил пустым не помогло

    Thumb up 0 Thumb down 0

    Ответить

Оставить комментарий