Сейчас: 09:35:38   25-го апреля 2024 г.
UsefulScript.ruСкриптыРазныеРейтинг со звездочками
76
277

Скрипт рейтинга со звездочками

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


Наш скрипт звездного рейтинга так же как и другие подобные скрипты позволяет оценивать что угодно на сайте, но при этом наш скрипт позволяет это делать сразу по нескольким параметрам и высчитывать общую (среднюю) оценку.


Для демонстрации работы предлагаемого нами скрипта звездного рейтинга, сделанного при использовании jQuery, обратите внимание на рейтинг со звездочками, расположенный ниже:

Параметр 1:

5.0
Параметр 2:

5.0
Параметр 3:

5.0
Общая оценка:

5.00

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


При клике по звездочкам какого-либо параметра значение текущего параметра рейтинга будет зафиксировано. При повторном клике - значение рейтинга данного параметра вновь будет можно изменять. При клике по кнопке "Отправить!", произойдет передача общей оценки на сервер для ее сохранения и дальнейшей обработки.


Для реализации подобного звездного рейтинга на Вашем сайте, Вам потребуется подключение библиотеки jQuery. Сделать это можно следующим образом:

JavaScript код:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js">
</script>

Далее Вам потребуется разместить код вывода на экран рейтинга со звездочками:

HTML код:
<div id="rating">
<
div class="param">Параметр 1:</div>
<
div><div class="stars"></div><class="progress" id="p1"></p></div>
<
div class="rating" id="param1">5.0</div>

<
div class="param">Параметр 2:</div>
<
div><div class="stars"></div><class="progress" id="p2"></p></div>
<
div class="rating" id="param2">5.0</div>

<
div class="param">Параметр 3:</div>
<
div><div class="stars"></div><class="progress" id="p3"></p></div>
<
div class="rating" id="param3">5.0</div>


<
div class="param">Общая оценка:</div>
<
div><div id="sum_stars"></div><p id="sum_progress"></p></div>
<
div id="summ">5.00</div>

<
input id="el_999" type="submit" value="Отправить!">
<
p id="message"></p>
</
div>

Обращаем Ваше внимание на то, что el_999 - уникальный идентификатор того, что мы будем оценивать! Для каждой темы (комментария или товара), данный идентификатор должен иметь свое цифровое значение, например, el_1 или el_123.


Далее в шапку сайта между тегами <head> и </head> для такого же отображения рейтинга Вам необходимо добавить следующие стили оформления:

HTML код:
<style type="text/css">
#rating {
    
width320px;
    
border-radius4px;
    
box-shadow0 0 2px 1px #333333;
    
margin10px auto;
    
padding10px;
    
text-aligncenter;
}
#rating div { float: left; }
#rating p { margin: 0; padding: 0; }
.param {
    
width110px;
    
margin0 20px 0 0;
    
text-alignright;
}
.
param, .rating#summ { line-height: 28px; }
.stars#sum_stars { background: url(image/stars.png); }
.stars#sum_stars, .progress, #sum_progress {
    
width130px;
    
height28px;
    
cursorpointer;
}
.
progress background#FFEE00; }
#sum_progress { background: #00EE00; }
.rating#summ {
    
margin0 0 0 20px;
    
font-weightbold;
}
</
style>

В нашем примере в CSS стиле мы указали путь на изображение с пятью прозрачными звездочками, окруженных белым фоном.

Звездный рейтинг

Теперь остается добавить JavaScript код, который будет отвечать за заполнение звездочек, изменение рейтинга, вычисление суммы рейтинга и отправку общего рейтинга на сервер:

