Скрипт оценивания тем
Многие уже наверно видели на различных сайтах работу скриптов, которые позволяют оценивать посетителям понравившиеся им темы (материалы). По просьбе посетителей нашего сайта мы решили создать свой собственный простой и универсальный скрипт, который позволял бы посетителям сайта оценивать имеющиеся на сайте темы.
Наш скрипт позволяет оставлять одному посетителю (с одного IP адреса) по одной оценке к каждой теме в течение указанного интервала времени. После истечения указанного интервала времени (если таковой будет задан), посетитель уже оценивавший тему, может поставить еще одну оценку. При необходимости, посетитель может изменить свою оценку на противоположную. В базе хранится сумма как положительных, так и отрицательных оценок, т.к. это будет необходимо, например, для вывода процентного соотношения оставленных оценок.
Обращаем Ваше внимание на то, что при оценивании темы (или изменении ее оценки), оценка изменяется без перезагрузки странички, что экономит ресурсы сервера и время посетителя.
Для примера, обратите внимание на маленький пример, расположенный чуть ниже:
Вы можете покликать, и убедиться, что оценки меняются по клику и сохраняются при перезагрузке странички. Оформить оценки как Вам надо, думаю, не составит Вам труда, тем более что у всех на этот счет свои предпочтения. Как Вы могли заметить, при изменении оценки на противоположную (если посетитель передумал), сумма меняется сразу на два пункта, т.к. сначала отменяется предыдущая оценка, а потом добавляется новая.
А теперь давайте перейдем непосредственно к самому скрипту для получения на своем сайте возможности оценивания тем посетителями. Для нормальной работы скрипта Вам потребуется подключить библиотеку jQuery (это необходимо для оставления оценок без перезагрузки странички):
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js">
</script>
Дополнительно Вам придется внести небольшие изменения в имеющуюся MySQL базу, а именно добавить в таблицу с имеющимися темами (в нашем примере пусть она называется threads) два новых поля: plus и minus. В данных полях мы будем хранить суммарное значение положительных и отрицательных оценок, поставленных конкретной теме.
Для того чтобы избежать накрутки рейтинга тем (многократного оценивания с одного IP адреса), Вам понадобится добавить еще одну таблицу (назовем ее rating), в которой будут храниться даты оценок, идентификаторы тем, IP адреса оценивших тему и сами оценки.
Теперь Вам понадобится создать PHP файл с именем rating.php, который будет обрабатывать поступившие оценки и заносить их в MySQL. Вы можете скачать данный файл по ссылке rating.rar, или создать его самостоятельно, поместив внутрь следующий код:
<?php
if (isset($_POST["id"]) and is_numeric($_POST["id"])) $object=$_POST["id"];
else $object='';
if (isset($_POST["ocenka"]) and ($_POST["ocenka"]==0 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
$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 и получения суммарной оценки темы без перезагрузки странички:
<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
$res=mysqli_query($db,"DELETE FROM rating WHERE date<".(time()-86400)."");
?>
Пусть размер кода и описания к нему Вас не пугает, т.к. скрипт работает быстро и будет очень полезен для всех.
Перед публикацией все комментарии проходят обязательную модерацию!
Если Вы хотите задать какой-либо вопрос, то сделайте это на нашем форуме.
Таким образом, Вы сможете быстрее получить ответ на интересующий Вас вопрос.
Там же вроде только целые числа, а в IP адресе есть точки. Или я что-то путаю?
Даже на вашей страничке мой голос даёт по 2 балла.
Если Вы не хотите, чтобы посетитель мог изменять свою оценку, то удалите блок с кодом:
elseif ($number["value"]!=$ocenka) { . . . }
Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result
Подскажите, в чем может быть дело, может из-за версии PHP?
Для того чтобы проверить работает ли скрипт обновления рейтинга (не привязываясь к БД), добавьте в файл rating.php перед "?>" строчку: echo 'id='.$_POST["id"]; и тогда после нажатия на плюс или на минус вместо рейтинга будет выводиться номер переданного id темы.
P.S. Прошу прощения. Добавил в файл вашу проверку и сообщение выдало. Что дальше делать.
В переменную $object необходимо поместить id текущей темы для вывода оценки при первой загрузке странички.
Вам необходимо вместо названия таблицы "threads" во всех кодах использовать название уже имеющейся у Вас таблицы, где хранятся id и названия тем. В данную таблицу необходимо предварительно добавить два поля: plus и minus, о чем говорится в теме.
jQuery.post("rating.php",{id: после id: ???
По идее там должен быть номер темы (его id) из переменной $object. Проверьте, как и что у Вас помещается в переменную $object.
И еще один вопрос. Я пытаюсь поставить данный скрипт на страничку, где уже стоит скрипт комментариев, где в скрипте переменные с такими же именами - $res,$rating,$ocenka. Может быть в данном скрипте надо полностью поменять названия переменных?
Подскажите, пожалуйста, как этот скрипт сделать без привязок, у меня странички html, хотелось бы сделать к темам оценивание, с php у меня туговато;) заранее благодарен!
У меня на сайте 8 человек проголосовало "за" и 8 "против", в результате - итог так и остался равным "0". А мне пишут потом - "Почему мой голос не учелся, я ведь голосовал?" Было бы идеально, если бы было видно, сколько по отдельности голосов "+" и сколько "-"
Они содержат количество проголосовавших "за" и "против" соответственно.