Сейчас: 00:28:54   26-го апреля 2024 г.
UsefulScript.ruСкриптыРазныеСкрипт оценки тем
449
912

Скрипт оценивания тем

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


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


Обращаем Ваше внимание на то, что при оценивании темы (или изменении ее оценки), оценка изменяется без перезагрузки странички, что экономит ресурсы сервера и время посетителя.


Для примера, обратите внимание на маленький пример, расположенный чуть ниже:


0 463 1

Вы можете покликать, и убедиться, что оценки меняются по клику и сохраняются при перезагрузке странички. Оформить оценки как Вам надо, думаю, не составит Вам труда, тем более что у всех на этот счет свои предпочтения. Как Вы могли заметить, при изменении оценки на противоположную (если посетитель передумал), сумма меняется сразу на два пункта, т.к. сначала отменяется предыдущая оценка, а потом добавляется новая.


А теперь давайте перейдем непосредственно к самому скрипту для получения на своем сайте возможности оценивания тем посетителями. Для нормальной работы скрипта Вам потребуется подключить библиотеку jQuery (это необходимо для оставления оценок без перезагрузки странички):

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

Дополнительно Вам придется внести небольшие изменения в имеющуюся MySQL базу, а именно добавить в таблицу с имеющимися темами (в нашем примере пусть она называется threads) два новых поля: plus и minus. В данных полях мы будем хранить суммарное значение положительных и отрицательных оценок, поставленных конкретной теме.


Дополнительные поля plus и minus

Для того чтобы избежать накрутки рейтинга тем (многократного оценивания с одного IP адреса), Вам понадобится добавить еще одну таблицу (назовем ее rating), в которой будут храниться даты оценок, идентификаторы тем, IP адреса оценивших тему и сами оценки.


Структура таблицы rating

Теперь Вам понадобится создать PHP файл с именем rating.php, который будет обрабатывать поступившие оценки и заносить их в MySQL. Вы можете скачать данный файл по ссылке rating.rar, или создать его самостоятельно, поместив внутрь следующий код:

PHP код:
<?php
if (isset($_POST["id"]) and is_numeric($_POST["id"])) $object=$_POST["id"];
    else 
$object='';
if (isset(
$_POST["ocenka"]) and ($_POST["ocenka"]==or $_POST["ocenka"]==1))
    
$ocenka=$_POST["ocenka"];
    else 
$ocenka='';

