Скрипт учитывает только один голос с одного IP адреса для каждого голосования в отдельности. Таким образом, если с указанного IP адреса голосуют первый раз, то под результатами голосования Вы увидите надпись "Ваш голос учтен!" и Ваш голос будет засчитан. При попытке повторного голосования с IP адреса, который уже принимал участие в опросе, под результатами голосования появится надпись "Вы уже голосовали!" и голос не будет засчитан.
Теперь давайте перейдем непосредственно к созданию подобного скрипта голосования на Вашем сайте. Для начала Вам понадобится создать три таблицы в MySQLi для хранения всех необходимых данных по опросам, как на скриншотах ниже:
Для создания указанных таблиц, Вы можете воспользоваться следующим кодом:
[CODEBOX]CREATE TABLE IF NOT EXISTS `polls` (
`id` int(10) unsigned NOT NULL auto_increment, `title` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
CREATE TABLE IF NOT EXISTS `poll_answer` (
`id` int(10) unsigned NOT NULL auto_increment, `poll_id` int(10) unsigned NOT NULL,
`title` varchar(255) NOT NULL, `votes` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
CREATE TABLE IF NOT EXISTS `poll_ip` (
`id` int(10) unsigned NOT NULL auto_increment, `poll_id` int(10) unsigned NOT NULL,
`ip` int(10) unsigned NOT NULL, `date` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;[/CODEBOX]
Далее Вам понадобится создать файл, например,
polls.php, который будет отвечать за отображение Ваших опросов.
В данный файл (polls.php), либо на уже имеющеюся у Вас страничку поместите следующий код:
[CODEBOX]<?php
$db=mysqli_connect("localhost","Логин","Пароль","Имя_БД");
$res=mysqli_query($db,"set names utf8");
$res=mysqli_fetch_array(mysqli_query($db,"SELECT max(id) FROM polls LIMIT 1"));
$poll_id=$res[0];
$max_id=$res[0];
if (isset($_GET["poll_id"]) and is_numeric($_GET["poll_id"]) and $_GET["poll_id"]>0){
$res=mysqli_fetch_array(mysqli_query($db,"SELECT id FROM polls
WHERE id='".$_GET["poll_id"]."' LIMIT 1"));
if ($res[0]!='') $poll_id=$res[0];
}
$poll=mysqli_fetch_array(mysqli_query($db,"SELECT id,title FROM polls
WHERE id='".$poll_id."'"));
?>
<style type="text/css">
.polls{padding:10px; text-align:center; border:1px solid #EEEEEE; width:700px;}
.poll{text-align:left; display:table; width:100%; font-size:14px;}
.poll label{line-height:2;}
.votes{text-align:center; background-color:#CCCCFF; border:1px solid #0033FF;
margin:0 0 10px 0;}
</style>
<?php
echo '<div class="polls"><b>'.$poll["title"].'?</b>';
echo '<div class="poll" id="poll_'.$poll_id.'">';
$res=mysqli_query($db,"SELECT id,title FROM poll_answer
WHERE poll_id='".$poll_id."' ORDER BY id");
while ($answer=mysqli_fetch_array($res)) echo '<label><input type="radio"
name="item" value="'.$answer["id"].'">'.$answer["title"].'</label><br>';
echo '<div align="center"><input type="submit" id="view_res"
value="Посмотреть результат">';
echo '<input type="submit" id="vote" value="Голосовать">';
echo '</div></div></div><br>';
?>
<script type="text/javascript">
$(document).ready(function(){
$(".poll input:first").prop("checked",true);
$("#vote").click(function(){
jQuery.post("polls_result.php",{poll_id:$(this).parents(".poll").attr("id").
split('_')[1], answer_id:$('input:checked').val()},rating_poll);});
$("#view_res").click(function(){
jQuery.post("polls_result.php",{poll_id:$(this).parents(".poll").attr("id").
split('_')[1]},rating_poll);});
function rating_poll(data){
$(".poll").fadeOut(500, function(){$(this).html(data).fadeIn(500);});
}
});
</script>[/CODEBOX]
Обращаем Ваше внимание на то, что если у Вас на сайте не подключена библиотека jQuery, или Вы делаете отдельную страничку для опросов, то в файле polls.php Вам необходимо подключить ее следующим образом:
Код:
<script type="text/javascript"
src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
Для того чтобы не создавать для каждого опроса свою страничку, как Вы могли заметить, мы добавили переменную
$_GET["poll_id"]. Таким образом, при обращении к файлу polls.php следующим образом:
polls.php?poll_id=3, будет отображен опрос с id=3.
Как говорилось ранее, скрипт голосования работает без перезагрузки странички, следовательно, нам понадобится создать еще один файл, например,
polls_result.php. Данный файл будет вносить изменения в БД и выводить результаты голосования по нужному опросу.
Обращаем Ваше внимание на то, что наименование файла polls_result.php используется в предыдущем файле (polls.php), так что если Вы захотите переименовать файл polls_result.php в что-то другое, то следует внести изменения и в файл polls.php.
В файл
polls_result.php, поместите следующий код:
[CODEBOX]<?php
if (isset($_POST["poll_id"]) and is_numeric($_POST["poll_id"])) {
$poll_id=$_POST["poll_id"];
}
else $poll_id='';
if (isset($_POST["answer_id"]) and is_numeric($_POST["answer_id"])) {
$answer_id=$_POST["answer_id"];
}
else $answer_id='';
if ($poll_id>0) {
$db=mysqli_connect("localhost","Логин","Пароль","Имя_БД");
$res=mysqli_query($db,"set names utf8");
if ($answer_id!='') {
$ip=$_SERVER['REMOTE_ADDR'];
$res=mysqli_query($db,"SELECT count(id) FROM poll_ip
WHERE poll_id='".$poll_id."' and ip=INET_ATON('".$ip."') LIMIT 1");
$number=mysqli_fetch_array($res);
if ($number[0]==0) {
$res=mysqli_query($db,"INSERT INTO poll_ip (poll_id,ip,date)
values ('".$poll_id."',INET_ATON('".$ip."'),'".time()."')");
$res=mysqli_query($db,"UPDATE poll_answer SET votes=(votes+1)
WHERE id='".$answer_id."' LIMIT 1");
$answer='Ваш голос учтен!';
}
else $answer='Вы уже голосовали!';
}
$summa=mysqli_fetch_array(mysqli_query($db,"SELECT max(votes) AS max_v, sum(votes)
AS sum_v FROM poll_answer WHERE poll_id='".$poll_id."' LIMIT 1"));
if ($summa["max_v"]==0) $summa["max_v"]=$summa["sum_v"]=1;
$res=mysqli_query($db,"SELECT title,votes FROM poll_answer
WHERE poll_id='".$poll_id."' ORDER BY votes DESC");
while ($rating=mysqli_fetch_array($res)) {
echo '<div style="width:560px;float:left;">'.$rating["title"];
echo '<div class="votes" style="width:'.($rating["votes"]/$summa["max_v"]*560);
echo 'px;">'.$rating["votes"].'</div></div><div style="float:right;"><br>';
echo round(100*$rating["votes"]/$summa["sum_v"],2).' %</div>';
}
echo '<div style="width:100%;float:left;">Голосов: <b>'.$summa["sum_v"].'</b>';
echo '<div style="color:#CC0000;" align="center">'.$answer.'</div></div>';
}
?>[/CODEBOX]
После того, как Вы создали БД, файл опросов (polls.php) и файл, вносящий изменения в БД (polls_result.php), можно считать, что все готово, но осталось лишь самое простое - сделать админку по добавлению, изменению и удалению опросов. Для этого лучше создать отдельный файл, закрытый от других пользователей паролем (например, admin_polls.php), в который добавьте следующий код:
[CODEBOX]<?php
if (session_id()=='') session_start();
$db=mysqli_connect("localhost","Логин","Пароль","Имя_БД");
$res=mysqli_query($db,"set names utf8");
if (isset($_POST["add_poll"])) $res=mysqli_query($db,"INSERT INTO polls (title)
values ('".$_POST["new_poll"]."')");
if (isset($_POST["add_answer"])) $res=mysqli_query($db,"INSERT INTO poll_answer
(poll_id,title) values ('".$_SESSION["this_id"]."','".$_POST["new_answer"]."')");
if (isset($_POST["del_answer"])) $res=mysqli_query($db,"DELETE FROM poll_answer
WHERE id='".$_POST["del_answer_id"]."' LIMIT 1");
if (isset($_POST["del_poll"])) {
$res=mysqli_query($db,"DELETE FROM polls WHERE id='".$_SESSION["this_id"]."'");
$res=mysqli_query($db,"DELETE FROM poll_answer WHERE
poll_id='".$_SESSION["this_id"]."'");
}
if (isset($_POST["end_poll"]) or isset($_POST["del_poll"])) $_SESSION["this_id"]='';
if (isset($_POST["edit_answer"])) $res=mysqli_query($db,"UPDATE poll_answer
SET title='".$_POST["text_answer"]."' WHERE id='".$_POST["id_answer"]."'");
if (isset($_POST["edit_question"])) $res=mysqli_query($db,"UPDATE polls SET
title='".$_POST["text_question"]."' WHERE id='".$_SESSION["this_id"]."'");
if (isset($_POST["edit_poll"])) {
$res=mysqli_fetch_array(mysqli_query($db,"SELECT id FROM polls WHERE
id='".$_POST["poll_id"]."'"));
if ($res["id"]!=0) $_SESSION["this_id"]=$_POST["poll_id"];
}
if (isset($_POST["add_poll"]) or isset($_POST["add_answer"]) or
isset($_POST["edit_poll"]) or isset($_POST["edit_question"]) or
isset($_POST["edit_answer"]) or isset($_POST["del_answer"]) or
isset($_POST["del_poll"])) {header("Location: admin_polls.php");exit;}
?>
<style type="text/css">
.forms {border:1px solid #555555;background-color:#DDDDDD;padding:10px;width:440px;}
</style>
<div class="forms"><form method="POST" action="admin_polls.php">
<b>Добавить новый опрос!</b><br>
Вопрос: <input type="text" name="new_poll" maxlength="255" size="40" required>
<input type="submit" name="add_poll" value="Добавить"></form>
<form method="POST" action="admin_polls.php"><b>Редактировать опрос №</b>
<input type="text" name="poll_id" maxlength="5" size="5" required>
<input type="submit" name="edit_poll" value="Редактировать"></form></div>
<?php
if ($_SESSION["this_id"]!='') {
$res=mysqli_fetch_array(mysqli_query($db,"SELECT id,title FROM polls WHERE
id='".$_SESSION["this_id"]."'"));
echo '<div class="forms"><b>'.$res["title"].'</b> (id='.$res["id"].')<br>';
$res=mysqli_query($db,"SELECT id,title FROM poll_answer WHERE
poll_id='".$_SESSION["this_id"]."' ORDER BY id");
while ($answer=mysqli_fetch_array($res))
echo '- '.$answer["title"].' (id='.$answer["id"].')<br>';
?>
</div>
<div class="forms"><form method="POST" action="admin_polls.php">
<b>Добавить варианты ответов к опросу:</b><br>
Ответ: <input type="text" name="new_answer" maxlength="255" size="40" required>
<input type="submit" name="add_answer" value="Добавить"></form>
<form method="POST" action="admin_polls.php"><b>Изменить ответ</b>
c id= <input type="text" name="id_answer" maxlength="4" size="4" required><br>
Ответ: <input type="text" name="text_answer" maxlength="255" size="40" required>
<input type="submit" name="edit_answer" value="Изменить"></form>
<form method="POST" action="admin_polls.php"><b>Изменить вопрос на</b><br>
<input type="text" name="text_question" maxlength="255" size="47" required>
<input type="submit" name="edit_question" value="Изменить"></form>
<form method="POST" action="admin_polls.php"><b>Удалить ответ</b>
c id= <input type="text" name="del_answer_id" maxlength="4" size="4" required>
<input type="submit" name="del_answer" value="Удалить"></form>
<form method="POST" action="admin_polls.php">
<input type="submit" name="del_poll" value="Удалить текущий опрос">
<input type="submit" name="end_poll" value="Закончить редактирование">
</form></div>
<?php
}
?>[/CODEBOX]
Пусть размер приведенного кода в данной теме Вас не пугает, т.к. это все-таки код для трех разных файлов, выполняющих разные функции. Если же Вы все сделали так, как написано в данной теме, то у Вас должна получиться страничка для проведения опросов на PHP и MySQL.