Скрипт голосования на PHP

26 мая 2020 - Администратор

Скрипт голосования на PHP

В этой статье мы разберём, как на PHP написать скрипт голосования. В нашем PHP скрипте для голосования на веб сайте будут реализованы следующие функции:  Ввод ответов через HTML форму с использованием элемента переключателя radiobutton, визуализация ответа в виде прямоугольной диаграммы с помощью графических функций в PHP, защита  от накруток с помощью организации механизма сессии в PHP.
Структура и алгоритм PHP скрипта голосования с защитой от накруток
Перед началом разработки скрипта голосования, создайте базу данных votes_db и в ней таблицу votes. со следующими полями: ID,v1,v2,v3. Права к базе данных: логин root, пароль root. Подробно о работе с PhpMyAdmin
 таблица в phpmyadmin для голосования
HTML форма для голосования с вопросом и тремя вариантами ответа. Как пример, мы спрашиваем "Сколько вам лет?" и представляем варианты ответа. Разумеется, вы можете вставить свои вопросы и варианты ответа. Подробнее о работе с HTML формами 
Организуем сессию и создаём переменную сессии для подсчёта количества раз голосования, чтобы избежать накруток.
Считываем из базы данных результаты голосования
Визуализируем результаты голосования в виде прямоугольной диаграммы. Подробнее о диаграммах в PHP
Обработка формы. Проверяем с помощью переменной сессии, голосовал ли посетитель сайта. Если не голосовал, то записываем результат его голосования в таблицу базы данных. 
Подробно разберём скрипт голосования на PHP
Для корректности работы сессии в PHP, желательно код PHP вынести в начало скрипта, а HTML код формы - в конец скрипта. Начнём с HTML формы. В HTML форме размещён вопрос "Сколько вам лет?", 3 варианта ответа при помощи radiobutton: "Меньше 18", "18-45", "Больше 45" и кнопка отправки
<p><h1>Голосование</h1></p>
<form method="post">
Сколько вам лет?
<p><input type="radio" name="rb" value="1">Меньше 18</p>
<p><input type="radio" name="rb" value="2">18-45</p>
<p><input type="radio" name="rb" value="3">Больше 45</p>
<input type="submit" name="formSubmit" value="Submit" />
</form>

Запускаем сессию и вводим переменную счётчика 
session_start();
if (!isset($_SESSION['counter'])) $_SESSION['counter']=0;

Организуем подключение к базе данных MySQLi votes_db. Проверяем корректность подключения к базе данных MySQLi. Поробно о работе с базами данных в PHP
$mysqli = new mysqli("localhost", "root", "root", "votes_db");
if ($mysqli->connect_errno) {
echo "Извините, возникла проблема на сайте";
echo "Ошибка: Не удалось создать соединение с базой данных MySQL по данной причине: ";
echo "Номер ошибки: " . $mysqli->connect_errno . " ";
echo "Ошибка: " . $mysqli->connect_error . " ";
exit;
}

Создаём запрос на считывание информации из таблицы votes базы данных votes_db
$query = "SELECT * FROM votes WHERE 1";
Выполняем запрос к базе данных
$result = $mysqli->query($query);
Записываем значения из таблицы базы данных в переменные 
while ($row = $result->fetch_assoc()) {
$k1= $row["v1"];
$k2= $row["v2"];
$k3= $row["v3"];
}

Создаём изображение и закрашиваем задний фон. Подробно о работе с изображениями в PHP
$image = imagecreatetruecolor(500, 500);
$bg = imagecolorallocate($image, 200, 200, 200);
imagefill($image, 0, 0, $bg);

Чтобы диаграммы не выходили за рамки графического поля, задаём нормировочные коэффициенты size. Также необходимо,  чтобы цвета не выходили за рамки палитры(максимум - 255). Задаём нормировочные коэффициенты col. Проверяем, чтобы значения не выходили за границы. Подробнее о работе с диаграммами в PHP
$col1=$k1*5;
$col2=$k2*5;
$col3=$k3*5;
$size1=$k1*10;
$size2=$k2*10;
$size3=$k3*10;
if ($k1>45) $size1=450;
if ($k2>45) $size2=450;
if ($k3>45) $size3=450;
if ($k1>50) $col1=255;
if ($k2>50) $col2=255;
if ($k3>50) $col3=255;

Задаём цвета прямоугольников  диаграммы
$col_rectangle1 = imagecolorallocate($image, 255-$col1, 255, 255);
$col_rectangle2 = imagecolorallocate($image, 255-$col2, 255, 255);
$col_rectangle3 = imagecolorallocate($image, 255-$col3, 255, 255);
$col_text = imagecolorallocate($image, 0, 0, 0);

Создаём прямоугольники диаграммы и ориентировочные надписи.
imagefilledrectangle ($image , 10 , 490 , 160 , 490-$size1 ,$col_rectangle1);
imagefilledrectangle ($image , 170 , 490 , 320 , 490-$size2 ,$col_rectangle2);
imagefilledrectangle ($image , 330 , 490 , 480 , 490-$size3 ,$col_rectangle3);
imagestring ($image , 4 , 85 , 485 ,'<18' , $col_text );
imagestring ($image , 4 , 245 , 485 ,'18-45' , $col_text );
imagestring ($image , 4 , 405 , 485 ,'>45' , $col_text );
imagestring ($image , 5 , 85 , 470 , $k1, $col_text );
imagestring ($image , 5 , 245 , 470 , $k2, $col_text );
imagestring ($image , 5 , 405 , 470 , $k3, $col_text );

Сохраняем изображение и освобождаем память
imagepng($image, './1.png');
imagedestroy($image);