JavaScript код:
<script type="text/javascript">
$(
document).ready(function(){
 function 
move(eobj){
    var 
summ 0;
    var 
id obj.next().attr('id').substr(1);
    var 
progress e.pageX obj.offset().left;
    var 
rating progress / $('.stars').width();
    $(
'#param'+id).text(rating.toFixed(1));
    
obj.next().width(progress);
    $(
'.rating').each(function(){ summ += parseFloat($(this).text()); });
    
summ summ / $('.rating').length;
    $(
'#sum_progress').width(Math.round($('.stars').width() * summ 5));
    $(
'#summ').text(summ.toFixed(2));
 }

 $(
'#rating .stars').click(function(e){
    $(
this).toggleClass('fixed');
    
move(e, $(this));
 });

 $(
'#rating .stars').on('mousemove', function(e){
    if ($(
this).hasClass('fixed')==falsemove(e, $(this));
 });

 $(
'#rating [type=submit]').click(function(){
    
summ parseFloat($('#summ').text());
    
jQuery.post('change_rating.php', {
        
obj_id: $(this).attr('id').substr(3),
        
ratingsumm
    
}, notice);
 });

 function 
notice(text){
    $(
'#message').fadeOut(500, function(){ $(this).text(text); }).fadeIn(2000);
 }
});
</script>

Для хранения оценок, отправленных на сервер выше приведенным JavaScript кодом, Вам понадобится в MySQL создать таблицу votes:

Цитата:
CREATE TABLE IF NOT EXISTS `votes` (
  `
idint(10unsigned NOT NULL auto_increment,
  `
dateint(10unsigned NOT NULL,
  `
id_productint(10unsigned NOT NULL,
  `
ipint(10unsigned NOT NULL,
  `
ratingfloat unsigned NOT NULL,
  
PRIMARY KEY  (`id`)
ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

Для хранения рейтинга и количества проголосовавших, в MySQL в таблице, которая содержит то, что оценивается (будь то тема, комментарий или товар), добавьте два столбца: points с типом данных float и votes с типом данных int.


В нашем примере мы будем оценивать рейтинг темы и таблица будет называться themes.


Для обработки полученных результатов на сервере и занесения их в MySQL, создайте файл change_rating.php и добавьте в него следующий код:

PHP код:
<?php
if (is_numeric($_POST["obj_id"])) $obj=$_POST["obj_id"];
else 
$obj='';
if (
$_POST["rating"]>=and $_POST["rating"]<=5$ocenka=$_POST["rating"];
else 
$ocenka='';

if (
$ocenka!='' and $obj>0) {
 
$time=$_SERVER['REQUEST_TIME'];
 
$ip=$_SERVER['REMOTE_ADDR'];
 
$db=mysqli_connect("localhost","Логин","Пароль","Имя_БД") or die();
 
$res=mysqli_query($db,"DELETE FROM votes WHERE date<".($time-604800));
 
$res=mysqli_query($db,"SELECT count(id) FROM votes
    WHERE id_product="
.$obj." and ip=INET_ATON('".$ip."')");
 
$number=mysqli_fetch_array($res);
 if (
$number[0]==0) {
    
$res=mysqli_query($db,"INSERT INTO votes (date,id_product,ip,rating)
        values ("
.$time.",".$obj.",INET_ATON('".$ip."'),".$ocenka.")");
    
$res=mysqli_query($db,"UPDATE themes
        SET points=(points+"
.$ocenka."),votes=(votes+1) WHERE id=".$obj." LIMIT 1");
    echo 
'Спасибо, Ваш голос учтен!';
 }
 else echo 
'Вы уже сегодня голосовали!';
}
?>

Данный скрипт звездного рейтинга довольно прост в установке и поможет Вам лучше узнать мнение Ваших посетителей об оцениваемых параметрах указанных Вами объектах.


P.S. Если Вам нужен только один ряд звезд, то предлагаем Вам ознакомиться с другим нашим скриптом звездного рейтинга.

Дата создания: 22:37:09 25.06.2016 г.
Дата обновления: 19:32:01 29.08.2016 г.
Посещений: 40021 раз(а).

Комментарии посетителей (36 шт.):
Азамат
7
# 3313
(20:14:57  07.07.2016 г.)

Чтобы значила эта ошибка? <!--error--><br /> <b>Warning</b>: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in <b>Z:\home\...\www\change_rating.php</b> on line <b>14</b><br /> <script language=JavaScript src='/denwer/errors/phperror_js.php'></script> Спасибо, Ваш голос учтен!
Ответить

Administrator
3
# 3314
(20:51:56  07.07.2016 г.)

Она означает, что предшествующий строке $number=mysqli_fetch_array($res); SQL запрос вернул неверное значение. Причина, скорее всего, в неверном подключение к БД в файле change_rating.php.
Ответить

Di_man
1
# 3394
(14:31:26  29.08.2016 г.)

Та же беда, хотя в файле change_rating.php всё норм вроде бы.
Ответить

Administrator
1
# 3395
(19:32:16  29.08.2016 г.)

Нашел ошибку. В SQL запросе в файле change_rating.php вместо obj_id должно быть id_product, т.к. именно столбец с таким именем мы создали в таблице votes. В теме код исправил.
Ответить

Вика
1
# 3368
(17:41:52  16.08.2016 г.)

Добрый день! У меня почему-то при наведении курсора зарисовываются не сами звезды, а желтая полоса позади звезд, которая увеличивается или уменьшается при изменении рейтинга. Не подскажете, что это может быть? И каким правильным должен быть вставляемый рисунок: с 1 звездой или 5 звездами подряд, на прозрачном или на белом фоне, звезды изначально должны быть закрашены или нет? Я вставила рисунок с 1 звездой на прозрачном фоне не закрашенную, вывелось 5 не закрашенных звезд, только возникла проблема, что закрашиваются не они, а фон позади них.
Ответить

Administrator
-1
# 3369
(20:54:30  16.08.2016 г.)

Забыл упомянуть об этом в теме, но уже исправился.
Изображение должно иметь пять звезд, прозрачных внутри, но при этом окруженных непрозрачным фоном. Тогда при закрашивании фона под изображением будет закрашиваться только прозрачная часть звездочек. Скачайте приведенное изображение из темы и укажите его в CSS.
Ответить

Вика
-1
# 3373
(00:16:20  17.08.2016 г.)

Спасибо большое! А если мне достаточно одного ряда звезд, то достаточно ли просто удалить часть HTML-кода или JavaScript код тоже нужно сокращать? И еще вопрос - нельзя ли как-нибудь вывести общий результат всех голосовавших?
Ответить

Administrator
1
# 3377
(22:30:54  18.08.2016 г.)

JavaScript код тоже придется сокращать. Для того чтобы вывести общий результат всех голосовавших, необходимо взять сумму всех голосов (points) из БД и разделить ее на количество голосов (votes).
Ответить

Васо
0
# 4411
(11:10:55  17.02.2019 г.)

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

Вика
-1
# 3375
(13:04:40  17.08.2016 г.)

Еще один вопросик. В таблицу "themes" все отлично и правильно заносится, рейтинг считается правильно, количество голосовавших - тоже правильно. Но таблица "votes" у меня остается пустой, в нее ничего не заносится, это так и должно быть? И голосовать почему-то можно неограниченное число раз, 20 раз попробовала - 20 раз посчиталось.
Ответить

Administrator
4
# 3378
(22:35:01  18.08.2016 г.)

Таблица "votes" как раз и предназначена для того, чтобы нельзя было голосовать несколько раз с одного IP. Она не должна быть пустой, а должна содержать информацию о последних проголосовавших.
Ответить

Даниил
1
# 3400
(21:22:50  31.08.2016 г.)

Отличный скрипт, лёгкий, простенький, тем более с несколькими параметрами СПАСИБО! Отличный сайт!
Ответить

леонид
3
# 3401
(17:11:30  01.09.2016 г.)

Скрипт работает хорошо, но можно ли чтобы в "общей оценке" результат увеличивался или уменьшался с учётом голосов предыдущих пользователей?
Ответить

Света
2
# 4021
(18:55:52  02.07.2017 г.)

Подскажите, почему при изменении разрешения экрана на больший размер, когда у меня масштабируется полностью страница, у скрипта желтая полоса, которая закрашивает звездочки, выходит за сами звездочки и максимальное значение параметра не ограничивается 5, а становится 6.3? На разрешении 1024 скрипт работает правильно, на 1280 - так, как я описала.
Можно ли это учесть как-нибудь в скрипте?
Ответить

Владимир
2
# 4048
(14:09:59  15.08.2017 г.)

Спасибо за скрипт! Все работает.
В таблицу themes добавил колонку id int(10)
Для заполнения таблицы themes пришлось в базе данных создать строку с id=999 и каждый раз нужно создавать строку для счетчика каждой страницы.
------------------
Напишите пожалуйста - как сделать на нужной странице микроразметку для рейтинга.
Ответить

Vladimir
1
# 4078
(21:22:25  25.09.2017 г.)

Я не понял, так две таблицы надо создавать? Какой запрос на открытие таблицы themes?
Ответить

Administrator
1
# 4079
(22:38:43  25.09.2017 г.)

Предполагается, что одна таблица уже у Вас есть и содержит идентификаторы того, что будет оцениваться (например, themes).
Туда необходимо добавить два новых столбца: points и votes.
А вот вторую таблицу votes необходимо создать при помощи SQL запроса, приведенного в данной теме.
Ответить

Vladimir
-2
# 4080
(17:35:27  26.09.2017 г.)

Никаких таблиц у меня не было. Подскажите, как её открыть. Тут не одни программисты, убедительная просьба не опускать разумеющихся для других обязательные моменты.
Ответить

Administrator
2
# 4081
(19:44:59  26.09.2017 г.)

В таком случае создайте таблицу themes при помощи следующего SQl запроса:
CREATE TABLE IF NOT EXISTS `themes` (
`id` int(10) unsigned NOT NULL auto_increment,
`points` float NOT NULL,
`votes` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

Добавьте в данную таблицу столько строк, сколько будет оцениваться тем (или товаров), при этом поле id у всех должно быть разное, а points и votes равны нулю.
Далее в строчке: <input id="el_999" type="submit" value="Отправить!"> вместо el_999 подставляйте el_1, el_2 и т.д. для каждой оцениваемой темы (или товара).
Ответить

Леонид
-2
# 4106
(15:07:00  22.10.2017 г.)

Всё настроил всё работает, но при обновлении страницы не показывает общие оценки. Я не программист и допрограммировать не могу. Жаль скрипт хороший, но не рабочий.
Ответить

Ольга
0
# 4248
(18:57:13  24.02.2018 г.)

Здравствуйте, всё работает, разобралась.
Подскажите, пожалуйста, как сделать, если имеется одна страница article.php и все статьи находятся в базе? Не подскажете, какие изменения надо будет сделать, чтобы скрипт заработал?
У меня также не показывается общие оценки...
Подскажите в чём может быть проблема?
Ответить

Ольга
0
# 4250
(14:05:32  25.02.2018 г.)

Здравствуйте. Подскажите, как подправить скрипт, чтобы передать скрытое поле <input type="hidden" name="id" value="" /> в базу для определения id конкретной статьи и js скрипт полагаю нужно также будет изменить?
C уважением и заранее спасибо за ответ.
Ответить

Ольга
0
# 4251
(14:24:03  25.02.2018 г.)

Просьба, помогите разобраться. Как сделать, если имеется одна страница article.php и все статьи вытаскиваются на эту страницу со своим id.
Подскажите как изменить скрипт, у вас на сайте самый толковый скрипт, который я нашла.
Заранее благодарна.
Ответить

Оля
1
# 4279
(08:50:16  12.04.2018 г.)

Отлично все работает! А как сделать, чтобы минимальный шаг голосования был 0.5 (пол звездочки)?
Ответить

Злыднь
-1
# 4330
(23:52:44  27.07.2018 г.)

Мало того, что при обновлении страницы теряется выставленная оценка, так и на звездочках не выводится общий результат голосования.
Ответить

Александр
0
# 4332
(08:49:20  12.08.2018 г.)

Прекрасный пример! Спасибо огромное за поучительную статью, отличный сайт!
Ответить

Константин
1
# 4364
(14:14:59  08.11.2018 г.)

Добрый день!
Подскажите, пожалуйста, что такое $_POST["obj_id"]? Это параметр какого поля? Просто у меня этот параметр пустой при нажатии на кнопку.
Ответить

Administrator
-1
# 4365
(19:12:07  08.11.2018 г.)

Это POST переменная, через которую передается уникальный идентификатор того, что мы будем оценивать и присваивается через id кнопки. Конкретно в данном примере данная переменная будет содержать значение "999", т.к. первые три символа мы обрезаем.
Ответить

Константин
0
# 4367
(22:55:24  10.11.2018 г.)

Спасибо, а что означает jQuery.post('change_rating.php', {
obj_id: $(this).attr('id').substr(3),
rating: summ - мы передаем идентификатор и рейтинг?
Ответить

Administrator
1
# 4369
(14:00:17  11.11.2018 г.)

Все верно. При помощи JavaScript передается id оцениваемого объекта и рейтинг в файл change_rating.php, который в свою очередь записывает полученные данные в БД.
Ответить

Дмитрий
0
# 4414
(22:43:51  19.02.2019 г.)

Здравствуйте!
Подскажите, пожалуйста, как сделать по умолчанию пустые звезды, и все по нулям.
Ответить

Дмитрий
0
# 4418
(21:57:20  21.02.2019 г.)

Подскажите, пожалуйста, как из js убрать один или два ряда звезд?
Ответить

Administrator
0
# 4528
(21:45:58  21.10.2019 г.)

Если Вам нужен всего один ряд звезд, то посмотрите скрипт звездного рейтинга
Ответить

сергей
0
# 4431
(11:58:35  01.03.2019 г.)

Здравствуйте. Я решил внедрить ваш код в один проект в cms но застрял на этапе что не идет запись в базу. Не могу найти в чем суть загвоздки. Логически понимаю, что в передаче параметров... но тупик. Помогите плиз!
Ответить

Алексей
0
# 4477
(08:49:38  09.06.2019 г.)

Спасибо большое! Это был мой первый скрипт с SQL!
Ответить

Дмитрий
1
# 4522
(18:39:20  07.10.2019 г.)

А как отображать результат на сайте и сделать микроразметку? Спасибо.
Ответить

Закрыть
Ваше имя:
350 + 9 =
Добавить комментарий:
Ваше имя:
350 + 9 =

Перед публикацией все комментарии проходят обязательную модерацию!

Если Вы хотите задать какой-либо вопрос, то сделайте это на нашем форуме.
Таким образом, Вы сможете быстрее получить ответ на интересующий Вас вопрос.
Посетителей онлайн: 9

Мешает ли Вам реклама?