if (
$object!='' and $ocenka!='') {
 
$ip=$_SERVER['REMOTE_ADDR'];
 
$db=mysqli_connect("localhost","логин","пароль","имя БД");
 
$res=mysqli_query($db,"SELECT count(id),value FROM rating WHERE
     theme_id='"
.$object."' and ip=INET_ATON('".$ip."')");
 
$number=mysqli_fetch_array($res);

 if (
$number[0]==0) {
    
$res=mysqli_query($db,"INSERT INTO rating (date,theme_id,ip,value) values
        ('"
.time()."','".$object."',INET_ATON('".$ip."'),'".$ocenka."')");
    if (
$ocenka==0$res=mysqli_query($db,"UPDATE threads SET
        minus=(minus+1) WHERE id='"
.$object."' LIMIT 1");
    else 
$res=mysqli_query($db,"UPDATE threads SET plus=(plus+1) WHERE
        id='"
.$object."' LIMIT 1");
 }
 elseif (
$number["value"]!=$ocenka) {
    
$res=mysqli_query($db,"UPDATE rating SET date='".time()."',value=
        '"
.$ocenka."' WHERE theme_id='".$object."' and ip=INET_ATON('".$ip."')");
    if (
$ocenka==0$res=mysqli_query($db,"UPDATE threads SET minus=(minus+1),
        plus=(plus-1) WHERE id='"
.$object."' LIMIT 1");
    else 
$res=mysqli_query($db,"UPDATE threads SET plus=(plus+1),
        minus=(minus-1) WHERE id='"
.$object."' LIMIT 1");
 }

$res=mysqli_query($db,"SELECT plus,minus FROM threads WHERE
    id='"
.$object."' LIMIT 1");
$rating=mysqli_fetch_array($res);
echo (
$rating[plus]-$rating[minus]);
}
?>

Далее во все темы сайта, которые нужно оценивать, необходимо добавить два кода. Первый код выводит изначальную оценку темы и содержит форму для оценивания:

PHP код:
<?php
$object 
111;    //id текущей темы

$db mysqli_connect("localhost""логин""пароль""имя БД");
$res mysqli_query($db"SELECT plus, minus FROM threads
WHERE id = '"
.$object."' LIMIT 1");
$rating mysqli_fetch_array($res);


echo 
'<img src="image\minus.png" class="rating" alt="0">';
echo 
'<span style="margin: 10px;" id="rating_threads">'.($rating["plus"]-
    
$rating["minus"]).'</span>';
echo 
'<img src="image\plus.png" class="rating" alt="1">';
?>

Важным моментом в данном коде является присвоение переменной $object идентификатора (id) темы, которая будет оцениваться. Т.к. структура сайтов у всех разная, то мы не стали добавлять MySQL запрос его получения, т.к. наверняка где-то этот идентификатор темы уже был получен из MySQL базы ранее.


Второй код нужен для передачи выбранной оценки в файл rating.php и получения суммарной оценки темы без перезагрузки странички:

JavaScript код:
<script type="text/javascript">
$(
".rating").click(function(){
 
jQuery.post("rating.php",{id:<?php echo $object; ?>,ocenka:$(this).attr("alt")},
     
refresh_rating);
});

function 
refresh_rating(data) {
 $(
"#rating_threads").html(data);
}
</script>

А теперь, давайте посмотрим, как настроить интервал времени для выставления повторной оценки с IP адреса, который уже оценивал тему. Если Вам необходимо запретить повторные оценки с одного и того же IP адреса, то ничего больше добавлять не надо. А вот если Вы хотите, чтобы пользователи могли оценить повторно тему, например, через сутки, то в CRON поместите простой MySQL запрос удаления из таблицы rating оценок, даты которых старше суток:

PHP код:
<?php
$res
=mysqli_query($db,"DELETE FROM rating WHERE date<".(time()-86400)."");
?>

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

Дата создания: 20:10:07 22.10.2013 г.
Посещений: 8742 раз(а).

Комментарии посетителей (35 шт.):
Никита
8
# 1226
(22:24:07  22.10.2013 г.)

А разве поле IP в таблице должно быть INT?
Там же вроде только целые числа, а в IP адресе есть точки. Или я что-то путаю?
Ответить

Administrator
1
# 1229
(00:12:55  23.10.2013 г.)

Все верно, поле IP должно быть INT, т.к. при помощи функции INET_ATON, мы преобразуем его с 15 символов CHAR до 10 INT, что позволяет значительно сэкономить место и в разы увеличить скорость.
Ответить

Никита
3
# 1231
(12:44:34  23.10.2013 г.)

Administrator, скрипт по-прежнему "чудит" не могли бы вы внести немного ясности?
Даже на вашей страничке мой голос даёт по 2 балла.
Ответить

Administrator
4
# 1232
(19:24:23  23.10.2013 г.)

Чуть ниже примера работы скрипта в данной теме описано, почему так происходит. Повторюсь: если посетитель передумал, и выбрал другую оценку, то сумма изменяется на два балла, т.к. сначала отменяется результат предыдущей оценки, а потом сразу добавляется новая оценка.
Если Вы не хотите, чтобы посетитель мог изменять свою оценку, то удалите блок с кодом:
elseif ($number["value"]!=$ocenka) { . . . }
Ответить

Роман
1
# 1455
(13:27:54  05.02.2014 г.)

Admin, на local все работает, а на сервере с одного IP можно ставить неограниченное количество оценок. В чем может быть проблема? В БД записываются одинаковые IP и id темы.
Ответить

Administrator
1
# 1458
(22:44:19  05.02.2014 г.)

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

Юрий
0
# 1522
(20:26:50  15.03.2014 г.)

Выдает ошибку функции $rating=mysqli_fetch_array($res)
Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result
Подскажите, в чем может быть дело, может из-за версии PHP?
Ответить

Administrator
1
# 1523
(23:03:01  15.03.2014 г.)

Скорее всего, это из-за ошибки в SQL запросе, предшествующем данной функции. Это может быть из-за неправильно созданной БД или ошибки в имени какого-нибудь столбца БД.
Ответить

Дмитрий
0
# 1581
(09:22:44  10.04.2014 г.)

При работе скрипта в таблицу rating не заносятся никакие данные, в итоге пользователь может голосовать без ограничений. В чем может быть проблема?
Ответить

Administrator
0
# 1583
(22:20:54  10.04.2014 г.)

Попробуйте создать таблицу заново и при этом обратите особое внимание на тип данных каждого поля.
Ответить

Александр
0
# 1731
(20:36:22  17.06.2014 г.)

У меня не работает вообще. При обращении к сайту в таблицу rating данные попадают, но вот кнопки есть, но не активны!!! То есть жму на картинку + реакции никакой и по - тоже.
Ответить

Administrator
1
# 1732
(21:16:30  17.06.2014 г.)

Александр, в таблицу rating заносятся данные по поставленным оценкам для того чтобы не допустить повторного оценивания тем. А общая оценка выводятся на экран из таблицы threads. Так что проблема, скорее всего, в изменении рейтинга темы в таблице threads (запрос в файле rating.php).
Для того чтобы проверить работает ли скрипт обновления рейтинга (не привязываясь к БД), добавьте в файл rating.php перед "?>" строчку: echo 'id='.$_POST["id"]; и тогда после нажатия на плюс или на минус вместо рейтинга будет выводиться номер переданного id темы.
Ответить

Александр
0
# 1733
(22:15:09  17.06.2014 г.)

Дело в том, что кнопки вообще не активны они просто картинки!
P.S. Прошу прощения. Добавил в файл вашу проверку и сообщение выдало. Что дальше делать.
Ответить

Administrator
0
# 1737
(22:26:53  17.06.2014 г.)

Все правильно, так и должно быть. Клик по данным картинкам отлавливается при помощи jQuery. Далее при помощи jQuery методом POST данные передаются (id темы и оценка) в файл rating.php, где они обрабатываются и добавляются в БД. После обработки переданных данных также при помощи jQuery обновляется оценка.
В переменную $object необходимо поместить id текущей темы для вывода оценки при первой загрузке странички.
Вам необходимо вместо названия таблицы "threads" во всех кодах использовать название уже имеющейся у Вас таблицы, где хранятся id и названия тем. В данную таблицу необходимо предварительно добавить два поля: plus и minus, о чем говорится в теме.
Ответить

Александр
1
# 1739
(22:34:46  17.06.2014 г.)

Дело в том, что у меня только две таблицы rating, и threads и больше ни каких нет!!!
Ответить

Administrator
2
# 1740
(22:38:58  17.06.2014 г.)

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

Вика
1
# 2896
(17:12:10  13.12.2015 г.)

У меня похожая ситуация - в таблицу rating при нажатии данные заносятся с id темы 96, а в файл rating.php попадает id=960 (проверила строчкой echo 'id='.$_POST["id"];), если id=97, то соответственно в rating.php попадает id=970. Можно это как-нибудь исправить?
Ответить

Administrator
0
# 2897
(20:40:52  13.12.2015 г.)

А если глянуть исходный код странички, то что написано в строчке:
jQuery.post("rating.php",{id: после id: ???
По идее там должен быть номер темы (его id) из переменной $object. Проверьте, как и что у Вас помещается в переменную $object.
Ответить

Вика
1
# 2898
(01:45:43  14.12.2015 г.)

А можно эту запись id:<?php echo $object; ?> как-то по другому прописать?
И еще один вопрос. Я пытаюсь поставить данный скрипт на страничку, где уже стоит скрипт комментариев, где в скрипте переменные с такими же именами - $res,$rating,$ocenka. Может быть в данном скрипте надо полностью поменять названия переменных?
Ответить

Administrator
-1
# 2903
(22:19:41  14.12.2015 г.)

id:<?php echo $object; ?> нужно для того, чтобы передать в JavaScript код переменную, содержащую id темы. А названия переменных Вы конечно же можете заменить на свои.
Ответить

jb
2
# 2166
(13:36:36  04.01.2015 г.)

Код обновляет первую строчку. Допустим у меня код расположен для оценки комментариев где в одной страничке 10 ком. Нажимай какую строку хочешь, обновляется самый верхний ряд. Как вывести в данном коде ид для каждой стоки?
Ответить

Administrator
-1
# 2167
(13:52:49  04.01.2015 г.)

У каждого комментария должен быть свой уникальный id, который необходимо присваивать при выводе комментариев на экран. Вам необходимо привязать скрипт к id комментария, а не к id темы.
Ответить

Денис
1
# 2503
(09:12:34  31.05.2015 г.)

А как быть, если в БД нет таблицы с темами. Выше написано, что к этой таблице нужно добавить два поля plus и minus. Где можно почитать, как создать такую таблицу.
Ответить

Игорь
-1
# 2665
(13:23:28  29.08.2015 г.)

Добрый день!
Подскажите, пожалуйста, как этот скрипт сделать без привязок, у меня странички html, хотелось бы сделать к темам оценивание, с php у меня туговато;) заранее благодарен!
Ответить

Administrator
0
# 2667
(15:40:01  29.08.2015 г.)

Без PHP и MySQL данный скрипт работать не будет, т.к. скрипт привязывается к идентификаторам тем и хранит все данные по поставленным оценкам в MySQL.
Ответить

Евгений
1
# 2825
(21:10:18  23.11.2015 г.)

У меня что-то не так с javascript запросом. Все точно, как показано в статье, но почему-то не отправляется id странички.
Ответить

Administrator
0
# 2826
(21:58:04  23.11.2015 г.)

Проверьте, подключена ли у Вас на сайте библиотека jQuery. Также удостоверьтесь в том, что в переменной $object имеется значение id темы.
Ответить

Вова
0
# 2844
(00:51:26  30.11.2015 г.)

Скрипт работает прекрасно во всех браузерах кроме Мозилы. В Мозиле почему-то вместо картинок плюс и минус выводит числа 0 и 1. Как это исправить? Подскажите, пожалуйста.
Ответить

Administrator
-1
# 2846
(21:09:43  30.11.2015 г.)

Картинки сделаны при помощи обычных HTML тегов img. Закройте/откройте браузер и обновите страничку. Скорее всего закэшировались неправильные ссылки на изображения.
Ответить

вадим
0
# 3288
(21:59:34  24.06.2016 г.)

Здравствуйте Админ, а возможно ли такое сделать на сайтах юкоз имея хостинг для файлов php? Хост не юкоза.
Ответить

Administrator
0
# 3289
(22:18:56  24.06.2016 г.)

Так юкоз все-таки или нет? Хотя какая разница, главное, чтобы Ваш хостинг поддерживал PHP и MySQL.
Ответить

вадим
0
# 3291
(22:29:34  24.06.2016 г.)

Да, конечно он поддерживает и то, и то. Просто на козе рейтинг поди знаете какой и что-то сделать эдакое не имею понятия как, а данный рейтинг тем более показывает и минусы и плюсы, что в юкозе стандартно такого не сделать.
Ответить

Светлана
0
# 3531
(22:51:05  31.10.2016 г.)

Скрипт отличный, рабочий, но:
У меня на сайте 8 человек проголосовало "за" и 8 "против", в результате - итог так и остался равным "0". А мне пишут потом - "Почему мой голос не учелся, я ведь голосовал?" Было бы идеально, если бы было видно, сколько по отдельности голосов "+" и сколько "-"
Ответить

Administrator
0
# 3532
(23:17:22  31.10.2016 г.)

Так выведите в нужном Вам месте странички значения из переменных $rating["plus"] и $rating["minus"].
Они содержат количество проголосовавших "за" и "против" соответственно.
Ответить

Евгений
0
# 4798
(14:28:42  27.02.2021 г.)

Чета нагрузку берет!
Ответить

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

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

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

Какие темы необходимо добавлять на сайт?