Обрабатываем HTML форму голосования. Если пользователь уже проголосовал, не допускаем повторных попыток. Выводим сообщение об этом. Параметры голосования не меняются. 
if((isset($_POST['formSubmit'])) && ($_SESSION['counter']==1)) {
echo "Вы уже проголосовали"; 
}

Если пользователь не голосовал, то увеличиваем переменную сессии, отвечающую за счётчик голосования и в зависимости от результата голосования, увеличим на 1 соответствующее значение поля голосования.
if((isset($_POST['formSubmit'])) && ($_SESSION['counter']==0)) {
$_SESSION['counter']=1;
$ansform=$_POST['rb'];
if ($ansform==1) {
$k1= $k1+1;
}
if ($ansform==2) {
$k2= $k2+1;
}
if ($ansform==3) {
$k3= $k3+1;
}

Создаём запрос на изменение таблицы базы данных
$query = "UPDATE votes SET v1=$k1,v2=$k2,v3=$k3 WHERE 1";
Выполняем запрос к базе данных
$result = $mysqli->query($query);
Если не получилось выполнить запрос, выводим информацию об ошибке
if(!$result)
{
die('Error : ('. $mysqli->errno .') '. $mysqli->error);
}

Закрываем подключение с базой данных MySQLi
$mysqli->close();
Обновляем страницу
echo("<meta http-equiv='refresh' content='1'>");
Полный код PHP скрипта голосования с защитой от накруток и графической визуализацией результатов в виде прямоугольной диаграммы
<?php
session_start();
if (!isset($_SESSION['counter'])) $_SESSION['counter']=0;
$mysqli = new mysqli("localhost", "root", "root", "votes_db");
if ($mysqli->connect_errno) {
echo "Извините, возникла проблема на сайте";
echo "Ошибка: Не удалось создать соединение с базой данных MySQL по данной причине: ";
echo "Номер ошибки: " . $mysqli->connect_errno . " ";
echo "Ошибка: " . $mysqli->connect_error . " ";
exit;
}
$query = "SELECT * FROM votes WHERE 1";
$result = $mysqli->query($query);
while ($row = $result->fetch_assoc()) {
$k1= $row["v1"];
$k2= $row["v2"];
$k3= $row["v3"];
}
if((isset($_POST['formSubmit'])) && ($_SESSION['counter']==1)) {
echo "Вы уже проголосовали"; 
}
if((isset($_POST['formSubmit'])) && ($_SESSION['counter']==0)) {
$_SESSION['counter']=1;
$ansform=$_POST['rb'];
if ($ansform==1) {
$k1= $k1+1;
}
if ($ansform==2) {
$k2= $k2+1;
}
if ($ansform==3) {
$k3= $k3+1;
}
$query = "UPDATE votes SET v1=$k1,v2=$k2,v3=$k3 WHERE 1"; 
$result = $mysqli->query($query); 
if(!$result)
{
die('Error : ('. $mysqli->errno .') '. $mysqli->error);
}
$mysqli->close();
echo("<meta http-equiv='refresh' content='1'>");
}
$image = imagecreatetruecolor(500, 500);
$bg = imagecolorallocate($image, 200, 200, 200);
imagefill($image, 0, 0, $bg);
$col1=$k1*5;
$col2=$k2*5;
$col3=$k3*5;
$size1=$k1*10;
$size2=$k2*10;
$size3=$k3*10;
if ($k1>45) $size1=450;
if ($k2>45) $size2=450;
if ($k3>45) $size3=450;
if ($k1>50) $col1=255;
if ($k2>50) $col2=255;
if ($k3>50) $col3=255;
$col_rectangle1 = imagecolorallocate($image, 255-$col1, 255, 255);
$col_rectangle2 = imagecolorallocate($image, 255-$col2, 255, 255);
$col_rectangle3 = imagecolorallocate($image, 255-$col3, 255, 255);
$col_text = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle ($image , 10 , 490 , 160 , 490-$size1 ,$col_rectangle1);
imagefilledrectangle ($image , 170 , 490 , 320 , 490-$size2 ,$col_rectangle2);
imagefilledrectangle ($image , 330 , 490 , 480 , 490-$size3 ,$col_rectangle3);
imagestring ($image , 4 , 85 , 485 ,'<18' , $col_text );
imagestring ($image , 4 , 245 , 485 ,'18-45' , $col_text );
imagestring ($image , 4 , 405 , 485 ,'>45' , $col_text );
imagestring ($image , 5 , 85 , 470 , $k1, $col_text );
imagestring ($image , 5 , 245 , 470 , $k2, $col_text );
imagestring ($image , 5 , 405 , 470 , $k3, $col_text );
imagepng($image, './1.png');
imagedestroy($image);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Голосование</title>
</head>
<body>
<p><h1>Голосование</h1></p>
<form method="post">
Сколько вам лет?
<p><input type="radio" name="rb" value="1">Меньше 18</p>
<p><input type="radio" name="rb" value="2">18-45</p>
<p><input type="radio" name="rb" value="3">Больше 45</p>
<input type="submit" name="formSubmit" value="Submit" />
</form>
<p><hr>Результаты голосования </p>
<p><img src="1.png" width="500" height="500" alt="chart" ></p>
</body>
</html>

Пример работы PHP скрипта голосования
 скрипт голосования на php
При повторном голосовании будет выведено сообщение о том что пользователь уже голосовал и результаты голосвания не изменятся
Вернуться к курсу по PHP      Перейти к теме Работа с файлами в PHP >>

Полезно : Регистрация домена и размещение сайта на хостинге

Поделиться 

 
 
Комментарии (0)

Нет комментариев. Ваш будет первым!